Switch to Cursor in synom
diff --git a/synom/src/lib.rs b/synom/src/lib.rs
index f656e10..d5e69a4 100644
--- a/synom/src/lib.rs
+++ b/synom/src/lib.rs
@@ -45,11 +45,7 @@
pub mod span;
pub mod cursor;
-/// A cursor into a Vec<TokenTree>.
-///
-/// NOTE: This type is currently unnecessary, but will make future refactorings
-/// which change this type easier.
-pub type Cursor<'a> = &'a [TokenTree];
+pub use cursor::{SynomBuffer, Cursor};
/// The result of a parser
pub type PResult<'a, O> = Result<(Cursor<'a>, O), ParseError>;
@@ -69,13 +65,13 @@
}
fn parse_all(input: TokenStream) -> Result<Self, ParseError> {
- let tokens = input.into_iter().collect::<Vec<_>>();
- let result = Self::parse(&tokens);
+ let buf = SynomBuffer::new(input);
+ let result = Self::parse(buf.begin());
let err = match result {
Ok((rest, t)) => {
- if rest.is_empty() {
+ if rest.eof() {
return Ok(t)
- } else if rest.len() == tokens.len() {
+ } else if rest == buf.begin() {
// parsed nothing
"failed to parse"
} else {
@@ -127,8 +123,8 @@
}
impl Synom for TokenStream {
- fn parse(input: &[TokenTree]) -> PResult<Self> {
- Ok((&[], input.iter().cloned().collect()))
+ fn parse(input: Cursor) -> PResult<Self> {
+ Ok((Cursor::empty(), input.token_stream()))
}
}
@@ -352,7 +348,7 @@
let mut input = $i;
loop {
- if input.is_empty() {
+ if input.eof() {
ret = ::std::result::Result::Ok((input, res));
break;
}
@@ -364,7 +360,7 @@
}
::std::result::Result::Ok((i, o)) => {
// loop trip must always consume (otherwise infinite loops)
- if i.len() == input.len() {
+ if i == input {
ret = $crate::parse_error();
break;
}
@@ -392,7 +388,7 @@
let mut res = Vec::new();
loop {
- if input.is_empty() {
+ if input.eof() {
return Ok((input, res));
}
@@ -402,7 +398,7 @@
}
Ok((i, o)) => {
// loop trip must always consume (otherwise infinite loops)
- if i.len() == input.len() {
+ if i == input {
return parse_error();
}
@@ -803,8 +799,8 @@
// Not a public API
#[doc(hidden)]
pub fn input_end(input: Cursor) -> PResult<'static, &'static str> {
- if input.is_empty() {
- Ok((&[], ""))
+ if input.eof() {
+ Ok((Cursor::empty(), ""))
} else {
parse_error()
}