summaryrefslogtreecommitdiffstats
path: root/src/task.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/task.rs')
-rw-r--r--src/task.rs286
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;