diff --git a/edn/src/token.rs b/edn/src/token.rs index be7088ed..7a841ae4 100644 --- a/edn/src/token.rs +++ b/edn/src/token.rs @@ -161,7 +161,31 @@ pub trait Atom<'a>: Sized { Num(usize), Sym(&'a str), Key(&'a str), - Exp(TokenIterator<'a>), + Exp(RefAtomIterator<'a>), +} +type RefAtomResult<'a> = Result, ParseError>; +#[derive(Clone, PartialEq)] pub struct RefAtomIterator<'a>(TokenIterator<'a>); +impl<'a> Iterator for RefAtomIterator<'a> { + type Item = RefAtomResult<'a>; + fn next (&mut self) -> Option> { + Some(if let Some(result) = Iterator::next(&mut self.0) { + match result { + Err(e) => Err(e), + Ok(token) => match token.kind { + Nil => Err(ParseError::Empty), + Num => match to_number(token.slice_source(self.0.0)) { + Ok(n) => Ok(RefAtom::Num(n)), + Err(e) => Err(e) + }, + Sym => Ok(RefAtom::Sym(token.slice_source(self.0.0))), + Key => Ok(RefAtom::Key(token.slice_source(self.0.0))), + Exp => todo!() + } + } + } else { + return None + }) + } } impl<'a> RefAtom<'a> { pub fn to_arc_atom (&self) -> ArcAtom { @@ -195,7 +219,9 @@ impl<'a> Atom<'a> for RefAtom<'a> { }, Sym => Ok(RefAtom::Sym(token.slice_source(source))), Key => Ok(RefAtom::Key(token.slice_source(source))), - Exp => Ok(RefAtom::Exp(TokenIterator::new(token.slice_source(source)))) + Exp => Ok( + RefAtom::Exp(RefAtomIterator(TokenIterator::new(token.slice_source(source)))) + ) }, }) }