Skip to main content

openpathresolver/types/
value.rs

1use crate::types::TemplateAttributes;
2
3macro_rules! impl_from {
4    ($($e:ty: $t:ty => $v:ident),+ $(,)?) => {
5        $(impl From<$t> for $e {
6            fn from(value: $t) -> Self {
7                Self::$v(value.into())
8            }
9        })+
10    };
11}
12
13/// A value for a path.
14#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
15pub enum PathValue {
16    /// An integer.
17    Integer(u16),
18    /// A string.
19    String(String),
20}
21
22impl_from!(
23    PathValue: &str => String,
24    PathValue: String => String,
25    PathValue: u8 => Integer,
26    PathValue: u16 => Integer,
27);
28
29/// A value for a template.
30///
31/// This is similar to a JSON type.
32#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
33pub enum TemplateValue {
34    /// A null value.
35    None,
36    /// A boolean.
37    Bool(bool),
38    /// An integer.
39    Integer(i64),
40    /// A float.
41    Float(f64),
42    /// A string.
43    String(String),
44    /// An array of template values.
45    Array(Vec<TemplateValue>),
46    /// An object or mapping of template values.
47    Object(TemplateAttributes),
48}
49
50impl_from!(
51    TemplateValue: bool => Bool,
52    TemplateValue: u8 => Integer,
53    TemplateValue: i8 => Integer,
54    TemplateValue: u16 => Integer,
55    TemplateValue: i16 => Integer,
56    TemplateValue: u32 => Integer,
57    TemplateValue: i32 => Integer,
58    TemplateValue: i64 => Integer,
59    TemplateValue: f32 => Float,
60    TemplateValue: f64 => Float,
61    TemplateValue: &str => String,
62    TemplateValue: String => String,
63    TemplateValue: Vec<TemplateValue> => Array,
64    TemplateValue: TemplateAttributes => Object,
65);
66
67impl TryFrom<u64> for TemplateValue {
68    type Error = crate::Error;
69
70    fn try_from(value: u64) -> Result<Self, Self::Error> {
71        Ok(Self::Integer(value.try_into()?))
72    }
73}
74
75/// A value for metadata.
76///
77/// This is similar to a JSON type.
78#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
79pub enum MetadataValue {
80    /// A null value.
81    None,
82    /// A boolean.
83    Bool(bool),
84    /// An integer.
85    Integer(i64),
86    /// A float.
87    Float(f64),
88    /// A string.
89    String(String),
90    /// An array of metadata values.
91    Array(Vec<MetadataValue>),
92    /// An object or mapping of metadata values.
93    Object(std::collections::HashMap<String, MetadataValue>),
94}
95
96impl_from!(
97    MetadataValue: bool => Bool,
98    MetadataValue: u8 => Integer,
99    MetadataValue: i8 => Integer,
100    MetadataValue: u16 => Integer,
101    MetadataValue: i16 => Integer,
102    MetadataValue: u32 => Integer,
103    MetadataValue: i32 => Integer,
104    MetadataValue: i64 => Integer,
105    MetadataValue: f32 => Float,
106    MetadataValue: f64 => Float,
107    MetadataValue: &str => String,
108    MetadataValue: String => String,
109    MetadataValue: Vec<MetadataValue> => Array,
110    MetadataValue: std::collections::HashMap<String, MetadataValue> => Object,
111);
112
113impl TryFrom<u64> for MetadataValue {
114    type Error = crate::Error;
115
116    fn try_from(value: u64) -> Result<Self, Self::Error> {
117        Ok(Self::Integer(value.try_into()?))
118    }
119}