#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Node {
pub value: Value,
pub offset: usize,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Value {
Null,
Scalar(String),
Seq(Vec<Node>),
Map(Vec<(String, Node)>),
}
impl Node {
#[must_use]
pub fn as_str(&self) -> Option<&str> {
match &self.value {
Value::Scalar(s) => Some(s),
_ => None,
}
}
#[must_use]
pub fn as_seq(&self) -> Option<&[Node]> {
match &self.value {
Value::Seq(items) => Some(items),
Value::Null => Some(&[]),
_ => None,
}
}
#[must_use]
pub fn as_map(&self) -> Option<&[(String, Node)]> {
match &self.value {
Value::Map(entries) => Some(entries),
_ => None,
}
}
#[must_use]
pub fn get(&self, key: &str) -> Option<&Node> {
self.as_map()?
.iter()
.find(|(k, _)| k == key)
.map(|(_, node)| node)
}
}