simplify declaration of list functions

This commit is contained in:
ConnorSkees 2020-04-30 14:47:07 -04:00
parent 3645a93382
commit f2322dda4d

View File

@ -3,15 +3,16 @@ use std::collections::HashMap;
use num_traits::{One, Signed, ToPrimitive, Zero};
use super::Builtin;
use crate::args::CallArgs;
use crate::common::{Brackets, ListSeparator, QuoteKind};
use crate::error::SassResult;
use crate::scope::Scope;
use crate::selector::Selector;
use crate::unit::Unit;
use crate::value::{Number, Value};
pub(crate) fn register(f: &mut HashMap<String, Builtin>) {
f.insert(
"length".to_owned(),
Builtin::new(|mut args, scope, super_selector| {
fn length(mut args: CallArgs, scope: &Scope, super_selector: &Selector) -> SassResult<Value> {
args.max_args(1)?;
let len = match arg!(args, scope, super_selector, 0, "list") {
Value::List(v, ..) => Number::from(v.len()),
@ -19,11 +20,9 @@ pub(crate) fn register(f: &mut HashMap<String, Builtin>) {
_ => Number::one(),
};
Ok(Value::Dimension(len, Unit::None))
}),
);
f.insert(
"nth".to_owned(),
Builtin::new(|mut args, scope, super_selector| {
}
fn nth(mut args: CallArgs, scope: &Scope, super_selector: &Selector) -> SassResult<Value> {
args.max_args(2)?;
let list = match arg!(args, scope, super_selector, 0, "list") {
Value::List(v, ..) => v,
@ -66,11 +65,13 @@ pub(crate) fn register(f: &mut HashMap<String, Builtin>) {
} else {
Ok(list[list.len() - n.abs().to_integer().to_usize().unwrap()].clone())
}
}),
);
f.insert(
"list-separator".to_owned(),
Builtin::new(|mut args, scope, super_selector| {
}
fn list_separator(
mut args: CallArgs,
scope: &Scope,
super_selector: &Selector,
) -> SassResult<Value> {
args.max_args(1)?;
Ok(Value::Ident(
match arg!(args, scope, super_selector, 0, "list") {
@ -80,11 +81,9 @@ pub(crate) fn register(f: &mut HashMap<String, Builtin>) {
.to_owned(),
QuoteKind::None,
))
}),
);
f.insert(
"set-nth".to_owned(),
Builtin::new(|mut args, scope, super_selector| {
}
fn set_nth(mut args: CallArgs, scope: &Scope, super_selector: &Selector) -> SassResult<Value> {
args.max_args(3)?;
let (mut list, sep, brackets) = match arg!(args, scope, super_selector, 0, "list") {
Value::List(v, sep, b) => (v, sep, b),
@ -129,11 +128,9 @@ pub(crate) fn register(f: &mut HashMap<String, Builtin>) {
}
Ok(Value::List(list, sep, brackets))
}),
);
f.insert(
"append".to_owned(),
Builtin::new(|mut args, scope, super_selector| {
}
fn append(mut args: CallArgs, scope: &Scope, super_selector: &Selector) -> SassResult<Value> {
args.max_args(3)?;
let (mut list, sep, brackets) = match arg!(args, scope, super_selector, 0, "list") {
Value::List(v, sep, b) => (v, sep, b),
@ -174,11 +171,9 @@ pub(crate) fn register(f: &mut HashMap<String, Builtin>) {
list.push(val);
Ok(Value::List(list, sep, brackets))
}),
);
f.insert(
"join".to_owned(),
Builtin::new(|mut args, scope, super_selector| {
}
fn join(mut args: CallArgs, scope: &Scope, super_selector: &Selector) -> SassResult<Value> {
args.max_args(4)?;
let (mut list1, sep1, brackets) = match arg!(args, scope, super_selector, 0, "list1") {
Value::List(v, sep, brackets) => (v, sep, brackets),
@ -250,11 +245,13 @@ pub(crate) fn register(f: &mut HashMap<String, Builtin>) {
list1.extend(list2);
Ok(Value::List(list1, sep, brackets))
}),
);
f.insert(
"is-bracketed".to_owned(),
Builtin::new(|mut args, scope, super_selector| {
}
fn is_bracketed(
mut args: CallArgs,
scope: &Scope,
super_selector: &Selector,
) -> SassResult<Value> {
args.max_args(1)?;
Ok(Value::bool(
match arg!(args, scope, super_selector, 0, "list") {
@ -265,11 +262,9 @@ pub(crate) fn register(f: &mut HashMap<String, Builtin>) {
_ => false,
},
))
}),
);
f.insert(
"index".to_owned(),
Builtin::new(|mut args, scope, super_selector| {
}
fn index(mut args: CallArgs, scope: &Scope, super_selector: &Selector) -> SassResult<Value> {
args.max_args(2)?;
let list = match arg!(args, scope, super_selector, 0, "list") {
Value::List(v, ..) => v,
@ -290,11 +285,9 @@ pub(crate) fn register(f: &mut HashMap<String, Builtin>) {
None => return Ok(Value::Null),
};
Ok(Value::Dimension(index, Unit::None))
}),
);
f.insert(
"zip".to_owned(),
Builtin::new(|args, scope, super_selector| {
}
fn zip(args: CallArgs, scope: &Scope, super_selector: &Selector) -> SassResult<Value> {
let span = args.span();
let lists = args
.get_variadic(scope, super_selector)?
@ -326,6 +319,15 @@ pub(crate) fn register(f: &mut HashMap<String, Builtin>) {
.collect();
Ok(Value::List(result, ListSeparator::Comma, Brackets::None))
}),
);
}
f.insert("length".to_owned(), Builtin::new(length));
f.insert("nth".to_owned(), Builtin::new(nth));
f.insert("list-separator".to_owned(), Builtin::new(list_separator));
f.insert("set-nth".to_owned(), Builtin::new(set_nth));
f.insert("append".to_owned(), Builtin::new(append));
f.insert("join".to_owned(), Builtin::new(join));
f.insert("is-bracketed".to_owned(), Builtin::new(is_bracketed));
f.insert("index".to_owned(), Builtin::new(index));
f.insert("zip".to_owned(), Builtin::new(zip));
}