grass/src/builtin/meta.rs
2020-02-03 15:18:12 -05:00

64 lines
2.4 KiB
Rust
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

use std::collections::BTreeMap;
use super::Builtin;
use crate::common::QuoteKind;
use crate::units::Unit;
use crate::value::Value;
pub(crate) fn register(f: &mut BTreeMap<String, Builtin>) {
decl!(f "if", |args| {
let cond: &Value = arg!(args, 0, "condition");
let if_true = arg!(args, 1, "if-true").clone();
let if_false = arg!(args, 2, "if-false").clone();
if cond.is_true() {
Some(if_true)
} else {
Some(if_false)
}
});
decl!(f "feature-exists", |args| {
let feature: &Value = arg!(args, 0, "feature");
match feature.clone().unquote().to_string().as_str() {
// A local variable will shadow a global variable unless
// `!global` is used.
"global-variable-shadowing" => Some(Value::False),
// the @extend rule will affect selectors nested in pseudo-classes
// like :not()
"extend-selector-pseudoclass" => Some(Value::False),
// Full support for unit arithmetic using units defined in the
// [Values and Units Level 3][] spec.
"units-level-3" => Some(Value::False),
// The Sass `@error` directive is supported.
"at-error" => Some(Value::True),
// The "Custom Properties Level 1" spec is supported. This means
// that custom properties are parsed statically, with only
// interpolation treated as SassScript.
"custom-property" => Some(Value::False),
_ => Some(Value::False),
}
});
decl!(f "unit", |args| {
let number = arg!(args, 0, "number");
let unit = match number {
Value::Dimension(_, u) => u.to_string(),
_ => String::new()
};
Some(Value::Ident(unit, QuoteKind::Double))
});
decl!(f "type-of", |args| {
let value = arg!(args, 0, "value");
Some(Value::Ident(value.kind().to_owned(), QuoteKind::None))
});
decl!(f "unitless", |args| {
let number = arg!(args, 0, "number");
match number {
Value::Dimension(_, Unit::None) => Some(Value::True),
Value::Dimension(_, _) => Some(Value::False),
_ => Some(Value::True)
}
});
decl!(f "inspect", |args| {
let value = arg!(args, 0, "v­alue");
Some(Value::Ident(value.to_string(), QuoteKind::None))
});
}