diff options
author | Adam Carpenter <53hornet@gmail.com> | 2019-03-27 15:32:37 -0400 |
---|---|---|
committer | Adam Carpenter <53hornet@gmail.com> | 2019-03-27 15:32:37 -0400 |
commit | 67cdcc2e12118becb823e20a40cc2687f2b8425a (patch) | |
tree | ed92c3234b89079e6d4cf36f5e80c5ffa79def48 /rust-book/blog/src | |
parent | e25482fca375d318a39c3b54db396b0db6e0b263 (diff) | |
download | learning-rust-67cdcc2e12118becb823e20a40cc2687f2b8425a.tar.xz learning-rust-67cdcc2e12118becb823e20a40cc2687f2b8425a.zip |
Started Rust in Action MEAP.
Diffstat (limited to 'rust-book/blog/src')
-rwxr-xr-x | rust-book/blog/src/lib.rs | 127 | ||||
-rwxr-xr-x | rust-book/blog/src/main.rs | 36 |
2 files changed, 163 insertions, 0 deletions
diff --git a/rust-book/blog/src/lib.rs b/rust-book/blog/src/lib.rs new file mode 100755 index 0000000..8436a36 --- /dev/null +++ b/rust-book/blog/src/lib.rs @@ -0,0 +1,127 @@ +//pub struct Post { +// state: Option<Box<dyn State>>, +// content: String, +//} +// +//impl Post { +// 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 { +// self.state.as_ref().unwrap().content(&self) +// } +// +// pub fn request_review(&mut self) { +// if let Some(s) = self.state.take() { +// 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>; +// fn content<'a>(&self, post: &'a Post) -> &'a str { +// "" +// } +//} +// +//struct Draft {} +// +//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 {} +// +//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 +// } +// +// fn content<'a>(&self, post: &'a Post) -> &'a str { +// &post.content +// } +//} + + + +pub struct Post { + content: String, +} + +pub struct DraftPost { + content: String, +} + +pub struct PendingReviewPost { + content: String, +} + +impl Post { + pub fn new() -> DraftPost { + DraftPost { + content: String::new(), + } + } + + pub fn content(&self) -> &str { + &self.content + } +} + +impl DraftPost { + pub fn add_text(&mut self, text: &str) { + self.content.push_str(text); + } + + pub fn request_review(self) -> PendingReviewPost { + PendingReviewPost { + content: self.content, + } + } +} + +impl PendingReviewPost { + pub fn approve(self) -> Post { + Post { + content: self.content, + } + } +} diff --git a/rust-book/blog/src/main.rs b/rust-book/blog/src/main.rs new file mode 100755 index 0000000..c976cd9 --- /dev/null +++ b/rust-book/blog/src/main.rs @@ -0,0 +1,36 @@ +use blog::Post; + +fn main() { +// let mut post = Post::new(); +// +// post.add_text("salad"); +// assert_eq!("", post.content()); +// +// post.request_review(); +// assert_eq!("", post.content()); +// +// post.approve(); +// assert_eq!("salad", post.content()); + + + +// let mut post = Post::new(); +// post.add_text("salad"); +// assert_eq!("", post.content()); + + + + let mut post = Post::new(); + + post.add_text("salad"); + let post = post.request_review(); + let post = post.approve(); + + assert_eq!("salad", post.content()); + + + + + + println!("Done."); +} |