summaryrefslogtreecommitdiff
path: root/rust-book/blog/src/lib.rs
blob: 8436a3652bfa2338f1e57ac67b071bacf51dbbb1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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,
        }
    }
}