pub struct NotEof;
Expand description
Verifies that parsing did not yet reach the end of the input (i.e., the end of the parse stream at the current level of nesting). Useful for conditionally parsing an optional production with no other obvious prefix token.
Consumes no tokens when parsed, produces no tokens when printed.
#[derive(PartialEq, Eq, Debug, Parse)]
struct SimpleBlockBody {
statement: Lit,
semicolon: Semi,
expression: Maybe<NotEof, Lit>,
}
type SimpleBlock = Brace<SimpleBlockBody>;
let actual_short: SimpleBlock = "{ 54194; }".parse()?;
let expected_short: SimpleBlock = Brace::new(
SimpleBlockBody {
statement: Lit::from(54194_u64),
semicolon: Semi::default(),
expression: Maybe::default(),
},
Span::call_site(),
);
assert_eq!(actual_short, expected_short);
let actual_long: SimpleBlock = "{ 54194; true }".parse()?;
let expected_long: SimpleBlock = Brace::new(
SimpleBlockBody {
statement: Lit::from(54194_u64),
semicolon: Semi::default(),
expression: Maybe::from(Lit::from(true)),
},
Span::call_site(),
);
assert_eq!(actual_long, expected_long);
// an empty string / token stream should trivially fail to parse as `Eof`
let bad: Result<NotEof> = "".parse();
assert!(bad.is_err());
// an empty string / token stream should trivially fail to parse as `Eof`
let bad_ws_only: Result<NotEof> = " \t\n".parse();
assert!(bad_ws_only.is_err());
Implementations§
Trait Implementations§
source§impl Ord for NotEof
impl Ord for NotEof
source§impl PartialEq<NotEof> for NotEof
impl PartialEq<NotEof> for NotEof
source§impl PartialOrd<NotEof> for NotEof
impl PartialOrd<NotEof> for NotEof
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 NotEof
impl ToTokens for NotEof
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 NotEof
impl Eq for NotEof
impl StructuralEq for NotEof
impl StructuralPartialEq for NotEof
Auto Trait Implementations§
impl RefUnwindSafe for NotEof
impl Send for NotEof
impl Sync for NotEof
impl Unpin for NotEof
impl UnwindSafe for NotEof
Blanket Implementations§
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 Twhere
T: Spanned + ?Sized,
impl<T> SpannedExt for Twhere T: Spanned + ?Sized,
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);