diff --git a/taskchampion/src/task/status.rs b/taskchampion/src/task/status.rs index 958fbc1c1..2b2afb6ba 100644 --- a/taskchampion/src/task/status.rs +++ b/taskchampion/src/task/status.rs @@ -1,9 +1,14 @@ -/// The status of a task. The default status in "Pending". +/// The status of a task, as defined by the task data model. #[derive(Debug, PartialEq, Clone, strum_macros::Display)] pub enum Status { Pending, Completed, Deleted, + /// Unknown signifies a status in the task DB that was not + /// recognized. This supports forward-compatibility if a + /// new status is added. Tasks with unknown status should + /// be ignored (but not deleted). + Unknown(String), } impl Status { @@ -14,7 +19,7 @@ impl Status { "pending" => Status::Pending, "completed" => Status::Completed, "deleted" => Status::Deleted, - _ => Status::Pending, + v => Status::Unknown(v.to_string()), } } @@ -24,6 +29,7 @@ impl Status { Status::Pending => "pending", Status::Completed => "completed", Status::Deleted => "deleted", + Status::Unknown(v) => v.as_ref(), } } } @@ -38,6 +44,7 @@ mod test { assert_eq!(Status::Pending.to_taskmap(), "pending"); assert_eq!(Status::Completed.to_taskmap(), "completed"); assert_eq!(Status::Deleted.to_taskmap(), "deleted"); + assert_eq!(Status::Unknown("wishful".into()).to_taskmap(), "wishful"); } #[test] @@ -45,7 +52,10 @@ mod test { assert_eq!(Status::from_taskmap("pending"), Status::Pending); assert_eq!(Status::from_taskmap("completed"), Status::Completed); assert_eq!(Status::from_taskmap("deleted"), Status::Deleted); - assert_eq!(Status::from_taskmap("something-else"), Status::Pending); + assert_eq!( + Status::from_taskmap("something-else"), + Status::Unknown("something-else".into()) + ); } #[test] @@ -53,5 +63,6 @@ mod test { assert_eq!(format!("{}", Status::Pending), "Pending"); assert_eq!(format!("{}", Status::Completed), "Completed"); assert_eq!(format!("{}", Status::Deleted), "Deleted"); + assert_eq!(format!("{}", Status::Unknown("wishful".into())), "Unknown"); } }