about summary refs log tree commit diff
path: root/finito-postgres/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'finito-postgres/src/lib.rs')
-rw-r--r--finito-postgres/src/lib.rs35
1 files changed, 24 insertions, 11 deletions
diff --git a/finito-postgres/src/lib.rs b/finito-postgres/src/lib.rs
index af801314298f..ffb2532e55cc 100644
--- a/finito-postgres/src/lib.rs
+++ b/finito-postgres/src/lib.rs
@@ -110,10 +110,9 @@ struct ActionT {
     /// Current status of the action.
     status: ActionStatus,
 
-    /// Serialised error representation, if an error occured during
-    /// processing. TODO: Use some actual error type. Maybe failure
-    /// has serialisation support?
-    error: Option<Value>,
+    /// Detailed (i.e. Debug-trait formatted) error message, if an
+    /// error occured during action processing.
+    error: Option<String>,
 }
 
 // The following functions implement the public interface of
@@ -292,7 +291,7 @@ fn get_action<C, S>(conn: &C, id: Uuid) -> Result<(ActionStatus, S::Action)> whe
 fn update_action_status<C, S>(conn: &C,
                               id: Uuid,
                               status: ActionStatus,
-                              error: Option<Value>,
+                              error: Option<String>,
                               _fsm: PhantomData<S>) -> Result<()> where
     C: GenericConnection,
     S: FSM {
@@ -371,12 +370,26 @@ fn run_action<S>(tx: Transaction, id: Uuid, _fsm: PhantomData<S>)
 
     let result = match status {
         ActionStatus::Pending => {
-            let events = <S as FSM>::act(action);
-            update_action_status(
-                &tx, id, ActionStatus::Completed, None, PhantomData::<S>
-            )?;
-
-            events
+            match <S as FSM>::act(action) {
+                // If the action succeeded, update its status to
+                // completed and return the created events.
+                Ok(events) => {
+                    update_action_status(
+                        &tx, id, ActionStatus::Completed, None, PhantomData::<S>
+                    )?;
+                    events
+                },
+
+                // If the action failed, persist the debug message and
+                // return nothing.
+                Err(err) => {
+                    let msg = Some(format!("{:?}", err));
+                    update_action_status(
+                        &tx, id, ActionStatus::Failed, msg, PhantomData::<S>
+                    )?;
+                    vec![]
+                },
+            }
         },
 
         _ => {