mirror of
https://github.com/phil-opp/blog_os.git
synced 2025-12-16 14:27:49 +00:00
Split code example into individual match cases; add code for example
This commit is contained in:
@@ -387,62 +387,67 @@ TODO
|
||||
|
||||
|
||||
```rust
|
||||
impl Future for ExampleStateMachine {
|
||||
type Output = String; // return type of `example`
|
||||
|
||||
fn poll(self: Pin<&mut Self>, cx: &mut Context) -> Poll<Self::Output> {
|
||||
loop {
|
||||
match self { // TODO: handle pinning
|
||||
ExampleStateMachine::Start(state) => {
|
||||
// from body of `example`
|
||||
let foo_txt_future = async_read_file("foo.txt");
|
||||
// `.await` operation
|
||||
let state = WaitingOnFooTxtState {
|
||||
min_len: state.min_len,
|
||||
foo_txt_future,
|
||||
};
|
||||
*self = ExampleStateMachine::WaitingOnFooTxt(state);
|
||||
}
|
||||
ExampleStateMachine::WaitingOnFooTxt(state) => {
|
||||
match state.foo_txt_future.poll(cx) {
|
||||
Poll::Pending => return Poll::Pending,
|
||||
Poll::Ready(content) => {
|
||||
// from body of `example`
|
||||
if content.len() < state.min_len {
|
||||
let bar_txt_future = async_read_file("bar.txt");
|
||||
// `.await` operation
|
||||
let state = WaitingOnBarTxtState {
|
||||
content,
|
||||
bar_txt_future,
|
||||
};
|
||||
*self = ExampleStateMachine::WaitingOnBarTxt(state);
|
||||
} else {
|
||||
*self = ExampleStateMachine::End(EndState));
|
||||
return Poll::Ready(content);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
ExampleStateMachine::WaitingOnFooTxt(state) => {
|
||||
match state.bar_txt_future.poll(cx) {
|
||||
match state.bar_txt_future.poll(cx) {
|
||||
Poll::Pending => return Poll::Pending,
|
||||
Poll::Ready(bar_txt) => {
|
||||
*self = ExampleStateMachine::End(EndState));
|
||||
// from body of `example`
|
||||
return Poll::Ready(state.content + &bar_txt);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
ExampleStateMachine::End(_) => {
|
||||
panic!("poll called after Poll::Ready was returned");
|
||||
}
|
||||
ExampleStateMachine::Start(state) => {
|
||||
// from body of `example`
|
||||
let foo_txt_future = async_read_file("foo.txt");
|
||||
// `.await` operation
|
||||
let state = WaitingOnFooTxtState {
|
||||
min_len: state.min_len,
|
||||
foo_txt_future,
|
||||
};
|
||||
*self = ExampleStateMachine::WaitingOnFooTxt(state);
|
||||
}
|
||||
```
|
||||
```rust
|
||||
ExampleStateMachine::WaitingOnFooTxt(state) => {
|
||||
match state.foo_txt_future.poll(cx) {
|
||||
Poll::Pending => return Poll::Pending,
|
||||
Poll::Ready(content) => {
|
||||
// from body of `example`
|
||||
if content.len() < state.min_len {
|
||||
let bar_txt_future = async_read_file("bar.txt");
|
||||
// `.await` operation
|
||||
let state = WaitingOnBarTxtState {
|
||||
content,
|
||||
bar_txt_future,
|
||||
};
|
||||
*self = ExampleStateMachine::WaitingOnBarTxt(state);
|
||||
} else {
|
||||
*self = ExampleStateMachine::End(EndState));
|
||||
return Poll::Ready(content);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
```rust
|
||||
ExampleStateMachine::WaitingOnFooTxt(state) => {
|
||||
match state.bar_txt_future.poll(cx) {
|
||||
match state.bar_txt_future.poll(cx) {
|
||||
Poll::Pending => return Poll::Pending,
|
||||
Poll::Ready(bar_txt) => {
|
||||
*self = ExampleStateMachine::End(EndState));
|
||||
// from body of `example`
|
||||
return Poll::Ready(state.content + &bar_txt);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
```rust
|
||||
ExampleStateMachine::End(_) => {
|
||||
panic!("poll called after Poll::Ready was returned");
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
```rust
|
||||
fn example(min_len: usize) -> ExampleStateMachine {
|
||||
ExampleStateMachine::Start(StartState {
|
||||
min_len,
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
### Pinning
|
||||
|
||||
|
||||
Reference in New Issue
Block a user