darklua_core/nodes/statements/
assign.rs

1use crate::nodes::{Expression, Token, Variable};
2
3#[derive(Clone, Debug, PartialEq, Eq)]
4pub struct AssignTokens {
5    pub equal: Token,
6    pub variable_commas: Vec<Token>,
7    pub value_commas: Vec<Token>,
8}
9
10impl AssignTokens {
11    super::impl_token_fns!(
12        target = [equal]
13        iter = [variable_commas, value_commas]
14    );
15}
16
17#[derive(Clone, Debug, PartialEq, Eq)]
18pub struct AssignStatement {
19    variables: Vec<Variable>,
20    values: Vec<Expression>,
21    tokens: Option<AssignTokens>,
22}
23
24impl AssignStatement {
25    pub fn new(variables: Vec<Variable>, values: Vec<Expression>) -> Self {
26        Self {
27            variables,
28            values,
29            tokens: None,
30        }
31    }
32
33    pub fn from_variable<V: Into<Variable>, E: Into<Expression>>(variable: V, value: E) -> Self {
34        Self {
35            variables: vec![variable.into()],
36            values: vec![value.into()],
37            tokens: None,
38        }
39    }
40
41    #[inline]
42    pub fn variables_len(&self) -> usize {
43        self.variables.len()
44    }
45
46    #[inline]
47    pub fn values_len(&self) -> usize {
48        self.values.len()
49    }
50
51    #[inline]
52    pub fn get_variables(&self) -> &Vec<Variable> {
53        &self.variables
54    }
55
56    #[inline]
57    pub fn iter_variables(&self) -> impl Iterator<Item = &Variable> {
58        self.variables.iter()
59    }
60
61    #[inline]
62    pub fn iter_mut_variables(&mut self) -> impl Iterator<Item = &mut Variable> {
63        self.variables.iter_mut()
64    }
65
66    #[inline]
67    pub fn last_value(&self) -> Option<&Expression> {
68        self.values.last()
69    }
70
71    #[inline]
72    pub fn iter_values(&self) -> impl Iterator<Item = &Expression> {
73        self.values.iter()
74    }
75
76    #[inline]
77    pub fn iter_mut_values(&mut self) -> impl Iterator<Item = &mut Expression> {
78        self.values.iter_mut()
79    }
80
81    #[inline]
82    pub fn mutate_variables(&mut self) -> &mut Vec<Variable> {
83        &mut self.variables
84    }
85
86    pub fn append_assignment<V: Into<Variable>, E: Into<Expression>>(
87        mut self,
88        variable: V,
89        value: E,
90    ) -> Self {
91        self.variables.push(variable.into());
92        self.values.push(value.into());
93        self
94    }
95
96    pub fn with_tokens(mut self, tokens: AssignTokens) -> Self {
97        self.tokens = Some(tokens);
98        self
99    }
100
101    #[inline]
102    pub fn set_tokens(&mut self, tokens: AssignTokens) {
103        self.tokens = Some(tokens);
104    }
105
106    #[inline]
107    pub fn get_tokens(&self) -> Option<&AssignTokens> {
108        self.tokens.as_ref()
109    }
110
111    super::impl_token_fns!(iter = [tokens]);
112}