syncat_stylesheet/ast/
declaration.rs

1use super::{Value, Variable, helper::*};
2use std::collections::BTreeMap;
3use std::iter::FromIterator;
4use tree_sitter::TreeCursor;
5
6#[derive(Clone, Debug)]
7pub(crate) struct Declaration {
8    pub(crate) variable: Variable,
9    pub(crate) value: Value,
10}
11
12impl FromSource for Declaration {
13    fn from_source(tree: &mut TreeCursor, source: &[u8]) -> crate::Result<Self> {
14        children!(tree, "declaration");
15
16        let variable = Variable::from_source(tree, source)?;
17        tree.goto_next_sibling();
18        let value = Value::from_source(tree, source)?;
19
20        tree.goto_parent();
21        Ok(Declaration { variable, value })
22    }
23}
24
25impl FromIterator<Declaration> for BTreeMap<String, Value> {
26    fn from_iter<I: IntoIterator<Item = Declaration>>(iter: I) -> Self {
27        iter.into_iter().fold(
28            Self::default(),
29            |mut map, Declaration { variable, value }| {
30                map.insert(variable.name().to_owned(), value);
31                map
32            },
33        )
34    }
35}