#![allow(rustdoc::bare_urls)]
#![doc = include_str!("../README.md")]
#![doc = include_str!("../COOKBOOK.md")]
#![doc = include_str!("../ROADMAP.md")]
#![allow(clippy::result_large_err)]
#[cfg(not(feature = "proc_macro2"))]
extern crate proc_macro;
pub mod CHANGELOG {
#![allow(non_snake_case)]
#![allow(clippy::doc_markdown)]
#![doc = include_str!("../CHANGELOG.md")]
}
mod token_iter;
#[doc(inline)]
pub use token_iter::*;
pub trait Parser
where
Self: Sized,
{
#[cfg_attr(feature = "trait_methods_track_caller", track_caller)]
fn parser(tokens: &mut TokenIter) -> Result<Self>;
}
pub trait Parse: Parser {
#[inline]
#[cfg_attr(feature = "trait_methods_track_caller", track_caller)]
fn parse(tokens: &mut TokenIter) -> Result<Self> {
tokens.transaction(Self::parser)
}
#[inline]
#[cfg_attr(feature = "trait_methods_track_caller", track_caller)]
fn parse_all(tokens: &mut TokenIter) -> Result<Self> {
tokens
.transaction(Cons::<Self, EndOfStream>::parser)
.map(|result| result.first)
}
#[cfg_attr(feature = "trait_methods_track_caller", track_caller)]
fn parse_with<T>(
tokens: &mut TokenIter,
f: impl FnOnce(Self, &mut TokenIter) -> Result<T>,
) -> Result<T> {
tokens.transaction(|tokens| {
let result = Self::parser(tokens)?;
f(result, tokens)
})
}
}
impl<T: Parser> Parse for T {}
pub trait ToTokens {
#[cfg_attr(feature = "trait_methods_track_caller", track_caller)]
fn to_tokens(&self, tokens: &mut TokenStream);
#[cfg_attr(feature = "trait_methods_track_caller", track_caller)]
fn to_token_iter(&self) -> TokenIter {
TokenIter::new(self.to_token_stream())
}
#[cfg_attr(feature = "trait_methods_track_caller", track_caller)]
fn into_token_iter(self) -> TokenIter
where
Self: Sized,
{
TokenIter::new(self.into_token_stream())
}
#[cfg_attr(feature = "trait_methods_track_caller", track_caller)]
fn to_token_stream(&self) -> TokenStream {
let mut tokens = TokenStream::new();
self.to_tokens(&mut tokens);
tokens
}
#[inline]
#[mutants::skip]
#[cfg_attr(feature = "trait_methods_track_caller", track_caller)]
fn into_token_stream(self) -> TokenStream
where
Self: Sized,
{
self.to_token_stream()
}
#[inline]
#[cfg_attr(feature = "trait_methods_track_caller", track_caller)]
fn tokens_to_string(&self) -> String {
self.to_token_stream().to_string()
}
}
impl ToTokens for TokenIter {
fn to_tokens(&self, tokens: &mut TokenStream) {
tokens.extend(self.clone());
}
}
impl<T: ToTokens> ToTokens for [T] {
fn to_tokens(&self, tokens: &mut TokenStream) {
for element in self {
element.to_tokens(tokens);
}
}
}
impl std::fmt::Display for dyn ToTokens {
#[mutants::skip]
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.tokens_to_string())
}
}
#[allow(clippy::missing_errors_doc)]
pub trait IParse: private::Sealed {
#[cfg_attr(feature = "trait_methods_track_caller", track_caller)]
fn parse<T: Parse>(self) -> Result<T>;
#[cfg_attr(feature = "trait_methods_track_caller", track_caller)]
fn parse_all<T: Parse>(self) -> Result<T>;
}
impl private::Sealed for &mut TokenIter {}
impl IParse for &mut TokenIter {
#[inline]
fn parse<T: Parse>(self) -> Result<T> {
T::parse(self)
}
#[inline]
fn parse_all<T: Parse>(self) -> Result<T> {
T::parse_all(self)
}
}
pub trait Transaction: Clone {
fn transaction<R>(&mut self, f: impl FnOnce(&mut Self) -> Result<R>) -> Result<R> {
let mut ttokens = self.clone();
#[allow(clippy::manual_inspect)] f(&mut ttokens).map(|result| {
*self = ttokens;
result
})
}
}
impl Transaction for TokenIter {}
mod error;
pub use error::*;
mod macros;
pub mod fundamental;
#[doc(inline)]
pub use fundamental::*;
pub mod group;
#[doc(inline)]
pub use group::*;
pub mod punct;
#[doc(inline)]
pub use punct::*;
pub mod operator;
#[doc(inline)]
pub use operator::{names::*, *};
pub mod literal;
#[doc(inline)]
pub use literal::*;
pub mod rust_types;
#[doc(inline)]
#[allow(unused_imports)]
pub use rust_types::*;
pub mod delimited;
#[doc(inline)]
pub use delimited::*;
pub mod container;
#[doc(inline)]
pub use container::*;
pub mod combinator;
#[doc(inline)]
pub use combinator::*;
pub mod transform;
#[doc(inline)]
pub use transform::*;
pub mod dynamic;
#[doc(inline)]
pub use dynamic::*;
pub mod expressions;
#[doc(inline)]
pub use expressions::*;
pub mod predicates;
#[doc(inline)]
pub use predicates::*;
#[doc(hidden)]
pub mod keyword_group;
pub use keyword_group::*;
pub mod debug;
#[doc(inline)]
pub use debug::*;
#[cfg(feature = "proc_macro2")]
pub use proc_macro2::{
Delimiter, Group, Ident, Literal, Punct, Spacing, Span, TokenStream, TokenTree,
};
#[cfg(not(feature = "proc_macro2"))]
pub use proc_macro::{
Delimiter, Group, Ident, Literal, Punct, Spacing, Span, TokenStream, TokenTree,
};
mod private {
pub trait Sealed {}
}
#[macro_export]
macro_rules! assert_tokens_eq {
($a:expr, $b:expr$(, $($arg:tt)*)?) => {
assert_eq!($a.tokens_to_string(), $b.tokens_to_string() $(, $($arg)*)?);
};
($a:expr, str $b:literal$(, $($arg:tt)*)?) => {
assert_eq!($a.tokens_to_string(), $b $(, $($arg)*)?);
};
}