1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
use crate::lua_generator::{LuaGenerator, ToLua}; use crate::nodes::{ Expression, FieldExpression, IndexExpression, }; #[derive(Clone, Debug, PartialEq, Eq)] pub enum Variable { Identifier(String), Field(Box<FieldExpression>), Index(Box<IndexExpression>), } impl Variable { pub fn new<S: Into<String>>(name: S) -> Self { Self::Identifier(name.into()) } } impl ToLua for Variable { fn to_lua(&self, generator: &mut LuaGenerator) { match self { Self::Identifier(name) => generator.push_str(name), Self::Field(field) => field.to_lua(generator), Self::Index(index) => index.to_lua(generator), } } } #[derive(Clone, Debug, PartialEq, Eq)] pub struct AssignStatement { variables: Vec<Variable>, values: Vec<Expression>, } impl AssignStatement { pub fn new(variables: Vec<Variable>, values: Vec<Expression>) -> Self { Self { variables, values, } } pub fn mutate_variables(&mut self) -> &mut Vec<Variable> { &mut self.variables } pub fn mutate_values(&mut self) -> &mut Vec<Expression> { &mut self.values } } impl ToLua for AssignStatement { fn to_lua(&self, generator: &mut LuaGenerator) { generator.for_each_and_between( &self.variables, |generator, variable| variable.to_lua(generator), |generator| generator.push_char(','), ); generator.push_char('='); generator.for_each_and_between( &self.values, |generator, expression| expression.to_lua(generator), |generator| generator.push_char(','), ); } } #[cfg(test)] mod test { use super::*; #[test] fn generate_variable_with_one_value() { let output = AssignStatement::new( vec![Variable::new("var")], vec![Expression::False], ).to_lua_string(); assert_eq!(output, "var=false"); } #[test] fn generate_two_variables_with_one_value() { let output = AssignStatement::new( vec![Variable::new("foo"), Variable::new("var")], vec![Expression::False], ).to_lua_string(); assert_eq!(output, "foo,var=false"); } #[test] fn generate_two_variables_with_two_values() { let output = AssignStatement::new( vec![Variable::new("foo"), Variable::new("var")], vec![Expression::Nil, Expression::False], ).to_lua_string(); assert_eq!(output, "foo,var=nil,false"); } }