diff options
Diffstat (limited to 'blog')
-rw-r--r-- | blog/Cargo.toml | 7 | ||||
-rw-r--r-- | blog/src/lib.rs | 127 | ||||
-rw-r--r-- | blog/src/main.rs | 36 |
3 files changed, 170 insertions, 0 deletions
diff --git a/blog/Cargo.toml b/blog/Cargo.toml new file mode 100644 index 0000000..0f971d3 --- /dev/null +++ b/blog/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "blog" +version = "0.1.0" +authors = ["Adam Carpenter <53hornet@gmail.com>"] +edition = "2018" + +[dependencies] diff --git a/blog/src/lib.rs b/blog/src/lib.rs new file mode 100644 index 0000000..8436a36 --- /dev/null +++ b/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/blog/src/main.rs b/blog/src/main.rs new file mode 100644 index 0000000..c976cd9 --- /dev/null +++ b/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."); +} |