syncat_stylesheet/ast/
declaration.rs1use 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}