grass_compiler/value/
arglist.rs

1use std::{cell::Cell, collections::BTreeMap, rc::Rc};
2
3use crate::common::{Identifier, ListSeparator};
4
5use super::Value;
6
7#[derive(Debug, Clone)]
8pub struct ArgList {
9    pub elems: Vec<Value>,
10    were_keywords_accessed: Rc<Cell<bool>>,
11    // todo: special wrapper around this field to avoid having to make it private?
12    keywords: BTreeMap<Identifier, Value>,
13    pub separator: ListSeparator,
14}
15
16impl PartialEq for ArgList {
17    fn eq(&self, other: &Self) -> bool {
18        self.elems == other.elems
19            && self.keywords == other.keywords
20            && self.separator == other.separator
21    }
22}
23
24impl Eq for ArgList {}
25
26impl ArgList {
27    pub fn new(
28        elems: Vec<Value>,
29        were_keywords_accessed: Rc<Cell<bool>>,
30        keywords: BTreeMap<Identifier, Value>,
31        separator: ListSeparator,
32    ) -> Self {
33        debug_assert!(
34            !(*were_keywords_accessed).get(),
35            "expected args to initialize with unaccessed keywords"
36        );
37
38        Self {
39            elems,
40            were_keywords_accessed,
41            keywords,
42            separator,
43        }
44    }
45
46    pub fn len(&self) -> usize {
47        self.elems.len()
48    }
49
50    pub fn is_empty(&self) -> bool {
51        self.len() == 0
52    }
53
54    pub fn is_blank(&self) -> bool {
55        !self.is_empty() && (self.elems.iter().all(Value::is_blank))
56    }
57
58    pub fn keywords(&self) -> &BTreeMap<Identifier, Value> {
59        (*self.were_keywords_accessed).set(true);
60        &self.keywords
61    }
62
63    pub fn into_keywords(self) -> BTreeMap<Identifier, Value> {
64        (*self.were_keywords_accessed).set(true);
65        self.keywords
66    }
67}