diff options
Diffstat (limited to 'src/task.rs')
-rw-r--r-- | src/task.rs | 286 |
1 files changed, 1 insertions, 285 deletions
diff --git a/src/task.rs b/src/task.rs index c28d8ea..bb0c19f 100644 --- a/src/task.rs +++ b/src/task.rs @@ -6,16 +6,6 @@ //! Module containing `Task` type as well as trait implementations -use std::result::Result as RResult; -use std::fmt::Formatter; -use std::fmt::Result as FmtResult; - -use serde::Serialize; -use serde::Serializer; -use serde::Deserialize; -use serde::Deserializer; -use serde::de::Visitor; -use serde::de::MapVisitor as DeserializeMapVisitor; use uuid::Uuid; use priority::TaskPriority; @@ -39,7 +29,7 @@ use annotation::Annotation; /// /// It is deserializeable and serializeable via serde_json, so importing and exporting taskwarrior /// tasks is simply serializing and deserializing objects of this type. -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Deserialize, Serialize)] pub struct Task { status : TaskStatus, uuid : Uuid, @@ -238,280 +228,6 @@ impl Task { } -impl Serialize for Task { - - fn serialize<S>(&self, serializer: S) -> RResult<S::Ok, S::Error> - where S: Serializer - { - use serde::ser::SerializeStruct; - - let mut state = try!(serializer.serialize_struct("Task", 19)); - try!(state.serialize_field("status", &self.status)); - try!(state.serialize_field("uuid", &self.uuid)); - try!(state.serialize_field("entry", &self.entry)); - try!(state.serialize_field("description", &self.description)); - try!(state.serialize_field("annotations", &self.annotations)); - try!(state.serialize_field("tags", &self.tags)); - - match self.recur { - Some(ref v) => try!(state.serialize_field("recur", v)), - None => { }, - } - match self.depends { - Some(ref v) => try!(state.serialize_field("depends", v)), - None => { }, - } - match self.due { - Some(ref v) => try!(state.serialize_field("due", v)), - None => { }, - } - match self.end { - Some(ref v) => try!(state.serialize_field("end", v)), - None => { }, - } - match self.imask { - Some(ref v) => try!(state.serialize_field("imask", v)), - None => { }, - } - match self.mask { - Some(ref v) => try!(state.serialize_field("mask", v)), - None => { }, - } - match self.modified { - Some(ref v) => try!(state.serialize_field("modified", v)), - None => { }, - } - match self.parent { - Some(ref v) => try!(state.serialize_field("parent", v)), - None => { }, - } - match self.priority { - Some(ref v) => try!(state.serialize_field("priority", v)), - None => { }, - } - match self.project { - Some(ref v) => try!(state.serialize_field("project", v)), - None => { }, - } - match self.scheduled { - Some(ref v) => try!(state.serialize_field("scheduled", v)), - None => { }, - } - match self.start { - Some(ref v) => try!(state.serialize_field("start", v)), - None => { }, - } - match self.until { - Some(ref v) => try!(state.serialize_field("until", v)), - None => { }, - } - match self.wait { - Some(ref v) => try!(state.serialize_field("wait", v)), - None => { }, - } - - state.end() - } - -} - -impl Deserialize for Task { - - fn deserialize<D>(deserializer: D) -> RResult<Task, D::Error> - where D: Deserializer - { - static FIELDS: &'static [&'static str] = &[ - "status", - "uuid", - "entry", - "description", - - "annotations", - "depends", - "due", - "end", - "imask", - "mask", - "modified", - "parent", - "priority", - "project", - "recur", - "scheduled", - "start", - "tags", - "until", - "wait" - ]; - deserializer.deserialize_struct("Task", FIELDS, TaskDeserializeVisitor) - } - -} - -/// Helper type for task deserialization -struct TaskDeserializeVisitor; - -impl Visitor for TaskDeserializeVisitor { - type Value = Task; - - fn expecting(&self, fmt: &mut Formatter) -> FmtResult { - write!(fmt, "a taskwarrior exported JSON object") - } - - fn visit_map<V>(self, mut visitor: V) -> RResult<Task, V::Error> - where V: DeserializeMapVisitor - { - use serde::de::Error; - - let mut status = None; - let mut uuid = None; - let mut entry = None; - let mut description = None; - - let mut annotations = None; - let mut depends = None; - let mut due = None; - let mut end = None; - let mut imask = None; - let mut mask = None; - let mut modified = None; - let mut parent = None; - let mut priority = None; - let mut project = None; - let mut recur = None; - let mut scheduled = None; - let mut start = None; - let mut tags = None; - let mut until = None; - let mut wait = None; - - loop { - let key : Option<String> = try!(visitor.visit_key()); - if key.is_none() { - break; - } - let key = key.unwrap(); - - match &key[..] { - "status" => { - status = Some(try!(visitor.visit_value())); - }, - "uuid" => { - uuid = Some(try!(visitor.visit_value())); - }, - "entry" => { - entry = Some(try!(visitor.visit_value())); - }, - "description" => { - description = Some(try!(visitor.visit_value())); - }, - - "annotations" => { - annotations = Some(try!(visitor.visit_value())); - }, - "depends" => { - depends = Some(try!(visitor.visit_value())); - }, - "due" => { - due = Some(try!(visitor.visit_value())); - }, - "end" => { - end = Some(try!(visitor.visit_value())); - }, - "imask" => { - imask = Some(try!(visitor.visit_value())); - }, - "mask" => { - mask = Some(try!(visitor.visit_value())); - }, - "modified" => { - modified = Some(try!(visitor.visit_value())); - }, - "parent" => { - parent = Some(try!(visitor.visit_value())); - }, - "priority" => { - priority = Some(try!(visitor.visit_value())); - }, - "project" => { - project = Some(try!(visitor.visit_value())); - }, - "recur" => { - recur = Some(try!(visitor.visit_value())); - }, - "scheduled" => { - scheduled = Some(try!(visitor.visit_value())); - }, - "start" => { - start = Some(try!(visitor.visit_value())); - }, - "tags" => { - tags = Some(try!(visitor.visit_value())); - }, - "until" => { - until = Some(try!(visitor.visit_value())); - }, - "wait" => { - wait = Some(try!(visitor.visit_value())); - }, - - field => { - use serde::de::impls::IgnoredAny; - - debug!("field '{}' ignored", field); - let _: IgnoredAny = try!(visitor.visit_value()); - } - } - } - - let status = match status { - Some(status) => status, - None => return Err(V::Error::missing_field("status")), - }; - - let uuid = match uuid { - Some(uuid) => uuid, - None => return Err(V::Error::missing_field("uuid")), - }; - - let entry = match entry { - Some(entry) => entry, - None => return Err(V::Error::missing_field("entry")), - }; - - let description = match description { - Some(description) => description, - None => return Err(V::Error::missing_field("description")), - }; - - let task = Task::new( - status, - uuid, - entry, - description, - - annotations, - depends, - due, - end, - imask, - mask, - modified, - parent, - priority, - project, - recur, - scheduled, - start, - tags, - until, - wait - ); - - Ok(task) - } -} - #[cfg(test)] mod test { use date::Date; |