//! Module containing the types for User Defined Attributes (UDA) use std::collections::BTreeMap; use std::result::Result as RResult; use std::fmt; use serde::Serialize; use serde::Serializer; use serde::Deserialize; use serde::Deserializer; use serde::de::Visitor; use serde::de; /// The name of a UDA is just a string. pub type UDAName = String; /// A UDA can have different value types. #[derive(Clone, Debug, PartialEq, PartialOrd)] pub enum UDAValue { /// UDA is a string Str(String), /// UDA is an integer U64(u64), /// UDA is a float F64(f64), } impl Serialize for UDAValue { fn serialize(&self, serializer: S) -> RResult where S: Serializer, { match self { &UDAValue::Str(ref s) => s.serialize(serializer), &UDAValue::U64(s) => s.serialize(serializer), &UDAValue::F64(s) => s.serialize(serializer), } } } struct UDAVisitor; impl<'de> Visitor<'de> for UDAVisitor { type Value = UDAValue; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str("an UDA value like a string, float or int") } fn visit_u64(self, value: u64) -> Result where E: de::Error, { Ok(UDAValue::U64(value)) } fn visit_f64(self, value: f64) -> Result where E: de::Error, { Ok(UDAValue::F64(value)) } fn visit_str(self, value: &str) -> Result where E: de::Error, { Ok(UDAValue::Str(value.to_owned())) } } impl<'de> Deserialize<'de> for UDAValue { fn deserialize(deserializer: D) -> RResult where D: Deserializer<'de>, { deserializer.deserialize_any(UDAVisitor) } } /// The UDA Type is just a BTreeMap in which all fields of a task are saved, /// which are not part of the taskwarrior standard. (This makes them user defined attributes.) pub type UDA = BTreeMap;