0 Tage Serie
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.