diff options
Diffstat (limited to 'rust-book/blog')
| -rwxr-xr-x | rust-book/blog/Cargo.lock | 4 | ||||
| -rwxr-xr-x | rust-book/blog/Cargo.toml | 7 | ||||
| -rwxr-xr-x | rust-book/blog/src/lib.rs | 127 | ||||
| -rwxr-xr-x | rust-book/blog/src/main.rs | 36 | 
4 files changed, 174 insertions, 0 deletions
diff --git a/rust-book/blog/Cargo.lock b/rust-book/blog/Cargo.lock new file mode 100755 index 0000000..8e79386 --- /dev/null +++ b/rust-book/blog/Cargo.lock @@ -0,0 +1,4 @@ +[[package]] +name = "blog" +version = "0.1.0" + diff --git a/rust-book/blog/Cargo.toml b/rust-book/blog/Cargo.toml new file mode 100755 index 0000000..0f971d3 --- /dev/null +++ b/rust-book/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/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."); +}  |