diff --git a/src/atrule/mod.rs b/src/atrule/mod.rs index 31b0724..f2c8d57 100644 --- a/src/atrule/mod.rs +++ b/src/atrule/mod.rs @@ -186,25 +186,24 @@ impl AtRule { devour_whitespace_or_comment(toks); - if from < to { - for i in from..(to + through) { - scope.insert_var(&var, Value::Dimension(Number::from(i), Unit::None))?; - stmts.extend(eat_stmts( - &mut body.clone().into_iter().peekable(), - scope, - super_selector, - )?); - } - } else if from > to { - for i in ((to - through)..(from + 1)).skip(1).rev() { - scope.insert_var(&var, Value::Dimension(Number::from(i), Unit::None))?; - stmts.extend(eat_stmts( - &mut body.clone().into_iter().peekable(), - scope, - super_selector, - )?); - } + let (mut x, mut y); + let iter: &mut dyn std::iter::Iterator = if from < to { + x = from..(to + through); + &mut x + } else { + y = ((to - through)..(from + 1)).skip(1).rev(); + &mut y + }; + + for i in iter { + scope.insert_var(&var, Value::Dimension(Number::from(i), Unit::None))?; + stmts.extend(eat_stmts( + &mut body.clone().into_iter().peekable(), + scope, + super_selector, + )?); } + AtRule::For(stmts) } AtRuleKind::While => todo!("@while not yet implemented"), diff --git a/src/function.rs b/src/function.rs index 18845b3..f0f0266 100644 --- a/src/function.rs +++ b/src/function.rs @@ -65,7 +65,7 @@ impl Function { } } - Ok((name, Function::new(scope.clone(), args, body))) + Ok((name, Function::new(scope, args, body))) } pub fn args(mut self, args: &mut CallArgs) -> SassResult { diff --git a/src/scope.rs b/src/scope.rs index 2ff5975..c8bd986 100644 --- a/src/scope.rs +++ b/src/scope.rs @@ -36,15 +36,15 @@ impl Scope { } } - pub fn vars(&self) -> &HashMap { + pub const fn vars(&self) -> &HashMap { &self.vars } pub fn get_var(&self, v: &str) -> SassResult { - let v = &v.replace('_', "-"); - match self.vars.get(v) { + let name = &v.replace('_', "-"); + match self.vars.get(name) { Some(v) => Ok(v.clone()), - None => get_global_var(v), + None => get_global_var(name), } } diff --git a/src/units.rs b/src/units.rs index 2953180..b9cdc3a 100644 --- a/src/units.rs +++ b/src/units.rs @@ -1,6 +1,7 @@ use std::collections::HashMap; use std::f64::consts::PI; use std::fmt; +use std::string::ToString; use once_cell::sync::Lazy; @@ -247,8 +248,6 @@ pub(crate) enum Unit { /// Units multiplied together Mul(Vec), - /// A unit divided by another - Div(Box, Box), } #[derive(Debug, Copy, Clone, Eq, PartialEq)] pub(crate) enum UnitKind { @@ -381,15 +380,12 @@ impl Into for Unit { Unit::Fr => "fr", Unit::None => "", Unit::Mul(u) => { - return format!( - "{}", - u.into_iter() - .map(|x| x.to_string()) - .collect::>() - .join("*") - ) + return u + .iter() + .map(ToString::to_string) + .collect::>() + .join("*") } - Unit::Div(l, r) => return format!("{}/{}", l, r), Unit::Unknown(ref s) => s, } .into() @@ -439,12 +435,11 @@ impl fmt::Display for Unit { Unit::Mul(u) => write!( f, "{}", - u.into_iter() - .map(|x| x.to_string()) + u.iter() + .map(ToString::to_string) .collect::>() .join("*") ), - Unit::Div(l, r) => write!(f, "{}/{}", l, r), } } } diff --git a/src/value/mod.rs b/src/value/mod.rs index 0c9e0d5..005debf 100644 --- a/src/value/mod.rs +++ b/src/value/mod.rs @@ -30,7 +30,7 @@ impl Display for Value { match self { Self::Important => write!(f, "!important"), Self::Dimension(num, unit) => match unit { - Unit::Mul(..) | Unit::Div(..) => { + Unit::Mul(..) => { eprintln!("Error: {}{} isn't a valid CSS value.", num, unit); std::process::exit(1); } @@ -143,8 +143,8 @@ impl Value { Self::Ident(s1, ..) => match other { Self::Ident(s2, ..) => s1 == s2, _ => false, - } - s @ _ => s == other.eval()?, + }, + s => s == other.eval()?, }) } diff --git a/src/value/number.rs b/src/value/number.rs index 578467b..add476d 100644 --- a/src/value/number.rs +++ b/src/value/number.rs @@ -90,6 +90,7 @@ macro_rules! from_integer { }; } +// todo: implement std::convertTryFrom instead impl From for Number { fn from(b: f64) -> Self { Number { diff --git a/src/value/parse.rs b/src/value/parse.rs index 5a4083e..cb7c8bc 100644 --- a/src/value/parse.rs +++ b/src/value/parse.rs @@ -24,7 +24,7 @@ use super::number::Number; fn parse_hex(s: &str) -> Value { match s.len() { 3 => { - let v = match u16::from_str_radix(&s, 16) { + let v = match u16::from_str_radix(s, 16) { Ok(a) => a, Err(_) => return Value::Ident(format!("#{}", s), QuoteKind::None), }; @@ -34,7 +34,7 @@ fn parse_hex(s: &str) -> Value { Value::Color(Color::new(red, green, blue, 1, format!("#{}", s))) } 4 => { - let v = match u16::from_str_radix(&s, 16) { + let v = match u16::from_str_radix(s, 16) { Ok(a) => a, Err(_) => return Value::Ident(format!("#{}", s), QuoteKind::None), }; @@ -45,7 +45,7 @@ fn parse_hex(s: &str) -> Value { Value::Color(Color::new(red, green, blue, alpha, format!("#{}", s))) } 6 => { - let v = match u32::from_str_radix(&s, 16) { + let v = match u32::from_str_radix(s, 16) { Ok(a) => a, Err(_) => return Value::Ident(format!("#{}", s), QuoteKind::None), }; @@ -55,7 +55,7 @@ fn parse_hex(s: &str) -> Value { Value::Color(Color::new(red, green, blue, 1, format!("#{}", s))) } 8 => { - let v = match u32::from_str_radix(&s, 16) { + let v = match u32::from_str_radix(s, 16) { Ok(a) => a, Err(_) => return Value::Ident(format!("#{}", s), QuoteKind::None), }; @@ -258,7 +258,7 @@ impl Value { | q @ TokenKind::Symbol(Symbol::SingleQuote) => { parse_quoted_string(toks, scope, &q, super_selector) } - TokenKind::Variable(ref v) => Ok(scope.get_var(v)?.clone()), + TokenKind::Variable(ref v) => Ok(scope.get_var(v)?), TokenKind::Interpolation => { let mut s = parse_interpolation(toks, scope, super_selector)?.to_string(); while let Some(tok) = toks.peek() {