mod regular; mod serialization; mod slice_deserializer; mod stream; use std::marker::PhantomData; pub use self::regular::RegularMode; pub use self::serialization::{Deserializer, DeserializerExt, Serializable, Serializer}; pub use self::slice_deserializer::SliceDeserializer; pub use self::stream::{Stream, StreamExt, StreamResultExt}; /// See [`ModeResult`]. pub type ParseSuccess = ::ParseSuccess; /// [`Mode`] equivalent of [`ParseResult`] for extension. /// /// [`ParseResult`]: crate::rcore::ParseResult pub type ExtensionResult = ::ExtensionResult; /// See [`Mode::prepare`]. pub type ExtensionSource = ::ExtensionSource; /// [`Mode`] equivalent of [`ParseResult`]. /// /// [`ParseResult`]: crate::rcore::ParseResult pub type ModeResult = Result, E>; /// Mode of parsing. /// /// | [`Mode`] | [`Mode::ParseSuccess`] | [`Mode::ExtensionResult`] | [`Mode::ExtensionSource`] | /// |------------------|------------------------------|---------------------------------|------------------------------| /// | [`RegularMode`] | `A` | [`Result`] | `A` | /// | [`InliningMode`] | [`(A, I)`] | `E` | [`()`] | /// /// [`InliningMode`]: crate::rstd::inlining::InliningMode /// [`(A, I)`]: tuple /// [`()`]: unit pub trait Mode { /// Successful parsing, may countain the parser itself /// (`I`, usually [`Stream`]). type ParseSuccess; /// Result of extending the value, failing sometimes or always. type ExtensionResult; /// Data enough to try extending the value. /// /// May be empty for always-failing extensions. type ExtensionSource; /// Do something with the successfully parsed value, potentially failing. /// /// Useful for for wrappers and chaining parsing after [`InliningFactory`]. /// /// See also [`Mode::map`] /// /// [`InliningFactory`]: crate::rstd::inlining::InliningFactory fn bind( s: Self::ParseSuccess, f: impl FnOnce(A0) -> Result, ) -> ModeResult; /// Map the successfully parsed value. /// /// Useful for for wrappers. /// /// See also [`Mode::bind`] fn map( s: Self::ParseSuccess, f: impl FnOnce(A0) -> A1, ) -> Self::ParseSuccess; /// Discard any extra information contained in [`Mode::ParseSuccess`]. fn seal(s: Self::ParseSuccess) -> A; /// Map the error of an extension result. /// /// Useful for for wrappers and chaining parsing after [`InliningFactory`]. /// /// [`InliningFactory`]: crate::rstd::inlining::InliningFactory fn xmap_err( result: Self::ExtensionResult, f: impl FnOnce(E0) -> E1, ) -> Self::ExtensionResult; /// Do something with the extension result, potentially failing. /// /// Useful for wrappers and chaining extension after [`InliningFactory`]. /// /// [`InliningFactory`]: crate::rstd::inlining::InliningFactory fn xbind( result: Self::ExtensionResult, f: impl FnOnce(A0) -> Result, ) -> Self::ExtensionResult; /// Convert [`Mode::ExtensionResult`] to [`Result`]. fn xseal(result: Self::ExtensionResult) -> Result; fn smap( source: Self::ExtensionSource, f: impl FnOnce(A0) -> A1, ) -> Self::ExtensionSource; fn prepare(a: A) -> Self::ExtensionSource; /// For abstract extension implementations. fn xsbind( ab: Self::ExtensionSource, t2ab: impl FnOnce(AB) -> (A, B), ce: impl FnOnce(Self::ExtensionSource) -> Self::ExtensionResult, ab2t: impl FnOnce(A, B) -> Result, ) -> Self::ExtensionResult; } /// Type that a [`Mode`] associated with it. pub trait ParseMode { /// Associated [`Mode`]. type Mode: ?Sized + Mode; } /// [`ParseMode`] equivalent of [`ParseSuccess`]. pub type ParseSuccessP = ParseSuccess<::Mode, A, I>; /// [`ParseMode`] equivalent of [`ExtensionResult`]. pub type ExtensionResultP = ExtensionResult<::Mode, A, E>; /// [`ParseMode`] equivalent of [`ExtensionSource`]. pub type ExtensionSourceP = ExtensionSource<::Mode, A>; /// [`ParseMode`] equivalent of [`ModeResult`]. pub type ModeResultP = ModeResult<::Mode, A, E, I>; /// Extension trait for all [`ParseMode`] types, re-exporting [`Mode`] traits. pub trait ParseModeExt: ParseMode { /// [`Mode::bind`]. fn bind( s: ParseSuccessP, f: impl FnOnce(A0) -> Result, ) -> ModeResultP { ::bind(s, f) } /// [`Mode::map`]. fn map( s: ParseSuccessP, f: impl FnOnce(A0) -> A1, ) -> ParseSuccessP { ::map(s, f) } /// [`Mode::seal`]. fn seal(s: ParseSuccessP) -> A { ::seal(s) } /// [`Mode::xmap_err`]. fn xmap_err( result: ExtensionResultP, f: impl FnOnce(E0) -> E1, ) -> ExtensionResultP { ::xmap_err(result, f) } /// [`Mode::xbind`]. fn xbind( result: ExtensionResultP, f: impl FnOnce(A0) -> Result, ) -> ExtensionResultP { ::xbind(result, f) } /// [`Mode::xseal`]. fn xseal(result: ExtensionResultP) -> Result { ::xseal(result) } /// [`Mode::smap`]. fn smap( source: ExtensionSourceP, f: impl FnOnce(A0) -> A1, ) -> ExtensionSourceP { ::smap(source, f) } /// [`Mode::prepare`]. fn prepare(a: A) -> ExtensionSourceP { ::prepare(a) } /// [`Mode::xsbind`]. fn xsbind( ab: ExtensionSourceP, t2ab: impl FnOnce(AB) -> (A, B), ce: impl FnOnce(ExtensionSourceP) -> ExtensionResultP, ab2t: impl FnOnce(A, B) -> Result, ) -> ExtensionResultP { ::xsbind(ab, t2ab, ce, ab2t) } } impl ParseModeExt for F {} /// For auto-implementing [`FactoryParse`] and [`Atomic`]. /// /// [`FactoryParse`]: crate::rcore::FactoryParse /// [`Atomic`]: crate::rstd::atomic::Atomic pub trait ImplMode { /// Same as [`ParseMode::Mode`] type Mode: ?Sized + Mode; } /// Used with [`WithMode`] for linking [`ImplMode`] to [`FactoryParse`] and [`Atomic`]. /// /// [`FactoryParse`]: crate::rcore::FactoryParse /// [`Atomic`]: crate::rstd::atomic::Atomic pub trait WithParseMode: ImplMode { /// [`WithMode`] implementing [`FactoryModeProxy`] or [`AtomicModeProxy`]. /// /// [`FactoryModeProxy`]: crate::rcore::FactoryModeProxy /// [`AtomicModeProxy`]: crate::rstd::atomic::AtomicModeProxy type WithMode: ?Sized; } impl ParseMode for T { type Mode = ::Mode; } impl WithParseMode for T { type WithMode = WithMode::Mode>; } /// Used as [`WithParseMode::WithMode`]. pub struct WithMode(PhantomData, T);