From e5ecba3fa3605524e2858365f8524da78bf8773c Mon Sep 17 00:00:00 2001 From: Dheepak Krishnamurthy Date: Sat, 24 Oct 2020 13:01:07 -0600 Subject: Add urgency to task --- examples/create_task.rs | 1 + src/lib.rs | 1 + src/task.rs | 30 ++++++++++++++++++++++++++++++ src/urgency.rs | 10 ++++++++++ 4 files changed, 42 insertions(+) create mode 100644 src/urgency.rs diff --git a/examples/create_task.rs b/examples/create_task.rs index c79d417..91082cb 100644 --- a/examples/create_task.rs +++ b/examples/create_task.rs @@ -36,6 +36,7 @@ fn main() { None, None, None, + None, UDA::default(), ); println!("[{}]", to_string(&t).unwrap()); diff --git a/src/lib.rs b/src/lib.rs index dfe1aad..5bacf06 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -70,4 +70,5 @@ pub mod status; pub mod tag; pub mod task; pub mod uda; +pub mod urgency; pub mod tw; diff --git a/src/task.rs b/src/task.rs index 6e8459b..148d020 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, + /// This contains the urgency of the task + #[builder(default)] + urgency: Option, /// A map of user defined attributes #[builder(default)] @@ -143,6 +147,7 @@ impl Task { tags: Option>, until: Option, wait: Option, + urgency: Option, uda: UDA, ) -> Task { Task { @@ -168,6 +173,7 @@ impl Task { tags: tags, until: until, wait: wait, + urgency: urgency, uda: uda, } } @@ -493,6 +499,21 @@ 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(&mut self, new: Option) where T: Into { + 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 +601,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 +641,7 @@ impl<'de> Deserialize<'de> for Task { "tags", "until", "wait", + "urgency", "uda", ]; deserializer.deserialize_struct("Task", FIELDS, TaskDeserializeVisitor) @@ -660,6 +685,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 +766,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 +821,7 @@ impl<'de> Visitor<'de> for TaskDeserializeVisitor { tags, until, wait, + urgency, uda, ); diff --git a/src/urgency.rs b/src/urgency.rs new file mode 100644 index 0000000..b59d7ce --- /dev/null +++ b/src/urgency.rs @@ -0,0 +1,10 @@ +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. +// + +//! Module containing `Urgency` type + +/// type definition for Urgency +pub type Urgency = f64; -- cgit v1.2.3 From b583ec1a91a7544aa10749d066d3d97993c57d02 Mon Sep 17 00:00:00 2001 From: Dheepak Krishnamurthy Date: Sat, 24 Oct 2020 13:08:26 -0600 Subject: Add tests for urgency --- src/task.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/task.rs b/src/task.rs index 148d020..f9dd0b6 100644 --- a/src/task.rs +++ b/src/task.rs @@ -859,7 +859,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); @@ -875,6 +876,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(); @@ -885,6 +887,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")); } @@ -919,6 +922,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"))); @@ -972,7 +977,7 @@ mod test { {"entry":"20160423T125926Z","description":"Another Annotation"}, {"entry":"20160422T125942Z","description":"A Third Anno"} ], -"urgency": 0.583562 +"urgency": -5 }"#; println!("{}", s); @@ -982,6 +987,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")), @@ -1113,6 +1120,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()] -- cgit v1.2.3 From 06777f6aa1ea90f9e7f0d335f804985f54d08e86 Mon Sep 17 00:00:00 2001 From: Dheepak Krishnamurthy Date: Sat, 24 Oct 2020 16:22:57 -0600 Subject: Fix where syntax --- src/task.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/task.rs b/src/task.rs index f9dd0b6..89d35d9 100644 --- a/src/task.rs +++ b/src/task.rs @@ -510,7 +510,10 @@ impl Task { } /// Set the urgency of the task - pub fn set_urgency(&mut self, new: Option) where T: Into { + pub fn set_urgency(&mut self, new: Option) + where + T: Into, + { self.urgency = new.map(Into::into); } -- cgit v1.2.3