Skip to main content

sciforge_parser/yaml/
value.rs

1#[derive(Clone, Debug, PartialEq)]
2pub enum YamlValue<'a> {
3    Null,
4    Bool(bool),
5    Number(f64),
6    String(&'a str),
7    Sequence(Vec<YamlValue<'a>>),
8    Mapping(Vec<(&'a str, YamlValue<'a>)>),
9}
10
11impl<'a> YamlValue<'a> {
12    pub fn is_mapping(&self) -> bool {
13        matches!(self, YamlValue::Mapping(_))
14    }
15
16    pub fn is_sequence(&self) -> bool {
17        matches!(self, YamlValue::Sequence(_))
18    }
19
20    pub fn as_str(&self) -> Option<&'a str> {
21        match self {
22            YamlValue::String(v) => Some(v),
23            _ => None,
24        }
25    }
26
27    pub fn as_bool(&self) -> Option<bool> {
28        match self {
29            YamlValue::Bool(v) => Some(*v),
30            _ => None,
31        }
32    }
33
34    pub fn as_number(&self) -> Option<f64> {
35        match self {
36            YamlValue::Number(v) => Some(*v),
37            _ => None,
38        }
39    }
40
41    pub fn as_u32(&self) -> Option<u32> {
42        self.as_number().map(|n| n as u32)
43    }
44
45    pub fn get(&self, key: &str) -> Option<&YamlValue<'a>> {
46        match self {
47            YamlValue::Mapping(entries) => entries.iter().find(|(k, _)| *k == key).map(|(_, v)| v),
48            _ => None,
49        }
50    }
51
52    pub fn items(&self) -> &[YamlValue<'a>] {
53        match self {
54            YamlValue::Sequence(items) => items,
55            _ => &[],
56        }
57    }
58
59    pub fn entries(&self) -> &[(&'a str, YamlValue<'a>)] {
60        match self {
61            YamlValue::Mapping(entries) => entries,
62            _ => &[],
63        }
64    }
65
66    pub fn is_null(&self) -> bool {
67        matches!(self, YamlValue::Null)
68    }
69}