pub struct Post {
    state: Option<Box<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 {
        ""
    }

    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<State>;
    fn approve(self: Box<Self>) -> Box<State>;
}

struct Draft {}

impl State for Draft {
    fn request_review(self: Box<Self>) -> Box<State> {
        Box::new(PendingReview {})
    }

    fn approve(self: Box<Self>) -> Box<State> {
        self
    }
}

struct PendingReview {}

impl State for PendingReview {
    fn request_review(&self: Box<Self>) -> Box<State> {
        self
    }

    fn approve(self: Box<Self>) -> Box<State> {
        Box::new(Published {})
    }
}

struct Published {}

impl State for Published {
    fn request_review(&self: Box<Self>) -> Box<State> {
        self
    }

    fn approve(&self: Box<Self>) -> Box<State> {
        self
    }
}

pub struct Post {
    state: Option<Box<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 {
        ""
    }

    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<State>;
}

struct Draft {}

impl State for Draft {
    fn request_review(self: Box<Self>) -> Box<State> {
        Box::new(PendingReview {})
    }
}

struct PendingReview {}

impl State for PendingReview {
    fn request_review(&self: Box<Self>) -> Box<State> {
        self
    }
}

--- 
+++ 
@@ -34,6 +34,7 @@
 
 trait State {
     fn request_review(self: Box<Self>) -> Box<State>;
+    fn approve(self: Box<Self>) -> Box<State>;
 }
 
 struct Draft {}
@@ -41,6 +42,10 @@
 impl State for Draft {
     fn request_review(self: Box<Self>) -> Box<State> {
         Box::new(PendingReview {})
+    }
+
+    fn approve(self: Box<Self>) -> Box<State> {
+        self
     }
 }
 
@@ -50,4 +55,20 @@
     fn request_review(&self: Box<Self>) -> Box<State> {
         self
     }
+
+    fn approve(self: Box<Self>) -> Box<State> {
+        Box::new(Published {})
+    }
 }
+
+struct Published {}
+
+impl State for Published {
+    fn request_review(&self: Box<Self>) -> Box<State> {
+        self
+    }
+
+    fn approve(&self: Box<Self>) -> Box<State> {
+        self
+    }
+}
Implement approve for PendingReview, implement Published struct and State trait methods for that struct
