diff --git a/blog/src/lib.rs b/blog/src/lib.rs index 0a3a4b3..9997513 100644 --- a/blog/src/lib.rs +++ b/blog/src/lib.rs @@ -24,10 +24,17 @@ impl Post { self.state = Some(s.request_review()) } } + + 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 {} @@ -36,6 +43,10 @@ impl State for Draft { fn request_review(self: Box<Self>) -> Box<dyn State> { Box::new(PendingReview {}) } + + fn approve(self: Box<Self>) -> Box<dyn State> { + self + } } struct PendingReview {} @@ -44,4 +55,20 @@ impl State for PendingReview { fn request_review(self: Box<Self>) -> Box<dyn State> { self } + + 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 + } }