This is an automated email from the ASF dual-hosted git repository.

mssun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-teaclave.git


The following commit(s) were added to refs/heads/master by this push:
     new db82016  [task] Remove task clone before saving state into db (#304)
db82016 is described below

commit db8201656e9accaf0ab76e29abfbaa52a69110e7
Author: Zhaofeng Chen <[email protected]>
AuthorDate: Tue May 19 20:32:25 2020 -0700

    [task] Remove task clone before saving state into db (#304)
---
 types/src/task_state.rs | 77 +++++++++++++++++++++++++++----------------------
 1 file changed, 42 insertions(+), 35 deletions(-)

diff --git a/types/src/task_state.rs b/types/src/task_state.rs
index 76353e8..def7de7 100644
--- a/types/src/task_state.rs
+++ b/types/src/task_state.rs
@@ -218,6 +218,7 @@ impl Task<Approve> {
         Ok(())
     }
 }
+
 impl Task<Stage> {
     pub fn new(ts: TaskState) -> Result<Self> {
         let task = Task::<Stage> {
@@ -296,46 +297,55 @@ impl Task<Done> {
     }
 }
 
-impl std::convert::TryFrom<Task<Assign>> for Task<Approve> {
+trait TryTransitionTo<T>: Sized {
+    type Error;
+    fn try_transition_to(self) -> std::result::Result<T, Error>;
+    fn ready_for_transition(&self) -> bool {
+        true
+    }
+}
+
+impl TryTransitionTo<Task<Approve>> for Task<Assign> {
     type Error = Error;
-    fn try_from(task: Task<Assign>) -> Result<Task<Approve>> {
-        ensure!(
-            task.state.all_data_assigned(),
-            "Not ready: Assign -> Approve"
-        );
-        Task::<Approve>::new(task.state)
+    fn try_transition_to(self) -> Result<Task<Approve>> {
+        ensure!(self.ready_for_transition(), "Not ready: Assign -> Approve");
+        Task::<Approve>::new(self.state)
+    }
+
+    fn ready_for_transition(&self) -> bool {
+        self.state.all_data_assigned()
     }
 }
 
-impl std::convert::TryFrom<Task<Approve>> for Task<Stage> {
+impl TryTransitionTo<Task<Stage>> for Task<Approve> {
     type Error = Error;
-    fn try_from(task: Task<Approve>) -> Result<Task<Stage>> {
-        ensure!(
-            task.state.everyone_approved(),
-            "Not ready: Apporve -> Stage"
-        );
-        Task::<Stage>::new(task.state)
+    fn try_transition_to(self) -> Result<Task<Stage>> {
+        ensure!(self.ready_for_transition(), "Not ready: Apporve -> Stage");
+        Task::<Stage>::new(self.state)
+    }
+    fn ready_for_transition(&self) -> bool {
+        self.state.everyone_approved()
     }
 }
 
-impl std::convert::TryFrom<Task<Stage>> for Task<Run> {
+impl TryTransitionTo<Task<Run>> for Task<Stage> {
     type Error = Error;
-    fn try_from(task: Task<Stage>) -> Result<Task<Run>> {
-        Task::<Run>::new(task.state)
+    fn try_transition_to(self) -> Result<Task<Run>> {
+        Task::<Run>::new(self.state)
     }
 }
 
-impl std::convert::TryFrom<Task<Run>> for Task<Finish> {
+impl TryTransitionTo<Task<Finish>> for Task<Run> {
     type Error = Error;
-    fn try_from(task: Task<Run>) -> Result<Task<Finish>> {
-        Task::<Finish>::new(task.state)
+    fn try_transition_to(self) -> Result<Task<Finish>> {
+        Task::<Finish>::new(self.state)
     }
 }
 
-impl std::convert::TryFrom<Task<Finish>> for Task<Done> {
+impl TryTransitionTo<Task<Done>> for Task<Finish> {
     type Error = Error;
-    fn try_from(task: Task<Finish>) -> Result<Task<Done>> {
-        Task::<Done>::new(task.state)
+    fn try_transition_to(self) -> Result<Task<Done>> {
+        Task::<Done>::new(self.state)
     }
 }
 
@@ -358,7 +368,7 @@ impl std::convert::TryFrom<TaskState> for Task<Approve> {
         let task = match ts.status {
             TaskStatus::Created => {
                 let task: Task<Assign> = ts.try_into()?;
-                task.try_into()?
+                task.try_transition_to()?
             }
             TaskStatus::DataAssigned => Task::<Approve>::new(ts)?,
             _ => bail!("Cannot restore to Approve from saved state"),
@@ -374,7 +384,7 @@ impl std::convert::TryFrom<TaskState> for Task<Stage> {
         let task = match ts.status {
             TaskStatus::Created | TaskStatus::DataAssigned => {
                 let task: Task<Approve> = ts.try_into()?;
-                task.try_into()?
+                task.try_transition_to()?
             }
             TaskStatus::Approved => Task::<Stage>::new(ts)?,
             _ => bail!("Cannot restore to Stage from saved state"),
@@ -425,17 +435,14 @@ macro_rules! impl_transit_and_into_task_state {
     ( $cur:ty => $next:ty ) => {
         impl std::convert::From<Task<$cur>> for TaskState {
             fn from(mut task: Task<$cur>) -> TaskState {
-                let nt: Result<Task<$next>> = task.clone().try_into();
-                match nt {
-                    Ok(mut t) => {
-                        t.state.status = t.extra.into();
-                        t.state
-                    }
-                    Err(_) => {
-                        task.state.status = task.extra.into();
-                        task.state
-                    }
+                if <Task<$cur> as 
TryTransitionTo<Task<$next>>>::ready_for_transition(&task) {
+                    // We assume that if it's ready for transistion, the 
result is always Ok.
+                    let mut nt: Task<$next> = 
task.try_transition_to().unwrap();
+                    nt.state.status = nt.extra.into();
+                    return nt.state;
                 }
+                task.state.status = task.extra.into();
+                task.state
             }
         }
     };


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to