pub struct Eof;
Expand description
Verifies that parsing reached the end of the input (i.e., the end of the parse stream at the current level of nesting). Useful for ensuring that an input or a group is fully parsed by preceding types.
Consumes no tokens when parsed, produces no tokens when printed.
// an empty string / token stream should trivially parse as `Eof`
let _: Eof = "".parse()?;
// so should an all-whitespace one
let _: Eof = "\r\n ".parse()?;
#[derive(PartialEq, Eq, Debug, Parse)]
struct BoolAtEnd {
value: LitBool,
eof: Eof,
}
#[derive(PartialEq, Eq, Debug, Parse)]
enum BoolAtEndOrInt {
Bool(BoolAtEnd),
Int(LitInt),
}
let actual: Punctuated<BoolAtEndOrInt, Comma> = "2, 46, 802, false".parse()?;
let actual: Vec<_> = actual.into_iter().collect();
let expected = [
BoolAtEndOrInt::Int(LitInt::from(2)),
BoolAtEndOrInt::Int(LitInt::from(46)),
BoolAtEndOrInt::Int(LitInt::from(802)),
BoolAtEndOrInt::Bool(BoolAtEnd {
value: LitBool::from(false),
eof: Eof,
}),
];
assert_eq!(actual, expected);
let bad: Result<Punctuated<BoolAtEndOrInt, Comma>> = "2, 46, false, 802".parse();
let message = bad.as_ref().unwrap_err().to_string();
assert!(
message.contains("expected end of input"),
"actual error: {}", message
);
Implementations§
Trait Implementations§
source§impl Ord for Eof
impl Ord for Eof
source§impl PartialOrd for Eof
impl PartialOrd for Eof
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
fn le(&self, other: &Rhs) -> bool
This method tests less than or equal to (for
self
and other
) and is used by the <=
operator. Read moresource§impl ToTokens for Eof
impl ToTokens for Eof
source§fn to_tokens(&self, _tokens: &mut TokenStream)
fn to_tokens(&self, _tokens: &mut TokenStream)
source§fn to_token_stream(&self) -> TokenStream
fn to_token_stream(&self) -> TokenStream
source§fn into_token_stream(self) -> TokenStreamwhere
Self: Sized,
fn into_token_stream(self) -> TokenStreamwhere
Self: Sized,
impl Copy for Eof
impl Eq for Eof
impl StructuralPartialEq for Eof
Auto Trait Implementations§
impl Freeze for Eof
impl RefUnwindSafe for Eof
impl Send for Eof
impl Sync for Eof
impl Unpin for Eof
impl UnwindSafe for Eof
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
source§impl<T> Spanned for Twhere
T: Spanned + ?Sized,
impl<T> Spanned for Twhere
T: Spanned + ?Sized,
source§fn span(&self) -> Span
fn span(&self) -> Span
Returns a
Span
covering the complete contents of this syntax tree
node, or Span::call_site()
if this node is empty.source§impl<T> SpannedExt for T
impl<T> SpannedExt for T
source§fn byte_range(&self, source: &str) -> Range<usize>
fn byte_range(&self, source: &str) -> Range<usize>
TODO(H2CO3): a faster, less naive implementation would be great.
We should use the byte offset of start
to compute that of end
,
sparing the double scan of the source up until the start location.
let source = r#"
-3.667
1248 "string ű literal"
"wíőzs"
"#;
let tokens: Many<Lit> = source.parse()?;
assert_eq!(tokens.len(), 4);
assert_eq!(tokens[0].byte_range(source), 4..10);
assert_eq!(tokens[1].byte_range(source), 13..17);
assert_eq!(tokens[2].byte_range(source), 19..38);
assert_eq!(tokens[3].byte_range(source), 45..54);
source§fn char_range(&self, source: &str) -> Range<usize>
fn char_range(&self, source: &str) -> Range<usize>
TODO(H2CO3): a faster, less naive implementation would be great.
We should use the char offset of start
to compute that of end
,
sparing the double scan of the source up until the start location.
let source = r#"
-3.667
1248 "string ű literal"
"wíőzs"
"#;
let tokens: Many<Lit> = source.parse()?;
assert_eq!(tokens.len(), 4);
assert_eq!(tokens[0].char_range(source), 4..10);
assert_eq!(tokens[1].char_range(source), 13..17);
assert_eq!(tokens[2].char_range(source), 19..37);
assert_eq!(tokens[3].char_range(source), 44..51);