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,
}
}
}
|