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