diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2016-04-02 14:02:52 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2016-04-02 17:33:20 +0200 |
commit | f9edb545e213a1dd21649500a79242529b3abedf (patch) | |
tree | e1687e777aaec1526e4b1319361184156e32ab59 /src/priority.rs | |
parent | 8d3f40dad641af23cc08edefb25ae4f93b1dd535 (diff) |
Impl De/Serialize for Priority
Diffstat (limited to 'src/priority.rs')
-rw-r--r-- | src/priority.rs | 61 |
1 files changed, 43 insertions, 18 deletions
diff --git a/src/priority.rs b/src/priority.rs index fdc7833..427a17d 100644 --- a/src/priority.rs +++ b/src/priority.rs @@ -1,32 +1,57 @@ +use serde::Serialize; +use serde::Serializer; +use serde::Deserialize; +use serde::Deserializer; +use serde::de::Error; +use serde::de::Visitor; + #[derive(Debug, Clone, PartialEq)] pub enum TaskPriority { - NoPrio, Low, Medium, High, } -impl<'a> From<&'a str> for TaskPriority { - fn from(s: &str) -> TaskPriority { - match s { - "L" => TaskPriority::Low, - "M" => TaskPriority::Medium, - "H" => TaskPriority::High, - _ => TaskPriority::NoPrio, - } +impl Serialize for TaskPriority { + + fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error> + where S: Serializer + { + serializer.serialize_str( + match self { + TaskPriority::Low => "L", + TaskPriority::Medium => "M", + TaskPriority::High => "H", + } + ) } + } -impl Into<String> for TaskPriority { +impl Deserialize for TaskPriority { - fn into(self) -> String { - String::from(match self { - TaskPriority::Low => "L", - TaskPriority::Medium => "M", - TaskPriority::High => "H", - TaskPriority::NoPrio => "", - }) - } + fn deserialize<D>(deserializer: &mut D) -> Result<TaskPriority, Error> + where D: Deserializer + { + struct TaskPriorityVisitor; + impl Visitor for TaskPriorityVisitor { + type Value = TaskPriority; + + fn visit_str<E>(&mut self, value: &str) -> Result<TaskPriority, E> + where E: Error + { + match value { + "L" => Ok(TaskPriority::Low), + "M" => Ok(TaskPriority::Medium), + "H" => Ok(TaskPriority::High), + _ => Err(Error::custom("expected one of 'L', 'M', 'H'")), + } + } + } + + deserializer.deserialize(TaskPriorityVisitor) + } } + |