Handle == and !=

This commit is contained in:
ConnorSkees 2020-02-08 15:53:49 -05:00
parent 74a81060ba
commit 29917d95d4
3 changed files with 34 additions and 2 deletions

View File

@ -46,7 +46,18 @@ impl<'a> Iterator for Lexer<'a> {
'(' => symbol!(self, OpenParen), '(' => symbol!(self, OpenParen),
')' => symbol!(self, CloseParen), ')' => symbol!(self, CloseParen),
'+' => symbol!(self, Plus), '+' => 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, QuestionMark),
'\\' => symbol!(self, BackSlash), '\\' => symbol!(self, BackSlash),
'~' => symbol!(self, Tilde), '~' => symbol!(self, Tilde),

View File

@ -226,7 +226,8 @@ impl Value {
} }
pub fn is_true(&self) -> bool { 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 { 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 { pub fn eval(&self) -> Self {
match self { match self {
Self::BinaryOp(lhs, op, rhs) => match op { Self::BinaryOp(lhs, op, rhs) => match op {
Op::Plus => *lhs.clone() + *rhs.clone(), Op::Plus => *lhs.clone() + *rhs.clone(),
Op::Minus => *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::BinaryOp(lhs.clone(), *op, rhs.clone()),
}, },
_ => self.clone(), _ => self.clone(),

View File

@ -8,6 +8,16 @@ test!(
"a {\n color: if(true, 1, 2)\n}\n", "a {\n color: if(true, 1, 2)\n}\n",
"a {\n color: 1;\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!( test!(
if_named_args, if_named_args,
"a {\n color: if($condition: true, $if-true: 1, $if-false: 2)\n}\n", "a {\n color: if($condition: true, $if-true: 1, $if-false: 2)\n}\n",