| pub struct Post { |
| state: Option<Box<dyn State>>, |
| content: String, |
| } |
| |
| // ANCHOR: here |
| impl Post { |
| // --snip-- |
| // ANCHOR_END: here |
| pub fn new() -> Post { |
| Post { |
| state: Some(Box::new(Draft {})), |
| content: String::new(), |
| } |
| } |
| |
| pub fn add_text(&mut self, text: &str) { |
| self.content.push_str(text); |
| } |
| |
| pub fn content(&self) -> &str { |
| "" |
| } |
| |
| pub fn request_review(&mut self) { |
| if let Some(s) = self.state.take() { |
| self.state = Some(s.request_review()) |
| } |
| } |
| |
| // ANCHOR: here |
| pub fn approve(&mut self) { |
| if let Some(s) = self.state.take() { |
| self.state = Some(s.approve()) |
| } |
| } |
| } |
| |
| trait State { |
| fn request_review(self: Box<Self>) -> Box<dyn State>; |
| fn approve(self: Box<Self>) -> Box<dyn State>; |
| } |
| |
| struct Draft {} |
| |
| impl State for Draft { |
| // --snip-- |
| // ANCHOR_END: here |
| fn request_review(self: Box<Self>) -> Box<dyn State> { |
| Box::new(PendingReview {}) |
| } |
| |
| // ANCHOR: here |
| fn approve(self: Box<Self>) -> Box<dyn State> { |
| self |
| } |
| } |
| |
| struct PendingReview {} |
| |
| impl State for PendingReview { |
| // --snip-- |
| // ANCHOR_END: here |
| fn request_review(self: Box<Self>) -> Box<dyn State> { |
| self |
| } |
| |
| // ANCHOR: here |
| fn approve(self: Box<Self>) -> Box<dyn State> { |
| Box::new(Published {}) |
| } |
| } |
| |
| struct Published {} |
| |
| impl State for Published { |
| fn request_review(self: Box<Self>) -> Box<dyn State> { |
| self |
| } |
| |
| fn approve(self: Box<Self>) -> Box<dyn State> { |
| self |
| } |
| } |
| // ANCHOR_END: here |