From 29917d95d45480b8a650ce8754e38346bd6a0333 Mon Sep 17 00:00:00 2001 From: ConnorSkees <39542938+ConnorSkees@users.noreply.github.com> Date: Sat, 8 Feb 2020 15:53:49 -0500 Subject: [PATCH] Handle == and != --- src/lexer.rs | 13 ++++++++++++- src/value.rs | 13 ++++++++++++- tests/meta.rs | 10 ++++++++++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/lexer.rs b/src/lexer.rs index cfaf068..1d61785 100644 --- a/src/lexer.rs +++ b/src/lexer.rs @@ -46,7 +46,18 @@ impl<'a> Iterator for Lexer<'a> { '(' => symbol!(self, OpenParen), ')' => symbol!(self, CloseParen), '+' => symbol!(self, Plus), - '=' => symbol!(self, Equal), + '=' => { + self.buf.next(); + self.pos.next_char(); + match self.buf.peek() { + Some('=') => { + self.buf.next(); + self.pos.next_char(); + TokenKind::Op(Op::Equal) + } + _ => TokenKind::Symbol(Symbol::Equal) + } + }, '?' => symbol!(self, QuestionMark), '\\' => symbol!(self, BackSlash), '~' => symbol!(self, Tilde), diff --git a/src/value.rs b/src/value.rs index 44f30b1..3ab54f6 100644 --- a/src/value.rs +++ b/src/value.rs @@ -226,7 +226,8 @@ impl Value { } pub fn is_true(&self) -> bool { - !(self == &Value::Null || self == &Value::False) + let s = self.eval(); + !(s == Value::Null || s == Value::False) } pub fn unquote(self) -> Self { @@ -250,11 +251,21 @@ impl Value { } } + pub fn bool(b: bool) -> Self { + if b { + Value::True + } else { + Value::False + } + } + pub fn eval(&self) -> Self { match self { Self::BinaryOp(lhs, op, rhs) => match op { Op::Plus => *lhs.clone() + *rhs.clone(), Op::Minus => *lhs.clone() - *rhs.clone(), + Op::Equal => Self::bool(*lhs == *rhs), + Op::NotEqual => Self::bool(*lhs != *rhs), _ => Self::BinaryOp(lhs.clone(), *op, rhs.clone()), }, _ => self.clone(), diff --git a/tests/meta.rs b/tests/meta.rs index 356d591..518393e 100644 --- a/tests/meta.rs +++ b/tests/meta.rs @@ -8,6 +8,16 @@ test!( "a {\n color: if(true, 1, 2)\n}\n", "a {\n color: 1;\n}\n" ); +test!( + if_equal, + "a {\n color: if(1 == 1, 1, 2)\n}\n", + "a {\n color: 1;\n}\n" +); +test!( + if_not_equal, + "a {\n color: if(1 != 1, 1, 2)\n}\n", + "a {\n color: 2;\n}\n" +); test!( if_named_args, "a {\n color: if($condition: true, $if-true: 1, $if-false: 2)\n}\n",