Implement modulo

This commit is contained in:
ConnorSkees 2020-03-18 11:39:58 -04:00
parent 0fe97993f4
commit 9630343676
3 changed files with 62 additions and 1 deletions

View File

@ -147,6 +147,7 @@ impl Value {
Op::NotEqual => Ok(Self::bool(*lhs != *rhs)),
Op::Mul => *lhs * *rhs,
Op::Div => *lhs / *rhs,
Op::Rem => *lhs % *rhs,
_ => Ok(Self::BinaryOp(lhs, op, rhs)),
},
_ => Ok(self),

View File

@ -1,4 +1,4 @@
use std::ops::{Add, Div, Mul, Sub};
use std::ops::{Add, Div, Mul, Rem, Sub};
use crate::common::QuoteKind;
use crate::error::SassResult;
@ -348,3 +348,37 @@ impl Div for Value {
})
}
}
impl Rem for Value {
type Output = SassResult<Self>;
fn rem(self, other: Self) -> Self::Output {
Ok(match self {
Value::Dimension(n, u) => match other {
Value::Dimension(n2, u2) => {
if !u.comparable(&u2) {
return Err(format!("Incompatible units {} and {}.", u2, u).into());
}
if u == u2 {
Value::Dimension(n % n2, u)
} else if u == Unit::None {
Value::Dimension(n % n2, u2)
} else if u2 == Unit::None {
Value::Dimension(n % n2, u)
} else {
Value::Dimension(n, u)
}
}
_ => {
return Err(format!(
"Undefined operation \"{} % {}\".",
Value::Dimension(n, u),
other
)
.into())
}
},
_ => return Err(format!("Undefined operation \"{} % {}\".", self, other).into()),
})
}
}

View File

@ -50,3 +50,29 @@ test!(
);
test!(positive_float_leading_zero, "a {\n color: 0.1;\n}\n");
test!(negative_float_leading_zero, "a {\n color: -0.1;\n}\n");
test!(
px_mod_px,
"a {\n color: 10px % 2px;\n}\n",
"a {\n color: 0px;\n}\n"
);
test!(
px_mod_in,
"a {\n color: 10px % 2in;\n}\n",
"a {\n color: 10px;\n}\n"
);
test!(
px_mod_none,
"a {\n color: 10px % 2;\n}\n",
"a {\n color: 0px;\n}\n"
);
test!(
none_mod_px,
"a {\n color: 10 % 2px;\n}\n",
"a {\n color: 0px;\n}\n"
);
test!(
none_mod_none,
"a {\n color: 10 % 2;\n}\n",
"a {\n color: 0;\n}\n"
);