grass_compiler/value/
arglist.rs1use 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 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}