rust / expert
Snippet
Manuelles Polling-Muster für Asynchrone Streams
Das Erstellen streamähnlicher Primitiven in Standard-Rust ohne futures-Crate erfordert die Rückgabe von Poll<Result<T, E>>, um Bereitschaft und Status manuell auszudrücken.
snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
use std::task::{Context, Poll};pub struct RingStream<T> {buffer: Vec<T>,cursor: usize,}impl<T: Clone> RingStream<T> {pub fn new(items: Vec<T>) -> Self {Self { buffer: items, cursor: 0 }}pub fn poll_next_item(&mut self, _cx: &mut Context<'_>) -> Poll<Result<T, &'static str>> {if self.buffer.is_empty() {Poll::Ready(Err("Stream source buffer is empty"))} else {let item = self.buffer[self.cursor].clone();self.cursor = (self.cursor + 1) % self.buffer.len();Poll::Ready(Ok(item))}}}
Erklärung
1
pub struct RingStream<T> {
Kapselt einen zyklischen Elemente-Puffer mit internem Lese-Cursorzustand.
2
pub fn poll_next_item(&mut self, _cx: &mut Context<'_>) -> Poll<Result<T, &'static str>>
Definiert eigene Poll-Methode, die ein Poll-Enum mit Result-Nutzlast zurückgibt.
3
if self.buffer.is_empty() {
Bewertet Puffer-Gültigkeit und gibt Ready-Fehlerstatus zurück, falls keine Daten erzeugt werden können.
4
self.cursor = (self.cursor + 1) % self.buffer.len();
Rückt die Cursor-Position innerhalb fixer zirkulärer Grenzen vor.