rust / expert
Snippet
Konstruieren eines asynchronen Stream-Iterators über direkte Poll-Methoden
Dieses Snippet erstellt ein benutzerdefiniertes, asynchrones Stream-ähnliches Trait namens AsyncProducer, das Elemente oder Fehler liefert. Es zeigt, wie man einen Producer in einen Error-Recovery-Dekorator einpackt, der Fehler während des Pollings abfängt und auf eine Standard-Wiederherstellungsnachricht ausweicht, bevor er beendet wird.
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
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
use std::pin::Pin;use std::task::{Context, Poll};pub trait AsyncProducer {type Item;type Error;fn poll_next(self: Pin<&mut Self>,cx: &mut Context<'_>,) -> Poll<Option<Result<Self::Item, Self::Error>>>;}pub struct FallbackProducer<P> {primary: P,fallback_active: bool,}impl<P> FallbackProducer<P> {pub fn new(primary: P) -> Self {Self {primary,fallback_active: false,}}}impl<P> AsyncProducer for FallbackProducer<P>whereP: AsyncProducer<Item = String> + Unpin,{type Item = String;type Error = P::Error;fn poll_next(mut self: Pin<&mut Self>,cx: &mut Context<'_>,) -> Poll<Option<Result<Self::Item, Self::Error>>>{if self.fallback_active {return Poll::Ready(None);}match Pin::new(&mut self.primary).poll_next(cx) {Poll::Ready(Some(Err(_))) => {self.fallback_active = true;Poll::Ready(Some(Ok(String::from("Recovered"))))}other => other,}}}
Erklärung
1
pub trait AsyncProducer
Deklariert ein benutzerdefiniertes asynchrones Trait, das gepinnte self-Referenzen für sicheres asynchrones Polling verwendet.
2
type Item; type Error;
Definiert assoziierte Typen für die ausgegebenen Erfolgsdaten und Fehlertypen.
3
match Pin::new(&mut self.primary).poll_next(cx)
Fragt den zugrunde liegenden primären Producer mit einer gepinnten veränderlichen Referenz ab.
4
Poll::Ready(Some(Ok(String::from("Recovered"))))
Fängt Fehler ab, um einen Ausweichwert zurückzugeben und den Zustandsautomaten auf inaktiv zu setzen.