From: Martin Pitt Date: Sun, 29 Aug 2021 14:45:02 +0000 (+0200) Subject: concepts: Add alternative Post implementation with states as types X-Git-Url: https://piware.de/gitweb/?p=learn-rust.git;a=commitdiff_plain;h=d6fbfabfaf434ae365854f0587547cff3ca78dae concepts: Add alternative Post implementation with states as types --- diff --git a/concepts/src/lib.rs b/concepts/src/lib.rs index b0839ad..5f1feea 100644 --- a/concepts/src/lib.rs +++ b/concepts/src/lib.rs @@ -210,3 +210,46 @@ impl State for Published { &post.content } } + +// state encoded as types; this is the "approved" state +pub struct TPost { + content: String, +} + +impl TPost { + pub fn new() -> TPostDraft { + TPostDraft {content: String::new()} + } + + pub fn content(&self) -> &str { + &self.content + } +} + +pub struct TPostDraft { + content: String, +} + +impl TPostDraft { + pub fn add_text(&mut self, text: &str) { + self.content.push_str(text); + } + + pub fn request_review(self) -> TPostReview { + TPostReview {content: self.content} + } +} + +pub struct TPostReview { + content: String, +} + +impl TPostReview { + pub fn approve(self) -> TPost { + TPost {content: self.content} + } + + pub fn reject(self) -> TPostDraft { + TPostDraft {content: self.content} + } +} diff --git a/concepts/src/main.rs b/concepts/src/main.rs index 2082621..4b6df64 100644 --- a/concepts/src/main.rs +++ b/concepts/src/main.rs @@ -272,6 +272,17 @@ fn test_dyn_traits() { assert_eq!(text, post.content()); } +fn test_state_types() { + let mut post = TPost::new(); + post.add_text("I ate a salad for lunch"); + let post = post.request_review(); + let mut post = post.reject(); + post.add_text(" today"); + let post = post.request_review(); + let post = post.approve(); + assert_eq!(post.content(), "I ate a salad for lunch today"); +} + fn main() { test_strings(); test_vectors(); @@ -282,4 +293,5 @@ fn main() { test_iterators(); test_threads(); test_dyn_traits(); + test_state_types(); }