diff --git a/src/builtin/string.rs b/src/builtin/string.rs index cb4eeb6..2b8ddc6 100644 --- a/src/builtin/string.rs +++ b/src/builtin/string.rs @@ -1,7 +1,8 @@ use std::collections::BTreeMap; use super::Builtin; -use crate::value::Value; +use crate::units::Unit; +use crate::value::{Number, Value}; pub(crate) fn register(f: &mut BTreeMap) { decl!(f "to-upper-case", |args, _| { @@ -18,4 +19,11 @@ pub(crate) fn register(f: &mut BTreeMap) { _ => todo!("") } }); + decl!(f "str-length", |args, _| { + let s: &Value = arg!(args, 0, "string"); + match s.eval() { + Value::Ident(i, _) => Some(Value::Dimension(Number::from(i.len()), Unit::None)), + _ => todo!("") + } + }); } diff --git a/src/value/number.rs b/src/value/number.rs index 787ce65..5d6d20c 100644 --- a/src/value/number.rs +++ b/src/value/number.rs @@ -30,14 +30,22 @@ impl From for Number { } } -impl From for Number { - fn from(b: u16) -> Self { - Number { - val: BigRational::from_integer(BigInt::from(b)), +macro_rules! from_integer { + ($ty:ty) => { + impl From<$ty> for Number { + fn from(b: $ty) -> Self { + Number { + val: BigRational::from_integer(BigInt::from(b)), + } + } } - } + }; } +from_integer!(u16); +from_integer!(usize); +from_integer!(i32); + impl Display for Number { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}", self.val.to_integer())?; diff --git a/tests/strings.rs b/tests/strings.rs index 5db0bcd..79f7236 100644 --- a/tests/strings.rs +++ b/tests/strings.rs @@ -23,3 +23,13 @@ test!( "a {\n color: to-lower-case($string: AbC123);\n}\n", "a {\n color: abc123;\n}\n" ); +test!( + length_ident, + "a {\n color: str-length(AbC123);\n}\n", + "a {\n color: 6;\n}\n" +); +test!( + length_named_arg, + "a {\n color: str-length($string: aBc123);\n}\n", + "a {\n color: 6;\n}\n" +); \ No newline at end of file