From 36d7b5d9204ec4674a6d591ac543bb3c89c8c043 Mon Sep 17 00:00:00 2001 From: Connor Skees Date: Mon, 27 Jul 2020 18:06:00 -0400 Subject: [PATCH] implement builtin function `meta.module-variables` --- src/builtin/modules/math.rs | 8 ++++---- src/builtin/modules/meta.rs | 23 ++++++++++++++++++++++- src/builtin/modules/mod.rs | 14 ++++++++++++++ tests/meta-module.rs | 15 +++++++++++++++ 4 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 tests/meta-module.rs diff --git a/src/builtin/modules/math.rs b/src/builtin/modules/math.rs index a151c80..9de39cc 100644 --- a/src/builtin/modules/math.rs +++ b/src/builtin/modules/math.rs @@ -378,12 +378,12 @@ pub(crate) fn declare(f: &mut Module) { #[cfg(feature = "random")] f.insert_builtin("random", random); - f.insert_builtin_var( - "pi", - Value::Dimension(Some(Number::from(std::f64::consts::PI)), Unit::None, true), - ); f.insert_builtin_var( "e", Value::Dimension(Some(Number::from(std::f64::consts::E)), Unit::None, true), ); + f.insert_builtin_var( + "pi", + Value::Dimension(Some(Number::from(std::f64::consts::PI)), Unit::None, true), + ); } diff --git a/src/builtin/modules/meta.rs b/src/builtin/modules/meta.rs index fb14935..de6153a 100644 --- a/src/builtin/modules/meta.rs +++ b/src/builtin/modules/meta.rs @@ -45,7 +45,28 @@ fn module_functions(mut args: CallArgs, parser: &mut Parser<'_>) -> SassResult) -> SassResult { args.max_args(1)?; - todo!() + + let module = match args.get_err(0, "module")? { + Value::String(s, ..) => s, + v => { + return Err(( + format!("$module: {} is not a string.", v.inspect(args.span())?), + args.span(), + ) + .into()) + } + }; + + Ok(Value::Map( + parser + .modules + .get(&module) + .ok_or(( + format!("There is no module with the namespace \"{}\".", module), + args.span(), + ))? + .variables(), + )) } pub(crate) fn declare(f: &mut Module) { diff --git a/src/builtin/modules/mod.rs b/src/builtin/modules/mod.rs index 34bf783..0e3a3ac 100644 --- a/src/builtin/modules/mod.rs +++ b/src/builtin/modules/mod.rs @@ -68,6 +68,20 @@ impl Module { .collect::>(), ) } + + pub fn variables(&self) -> SassMap { + SassMap::new_with( + self.vars + .iter() + .map(|(key, value)| { + ( + Value::String(key.to_string(), QuoteKind::Quoted), + value.clone(), + ) + }) + .collect::>(), + ) + } } pub(crate) fn declare_module_color() -> Module { diff --git a/tests/meta-module.rs b/tests/meta-module.rs new file mode 100644 index 0000000..da5b626 --- /dev/null +++ b/tests/meta-module.rs @@ -0,0 +1,15 @@ +#![cfg(test)] + +#[macro_use] +mod macros; + +test!( + module_functions_builtin, + "@use 'sass:meta';\na {\n color: inspect(meta.module-functions(meta));\n}\n", + "a {\n color: (\"feature-exists\": get-function(\"feature-exists\"), \"inspect\": get-function(\"inspect\"), \"type-of\": get-function(\"type-of\"), \"keywords\": get-function(\"keywords\"), \"global-variable-exists\": get-function(\"global-variable-exists\"), \"variable-exists\": get-function(\"variable-exists\"), \"function-exists\": get-function(\"function-exists\"), \"mixin-exists\": get-function(\"mixin-exists\"), \"content-exists\": get-function(\"content-exists\"), \"module-variables\": get-function(\"module-variables\"), \"module-functions\": get-function(\"module-functions\"), \"get-function\": get-function(\"get-function\"), \"call\": get-function(\"call\"));\n}\n" +); +test!( + module_variables_builtin, + "@use 'sass:meta';\n@use 'sass:math';\na {\n color: inspect(meta.module-variables(math));\n}\n", + "a {\n color: (\"e\": 2.7182818285, \"pi\": 3.1415926536);\n}\n" +);