diff --git a/src/builtin/mod.rs b/src/builtin/mod.rs index f9da88e..df49aea 100644 --- a/src/builtin/mod.rs +++ b/src/builtin/mod.rs @@ -23,6 +23,7 @@ lazy_static! { let mut m = BTreeMap::new(); color::register(&mut m); meta::register(&mut m); + string::register(&mut m); m }; } diff --git a/src/builtin/string.rs b/src/builtin/string.rs index 8b13789..cb4eeb6 100644 --- a/src/builtin/string.rs +++ b/src/builtin/string.rs @@ -1 +1,21 @@ +use std::collections::BTreeMap; +use super::Builtin; +use crate::value::Value; + +pub(crate) fn register(f: &mut BTreeMap) { + decl!(f "to-upper-case", |args, _| { + let s: &Value = arg!(args, 0, "string"); + match s.eval() { + Value::Ident(i, q) => Some(Value::Ident(i.to_ascii_uppercase(), q)), + _ => todo!("") + } + }); + decl!(f "to-lower-case", |args, _| { + let s: &Value = arg!(args, 0, "string"); + match s.eval() { + Value::Ident(i, q) => Some(Value::Ident(i.to_ascii_lowercase(), q)), + _ => todo!("") + } + }); +} diff --git a/tests/strings.rs b/tests/strings.rs new file mode 100644 index 0000000..5db0bcd --- /dev/null +++ b/tests/strings.rs @@ -0,0 +1,25 @@ +#![cfg(test)] + +#[macro_use] +mod macros; + +test!( + uppercase_ident, + "a {\n color: to-upper-case(aBc123);\n}\n", + "a {\n color: ABC123;\n}\n" +); +test!( + lowercase_ident, + "a {\n color: to-lower-case(AbC123);\n}\n", + "a {\n color: abc123;\n}\n" +); +test!( + uppercase_named_arg, + "a {\n color: to-upper-case($string: aBc123);\n}\n", + "a {\n color: ABC123;\n}\n" +); +test!( + lowercase_named_arg, + "a {\n color: to-lower-case($string: AbC123);\n}\n", + "a {\n color: abc123;\n}\n" +);