From c031286c9af655df869b287c52cd25656bbe28a5 Mon Sep 17 00:00:00 2001 From: ConnorSkees <39542938+ConnorSkees@users.noreply.github.com> Date: Mon, 20 Apr 2020 14:49:29 -0400 Subject: [PATCH] refactor number and interpolation utils to separate file --- src/utils/interpolation.rs | 25 +++++++++++++ src/utils/mod.rs | 75 ++------------------------------------ src/utils/number.rs | 55 ++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 71 deletions(-) create mode 100644 src/utils/interpolation.rs create mode 100644 src/utils/number.rs diff --git a/src/utils/interpolation.rs b/src/utils/interpolation.rs new file mode 100644 index 0000000..9154425 --- /dev/null +++ b/src/utils/interpolation.rs @@ -0,0 +1,25 @@ +use std::iter::Iterator; + +use codemap::Spanned; + +use peekmore::PeekMoreIterator; + +use crate::error::SassResult; +use crate::selector::Selector; +use crate::value::Value; +use crate::{Scope, Token}; + +use super::read_until_closing_curly_brace; + +pub(crate) fn parse_interpolation>( + toks: &mut PeekMoreIterator, + scope: &Scope, + super_selector: &Selector, +) -> SassResult> { + let val = Value::from_vec(read_until_closing_curly_brace(toks), scope, super_selector)?; + toks.next(); + Ok(Spanned { + node: val.node.eval(val.span)?.node.unquote(), + span: val.span, + }) +} diff --git a/src/utils/mod.rs b/src/utils/mod.rs index ded63c9..227e585 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -1,82 +1,15 @@ -use std::iter::Iterator; - -use codemap::Spanned; - -use peekmore::PeekMoreIterator; - -use crate::error::SassResult; -use crate::selector::Selector; -use crate::value::Value; -use crate::{Scope, Token}; - pub(crate) use chars::*; pub(crate) use comment_whitespace::*; +pub(crate) use interpolation::*; +pub(crate) use number::*; pub(crate) use read_until::*; pub(crate) use strings::*; pub(crate) use variables::*; mod chars; mod comment_whitespace; +mod interpolation; +mod number; mod read_until; mod strings; mod variables; - -pub(crate) fn parse_interpolation>( - toks: &mut PeekMoreIterator, - scope: &Scope, - super_selector: &Selector, -) -> SassResult> { - let val = Value::from_vec(read_until_closing_curly_brace(toks), scope, super_selector)?; - toks.next(); - Ok(Spanned { - node: val.node.eval(val.span)?.node.unquote(), - span: val.span, - }) -} - -pub(crate) fn eat_number>( - toks: &mut PeekMoreIterator, -) -> SassResult> { - let mut whole = String::new(); - let mut span = if let Some(tok) = toks.peek() { - tok.pos() - } else { - todo!() - }; - while let Some(c) = toks.peek() { - if !c.kind.is_numeric() { - break; - } - let tok = toks.next().unwrap(); - span = span.merge(tok.pos()); - whole.push(tok.kind); - } - - if toks.peek().is_none() { - return Ok(Spanned { node: whole, span }); - } - - let mut dec = String::new(); - - let next_tok = toks.peek().unwrap().clone(); - - if next_tok.kind == '.' { - toks.next(); - dec.push('.'); - while let Some(c) = toks.peek() { - if !c.kind.is_numeric() { - break; - } - let tok = toks.next().unwrap(); - span = span.merge(tok.pos()); - dec.push(tok.kind); - } - } - - if dec.len() == 1 { - return Err(("Expected digit.", next_tok.pos()).into()); - } - - whole.push_str(&dec); - Ok(Spanned { node: whole, span }) -} diff --git a/src/utils/number.rs b/src/utils/number.rs new file mode 100644 index 0000000..2879e57 --- /dev/null +++ b/src/utils/number.rs @@ -0,0 +1,55 @@ +use std::iter::Iterator; + +use codemap::Spanned; + +use peekmore::PeekMoreIterator; + +use crate::error::SassResult; +use crate::Token; + +pub(crate) fn eat_number>( + toks: &mut PeekMoreIterator, +) -> SassResult> { + let mut whole = String::new(); + let mut span = if let Some(tok) = toks.peek() { + tok.pos() + } else { + todo!() + }; + while let Some(c) = toks.peek() { + if !c.kind.is_numeric() { + break; + } + let tok = toks.next().unwrap(); + span = span.merge(tok.pos()); + whole.push(tok.kind); + } + + if toks.peek().is_none() { + return Ok(Spanned { node: whole, span }); + } + + let mut dec = String::new(); + + let next_tok = toks.peek().unwrap().clone(); + + if next_tok.kind == '.' { + toks.next(); + dec.push('.'); + while let Some(c) = toks.peek() { + if !c.kind.is_numeric() { + break; + } + let tok = toks.next().unwrap(); + span = span.merge(tok.pos()); + dec.push(tok.kind); + } + } + + if dec.len() == 1 { + return Err(("Expected digit.", next_tok.pos()).into()); + } + + whole.push_str(&dec); + Ok(Spanned { node: whole, span }) +}