diff options
Diffstat (limited to 'src/task.rs')
-rw-r--r-- | src/task.rs | 45 |
1 files changed, 43 insertions, 2 deletions
diff --git a/src/task.rs b/src/task.rs index 6e8459b..89d35d9 100644 --- a/src/task.rs +++ b/src/task.rs @@ -23,6 +23,7 @@ use tag::Tag; use date::Date; use annotation::Annotation; use uda::{UDA, UDAName, UDAValue}; +use urgency::Urgency; /// Task type /// @@ -107,6 +108,9 @@ pub struct Task { /// This hides the task until the wait date #[builder(default)] wait: Option<Date>, + /// This contains the urgency of the task + #[builder(default)] + urgency: Option<Urgency>, /// A map of user defined attributes #[builder(default)] @@ -143,6 +147,7 @@ impl Task { tags: Option<Vec<Tag>>, until: Option<Date>, wait: Option<Date>, + urgency: Option<Urgency>, uda: UDA, ) -> Task { Task { @@ -168,6 +173,7 @@ impl Task { tags: tags, until: until, wait: wait, + urgency: urgency, uda: uda, } } @@ -493,6 +499,24 @@ impl Task { self.until = new.map(Into::into); } + /// Get the urgency of the task + pub fn urgency(&self) -> Option<&Urgency> { + self.urgency.as_ref() + } + + /// Get the urgency of the task + pub fn urgency_mut(&mut self) -> Option<&mut Urgency> { + self.urgency.as_mut() + } + + /// Set the urgency of the task + pub fn set_urgency<T>(&mut self, new: Option<T>) + where + T: Into<Urgency>, + { + self.urgency = new.map(Into::into); + } + /// Get the wait date of the task pub fn wait(&self) -> Option<&Date> { self.wait.as_ref() @@ -580,6 +604,9 @@ impl Serialize for Task { self.wait.as_ref().map( |ref v| state.serialize_entry("wait", v), ); + self.urgency.as_ref().map( + |ref v| state.serialize_entry("urgency", v), + ); for (key, value) in self.uda().iter() { state.serialize_entry(key, value)?; @@ -617,6 +644,7 @@ impl<'de> Deserialize<'de> for Task { "tags", "until", "wait", + "urgency", "uda", ]; deserializer.deserialize_struct("Task", FIELDS, TaskDeserializeVisitor) @@ -660,6 +688,7 @@ impl<'de> Visitor<'de> for TaskDeserializeVisitor { let mut tags = None; let mut until = None; let mut wait = None; + let mut urgency = None; let mut uda = UDA::default(); loop { @@ -740,6 +769,9 @@ impl<'de> Visitor<'de> for TaskDeserializeVisitor { "wait" => { wait = Some(visitor.next_value()?); } + "urgency" => { + urgency = Some(visitor.next_value()?); + } field => { debug!("Inserting '{}' as UDA", field); @@ -792,6 +824,7 @@ impl<'de> Visitor<'de> for TaskDeserializeVisitor { tags, until, wait, + urgency, uda, ); @@ -829,7 +862,8 @@ mod test { "description": "test", "entry": "20150619T165438Z", "status": "waiting", -"uuid": "8ca953d5-18b4-4eb9-bd56-18f2e5b752f0" +"uuid": "8ca953d5-18b4-4eb9-bd56-18f2e5b752f0", +"urgency": 5.3 }"#; println!("{}", s); @@ -845,6 +879,7 @@ mod test { assert!( task.uuid().clone() == Uuid::parse_str("8ca953d5-18b4-4eb9-bd56-18f2e5b752f0").unwrap() ); + assert!(task.urgency() == Some(&5.3)); let back = serde_json::to_string(&task).unwrap(); @@ -855,6 +890,7 @@ mod test { assert!(back.contains("status")); assert!(back.contains("waiting")); assert!(back.contains("uuid")); + assert!(back.contains("urgency")); assert!(back.contains("8ca953d5-18b4-4eb9-bd56-18f2e5b752f0")); } @@ -889,6 +925,8 @@ mod test { task.uuid().clone() == Uuid::parse_str("8ca953d5-18b4-4eb9-bd56-18f2e5b752f0").unwrap() ); + assert!(task.urgency() == Some(&0.583562)); + assert!(task.modified() == Some(&mkdate("20160327T164007Z"))); assert!(task.project() == Some(&String::from("someproject"))); @@ -942,7 +980,7 @@ mod test { {"entry":"20160423T125926Z","description":"Another Annotation"}, {"entry":"20160422T125942Z","description":"A Third Anno"} ], -"urgency": 0.583562 +"urgency": -5 }"#; println!("{}", s); @@ -952,6 +990,8 @@ mod test { assert!(task.is_ok()); let task: Task = task.unwrap(); + assert!(task.urgency() == Some(&-5.0)); + let all_annotations = vec![ Annotation::new(mkdate("20160423T125911Z"), String::from("An Annotation")), @@ -1083,6 +1123,7 @@ mod test { assert!(t.project().is_some()); assert_eq!(t.project().unwrap(), "project"); assert!(t.tags().is_some()); + assert!(t.urgency().is_none()); assert_eq!( t.tags().unwrap(), &vec!["search".to_owned(), "things".to_owned()] |