doku/objects/
value.rs

1mod serializer;
2
3use self::serializer::*;
4use crate::*;
5
6#[derive(Debug)]
7pub enum Value {
8    /// Value of [`TypeKind::Optional`].
9    None,
10
11    /// Value of [`TypeKind::Bool`].
12    Bool(bool),
13
14    /// Value of [`TypeKind::String`].
15    Char(char),
16
17    /// Value of [`TypeKind::Float`].
18    F32(f32),
19
20    /// Value of [`TypeKind::Float`].
21    F64(f64),
22
23    /// Value of [`TypeKind::Integer`].
24    U8(u8),
25
26    /// Value of [`TypeKind::Integer`].
27    I8(i8),
28
29    /// Value of [`TypeKind::Integer`].
30    U16(u16),
31
32    /// Value of [`TypeKind::Integer`].
33    I16(i16),
34
35    /// Value of [`TypeKind::Integer`].
36    U32(u32),
37
38    /// Value of [`TypeKind::Integer`].
39    I32(i32),
40
41    /// Value of [`TypeKind::Integer`].
42    U64(u64),
43
44    /// Value of [`TypeKind::Integer`].
45    I64(i64),
46
47    /// Value of [`TypeKind::Integer`].
48    U128(u128),
49
50    /// Value of [`TypeKind::Integer`].
51    I128(i128),
52
53    /// Value of [`TypeKind::Integer`].
54    Usize(usize),
55
56    /// Value of [`TypeKind::Integer`].
57    Isize(isize),
58
59    /// Value of [`TypeKind::Integer`].
60    String(String),
61
62    /// Value of [`TypeKind::Array`] or [`TypeKind::Tuple`].
63    Array(Vec<Value>),
64
65    /// Value of [`TypeKind::Map`] or [`TypeKind::Struct`].
66    Map(Vec<(Value, Value)>),
67}
68
69impl Value {
70    pub fn as_struct_named_field(&self, name: &str) -> Option<&Self> {
71        let fields = if let Self::Map(fields) = self {
72            fields
73        } else {
74            return None;
75        };
76
77        fields.iter().find_map(|(name2, value)| {
78            if let Value::String(name2) = name2 {
79                if name2 == name {
80                    return Some(value);
81                }
82            }
83
84            None
85        })
86    }
87
88    pub fn as_struct_unnamed_field(&self, idx: usize) -> Option<&Self> {
89        match self {
90            Self::Array(items) => items.get(idx),
91            Self::Map(fields) => fields.get(idx).map(|(_, value)| value),
92            _ => None,
93        }
94    }
95}
96
97impl Default for Value {
98    fn default() -> Self {
99        Self::None
100    }
101}
102
103impl<S> From<&S> for Value
104where
105    S: Serialize,
106{
107    fn from(value: &S) -> Self {
108        // Unwrap-safety: our serializer never actually panics
109        value.serialize(ValueSerializer::default()).unwrap()
110    }
111}