1use std::collections::BTreeMap;
4use std::fmt;
5use std::result::Result as RResult;
6
7use serde::de;
8use serde::de::Visitor;
9use serde::Deserialize;
10use serde::Deserializer;
11use serde::Serialize;
12use serde::Serializer;
13
14pub type UDAName = String;
16
17#[derive(Clone, Debug, PartialEq, PartialOrd)]
19pub enum UDAValue {
20 Str(String),
22 U64(u64),
24 F64(f64),
26}
27
28impl Serialize for UDAValue {
29 fn serialize<S>(&self, serializer: S) -> RResult<S::Ok, S::Error>
30 where
31 S: Serializer,
32 {
33 match self {
34 UDAValue::Str(ref s) => s.serialize(serializer),
35 UDAValue::U64(s) => s.serialize(serializer),
36 UDAValue::F64(s) => s.serialize(serializer),
37 }
38 }
39}
40
41struct UDAVisitor;
42
43impl<'de> Visitor<'de> for UDAVisitor {
44 type Value = UDAValue;
45 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
46 formatter.write_str("an UDA value like a string, float or int")
47 }
48
49 fn visit_u64<E>(self, value: u64) -> Result<UDAValue, E>
50 where
51 E: de::Error,
52 {
53 Ok(UDAValue::U64(value))
54 }
55 fn visit_f64<E>(self, value: f64) -> Result<UDAValue, E>
56 where
57 E: de::Error,
58 {
59 Ok(UDAValue::F64(value))
60 }
61 fn visit_str<E>(self, value: &str) -> Result<UDAValue, E>
62 where
63 E: de::Error,
64 {
65 Ok(UDAValue::Str(value.to_owned()))
66 }
67}
68
69impl<'de> Deserialize<'de> for UDAValue {
70 fn deserialize<D>(deserializer: D) -> RResult<UDAValue, D::Error>
71 where
72 D: Deserializer<'de>,
73 {
74 deserializer.deserialize_any(UDAVisitor)
75 }
76}
77
78pub type UDA = BTreeMap<UDAName, UDAValue>;