Implement modulo
This commit is contained in:
parent
0fe97993f4
commit
9630343676
@ -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),
|
||||
|
@ -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()),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
@ -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"
|
||||
);
|
||||
|
Loading…
x
Reference in New Issue
Block a user