implement builtin function meta.module-functions

This commit is contained in:
Connor Skees 2020-07-27 17:58:29 -04:00
parent f63b254367
commit 2b9cad5971
3 changed files with 53 additions and 12 deletions

View File

@ -18,25 +18,48 @@ fn load_css(mut args: CallArgs, parser: &mut Parser<'_>) -> SassResult<Value> {
} }
fn module_functions(mut args: CallArgs, parser: &mut Parser<'_>) -> SassResult<Value> { fn module_functions(mut args: CallArgs, parser: &mut Parser<'_>) -> SassResult<Value> {
args.max_args(2)?; 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(),
))?
.functions(),
))
} }
fn module_variables(mut args: CallArgs, parser: &mut Parser<'_>) -> SassResult<Value> { fn module_variables(mut args: CallArgs, parser: &mut Parser<'_>) -> SassResult<Value> {
args.max_args(2)?; args.max_args(1)?;
todo!() todo!()
} }
pub(crate) fn declare(f: &mut Module) { pub(crate) fn declare(f: &mut Module) {
f.insert_builtin("call", call);
f.insert_builtin("content-exists", content_exists);
f.insert_builtin("feature-exists", feature_exists); f.insert_builtin("feature-exists", feature_exists);
f.insert_builtin("function-exists", function_exists);
f.insert_builtin("get-function", get_function);
f.insert_builtin("global-variable-exists", global_variable_exists);
f.insert_builtin("inspect", inspect); f.insert_builtin("inspect", inspect);
f.insert_builtin("keywords", keywords);
f.insert_builtin("mixin-exists", mixin_exists);
f.insert_builtin("type-of", type_of); f.insert_builtin("type-of", type_of);
f.insert_builtin("keywords", keywords);
f.insert_builtin("global-variable-exists", global_variable_exists);
f.insert_builtin("variable-exists", variable_exists); f.insert_builtin("variable-exists", variable_exists);
f.insert_builtin("function-exists", function_exists);
f.insert_builtin("mixin-exists", mixin_exists);
f.insert_builtin("content-exists", content_exists);
f.insert_builtin("module-variables", module_variables);
f.insert_builtin("module-functions", module_functions);
f.insert_builtin("get-function", get_function);
f.insert_builtin("call", call);
} }

View File

@ -8,10 +8,10 @@ use crate::{
args::CallArgs, args::CallArgs,
atrule::Mixin, atrule::Mixin,
builtin::Builtin, builtin::Builtin,
common::Identifier, common::{Identifier, QuoteKind},
error::SassResult, error::SassResult,
parse::Parser, parse::Parser,
value::{SassFunction, Value}, value::{SassFunction, SassMap, Value},
}; };
mod color; mod color;
@ -54,6 +54,20 @@ impl Module {
self.functions self.functions
.insert(ident, SassFunction::Builtin(Builtin::new(function), ident)); .insert(ident, SassFunction::Builtin(Builtin::new(function), ident));
} }
pub fn functions(&self) -> SassMap {
SassMap::new_with(
self.functions
.iter()
.map(|(key, value)| {
(
Value::String(key.to_string(), QuoteKind::Quoted),
Value::FunctionRef(value.clone()),
)
})
.collect::<Vec<(Value, Value)>>(),
)
}
} }
pub(crate) fn declare_module_color() -> Module { pub(crate) fn declare_module_color() -> Module {

View File

@ -34,6 +34,10 @@ impl SassMap {
SassMap(Vec::new()) SassMap(Vec::new())
} }
pub const fn new_with(elements: Vec<(Value, Value)>) -> SassMap {
SassMap(elements)
}
/// We take by value here (consuming the map) in order to /// We take by value here (consuming the map) in order to
/// save a clone of the value, since the only place this /// save a clone of the value, since the only place this
/// should be called is in a builtin function, which throws /// should be called is in a builtin function, which throws