pub trait Parsable<Ctx> {
type Parser: Parser<Ctx, Value = Self>;
}Expand description
Sets the default parser for a given type
This trait allows the users of a type to avoid specifying the parser explicitly.
This trait can be procedurally derived for any struct or enum if all its inner types are Parsable or have explicit parser specified.
§Derive macro
The Parsable derive macro accepts attributes that modify parsing behavior. These attributes
are specified in the form #[cmd(...)] attributes can be specifed in the same parenthesis
separated by commas or separately: #[cmd(default, attr(field))] and #[cmd(default)] #[cmd(attr(field))] are equivalent.
§Type attribute
The following attributes are applied to the entire struct or enum for which the trait is being derived.
§ctx = "type-name", ctx_bound = "trait-names"
Restricts the type of the parsing context in case of ctx attribute or bounds the generic
parsing context to the specific trait or collection of traits in case ctx_bound attribute is
used. This is needed when one or more inner parser restricts the type of the context it uses.
The following example demonstrates the creation of a custom parser that requires a specific parsing context and restricting the context type in the derived trait implementation.
use kmdparse::{parse, tokens::TokenStream, CompletionResult, Parsable, Parser, ParseResult};
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
enum LengthUnit { Cm, In }
#[derive(Clone)]
struct ParsingContext {
unit: LengthUnit,
}
#[derive(Debug, PartialEq)]
struct Length(f64, LengthUnit);
#[derive(Default)]
struct LengthParser;
impl Parser<ParsingContext> for LengthParser {
type Value = Length;
fn parse<'a>(&self, input: TokenStream<'a>, ctx: ParsingContext) -> ParseResult<'a, Self::Value> {
let unit = ctx.unit;
let parser = <f64 as Parsable<ParsingContext>>::Parser::default();
let (value, remaining) = parser.parse(input, ctx)?;
Ok((Length(value, unit), remaining))
}
fn complete<'a>(&self, input: TokenStream<'a>, ctx: ParsingContext) -> CompletionResult<'a> {
let parser = <f64 as Parsable<ParsingContext>>::Parser::default();
parser.complete(input, ctx)
}
}
impl Parsable<ParsingContext> for Length {
type Parser = LengthParser;
}
#[derive(Debug, PartialEq, Parsable)]
#[cmd(ctx = "ParsingContext")]
struct Size {
height: Length,
width: Length,
}
assert_eq!(
parse::<_, Size>("10 20", ParsingContext{ unit: LengthUnit::Cm })?,
Size {
height: Length(10.0, LengthUnit::Cm),
width: Length(20.0, LengthUnit::Cm)
}
);§Field attributes
The following attributes can be used for the struct’s or enum variant’s fields.
§parser = "parser-type-name"
Specifies a custom parser used for a field.
This attribute is useful in situations where the required parser is different from the parser
defined by the Parsable trait (which is used by default) or when implementation of Parsable
is not possible (e.g. when dealing with types defined in a foreign crate).
The following example demonstrates how to use TransformParser for data validation.
use kmdparse::parsers::{TransformParser, ParsableTransformation};
use kmdparse::error::ParseError;
use kmdparse::Parsable;
struct Number01RangeValidator;
impl ParsableTransformation<f64> for Number01RangeValidator {
type Input = f64;
fn transform(input: Self::Input) -> Result<f64, ParseError<'static>> {
if input < 0.0 || input >= 1.0 {
Err(ParseError::custom("must be between 0 and 1"))
} else {
Ok(input)
}
}
}
#[derive(Debug, Parsable)]
struct Point(
#[cmd(parser = "TransformParser<<f64 as Parsable<kmdparserCtx>>::Parser, Number01RangeValidator, f64>")] f64,
#[cmd(parser = "TransformParser<<f64 as Parsable<kmdparserCtx>>::Parser, Number01RangeValidator, f64>")] f64,
);§default or default = "value" without attr
If the default attribute is used on a field, this field will not be parsed. Instead, when
constructing the containing instance, the parser uses a default value (if value is not
specified) or a specific value (specified after = sign).
use kmdparse::{Parsable, parse};
#[derive(Debug, PartialEq, Eq, Parsable)]
struct MyStruct(#[cmd(default)] u8, #[cmd(default = "5")] u8, u8);
assert_eq!(parse::<_, MyStruct>("24", ())?, MyStruct(0, 5, 24));§attr(attribute = "value") or attr(attribute)
Indicates that the field is optional, it can be specified by the user using a named attribute. This attribute comes in two variants: when “value” is specified, the field’s value is taken from the expression in the attribute, otherwise the attribute token must be followed by the field value’s tokens.
use kmdparse::{Parsable, parse};
#[derive(Debug, PartialEq, Eq, Parsable)]
enum Color{ Red, Green, Blue }
impl Default for Color {
fn default() -> Self {
Color::Green
}
}
#[derive(Debug, PartialEq, Eq, Parsable)]
struct MyStruct {
#[cmd(attr(important = "true"))] is_important: bool,
#[cmd(attr(color))] color: Color,
}
assert_eq!(
parse::<_, MyStruct>("--important", ())?,
MyStruct { color: Color::Green, is_important: true },
);
assert_eq!(
parse::<_, MyStruct>("--color red", ())?,
MyStruct { color: Color::Red, is_important: false },
);§In combination with default = "value"
If an optional field’s value is not specified, the default value is used instead, as determined
by the implementation of Default trait. This can be overridden by specifying a default value
using default attribute.
use kmdparse::{Parsable, parse};
#[derive(Debug, PartialEq, Eq, Parsable)]
struct MyStruct(#[cmd(default = "5", attr(value))] u8);
assert_eq!(parse::<_, MyStruct>("--value 10", ())?, MyStruct(10));
assert_eq!(parse::<_, MyStruct>("", ())?, MyStruct(5));§alias_value(alias = "alias", value="value")
Used for enum variant’s fields. Specifies the value for a field if the specific alias is used
as enum’s discriminator. An alias can be either a name of a variant (converted into
kebab-case), a renamed variant name (via rename attribute), or an alias defined using alias
attribute.
use kmdparse::{Parsable, parse};
#[derive(Debug, PartialEq, Eq, Parsable)]
enum MyEnum {
#[cmd(alias = "enable", alias = "disable")]
SetEnabled(
#[cmd(
alias_value(alias = "enable", value = "true"),
alias_value(alias = "disable", value = "false")
)] bool
)
}
assert_eq!(parse::<_, MyEnum>("enable", ())?, MyEnum::SetEnabled(true));
assert_eq!(parse::<_, MyEnum>("disable", ())?, MyEnum::SetEnabled(false));§Enum variant attributes
These attributes are applicable to enum variants. Generally, kmdparse expects a
discriminator—the variant’s name in kebab-case followed by tokens for its fields if any exist.
§rename = "name"
Changes the name of the variant’s discriminator. The variant cannot be parsed using its original name.
use kmdparse::{Parsable, parse};
#[derive(Debug, PartialEq, Eq, Parsable)]
enum MyEnum {
#[cmd(rename = "first")] One,
#[cmd(rename = "second")] Two,
}
assert_eq!(parse::<_, MyEnum>("first", ())?, MyEnum::One);
assert!(parse::<_, MyEnum>("one", ()).is_err());§alias = "alias"
Adds an alias for the variant. Variant can have an arbitrary number of aliases and the value can be parsed using any of this. Specifying an alias does not prevent the usage of the variant’s original name.
use kmdparse::{Parsable, parse};
#[derive(Debug, PartialEq, Eq, Parsable)]
enum Color {
Black,
White,
#[cmd(alias = "grey")] Gray,
}
assert_eq!(parse::<_, Color>("grey", ())?, Color::Gray);
assert_eq!(parse::<_, Color>("gray", ())?, Color::Gray);§ignore
Disables the parsing of the variant. Note that this does not prevent assigning aliases to the variant.
use kmdparse::{Parsable, parse};
#[derive(Debug, PartialEq, Eq, Parsable)]
enum MyEnum {
Command,
#[cmd(ignore)] NonInteractive,
}
assert!(parse::<_, MyEnum>("non-interactive", ()).is_err());§transparent
Indicates that a variant can be parsed without a discriminator. This can be used when splitting a large enum into several smaller ones is desirable.
use kmdparse::{Parsable, parse};
#[derive(Debug, PartialEq, Eq, Parsable)]
enum Subcommand { First, Second }
#[derive(Debug, PartialEq, Eq, Parsable)]
enum Command {
#[cmd(transparent)]
Subcommand(Subcommand),
Third,
}
assert_eq!(parse::<_, Command>("first", ())?, Command::Subcommand(Subcommand::First));
assert_eq!(parse::<_, Command>("third", ())?, Command::Third);§transparent_no_error
Functions similarly to transparent but does not terminate parsing on failure. It is useful
when the first field of this variant is not an enum.
use kmdparse::{Parsable, parse};
#[derive(Debug, PartialEq,Parsable)]
enum Value {
#[cmd(transparent_no_error)] Integer(i64),
#[cmd(transparent_no_error)] Real(f64),
#[cmd(transparent_no_error)] Boolean(bool),
}
assert_eq!(parse::<_, Value>("0.4", ())?, Value::Real(0.4));
assert_eq!(parse::<_, Value>("12", ())?, Value::Integer(12));
assert_eq!(parse::<_, Value>("true", ())?, Value::Boolean(true));Note that in the example above, the orders in which the enum variants are declared matters:
kmdparse tries to parse transparent variants in order in which they are declared and
returns the first successfully parsed result.
Required Associated Types§
Implementations on Foreign Types§
Source§impl<Ctx> Parsable<Ctx> for IpAddr
Available on crate feature std only.
impl<Ctx> Parsable<Ctx> for IpAddr
std only.type Parser = FromStrParser<IpAddr>
Source§impl<Ctx> Parsable<Ctx> for SocketAddr
Available on crate feature std only.
impl<Ctx> Parsable<Ctx> for SocketAddr
std only.type Parser = FromStrParser<SocketAddr>
Source§impl<Ctx> Parsable<Ctx> for String
Available on crate feature std only.
impl<Ctx> Parsable<Ctx> for String
std only.type Parser = StringParser
Source§impl<Ctx> Parsable<Ctx> for Ipv4Addr
Available on crate feature std only.
impl<Ctx> Parsable<Ctx> for Ipv4Addr
std only.type Parser = FromStrParser<Ipv4Addr>
Source§impl<Ctx> Parsable<Ctx> for Ipv6Addr
Available on crate feature std only.
impl<Ctx> Parsable<Ctx> for Ipv6Addr
std only.type Parser = FromStrParser<Ipv6Addr>
Source§impl<Ctx> Parsable<Ctx> for SocketAddrV4
Available on crate feature std only.
impl<Ctx> Parsable<Ctx> for SocketAddrV4
std only.type Parser = FromStrParser<SocketAddrV4>
Source§impl<Ctx> Parsable<Ctx> for SocketAddrV6
Available on crate feature std only.
impl<Ctx> Parsable<Ctx> for SocketAddrV6
std only.type Parser = FromStrParser<SocketAddrV6>
Source§impl<Ctx> Parsable<Ctx> for PathBuf
Available on crate feature std only.
impl<Ctx> Parsable<Ctx> for PathBuf
std only.type Parser = PathParser
Source§impl<Ctx> Parsable<Ctx> for NonZeroI16
Available on crate feature std only.
impl<Ctx> Parsable<Ctx> for NonZeroI16
std only.Source§impl<Ctx> Parsable<Ctx> for NonZeroI32
Available on crate feature std only.
impl<Ctx> Parsable<Ctx> for NonZeroI32
std only.Source§impl<Ctx> Parsable<Ctx> for NonZeroI64
Available on crate feature std only.
impl<Ctx> Parsable<Ctx> for NonZeroI64
std only.Source§impl<Ctx> Parsable<Ctx> for NonZeroI128
Available on crate feature std only.
impl<Ctx> Parsable<Ctx> for NonZeroI128
std only.Source§impl<Ctx> Parsable<Ctx> for NonZeroIsize
Available on crate feature std only.
impl<Ctx> Parsable<Ctx> for NonZeroIsize
std only.Source§impl<Ctx> Parsable<Ctx> for NonZeroU16
Available on crate feature std only.
impl<Ctx> Parsable<Ctx> for NonZeroU16
std only.Source§impl<Ctx> Parsable<Ctx> for NonZeroU32
Available on crate feature std only.
impl<Ctx> Parsable<Ctx> for NonZeroU32
std only.Source§impl<Ctx> Parsable<Ctx> for NonZeroU64
Available on crate feature std only.
impl<Ctx> Parsable<Ctx> for NonZeroU64
std only.Source§impl<Ctx> Parsable<Ctx> for NonZeroU128
Available on crate feature std only.
impl<Ctx> Parsable<Ctx> for NonZeroU128
std only.Source§impl<Ctx> Parsable<Ctx> for NonZeroUsize
Available on crate feature std only.
impl<Ctx> Parsable<Ctx> for NonZeroUsize
std only.Source§impl<Ctx, T> Parsable<Ctx> for PhantomData<T>
impl<Ctx, T> Parsable<Ctx> for PhantomData<T>
type Parser = DefaultValueParser<PhantomData<T>>
Source§impl<Ctx, const N: usize> Parsable<Ctx> for String<N>
impl<Ctx, const N: usize> Parsable<Ctx> for String<N>
type Parser = HeaplessStringParser<N>
Source§impl<Ctx: Clone, T1: Parsable<Ctx>, T2: Parsable<Ctx>, T3: Parsable<Ctx>> Parsable<Ctx> for (T1, T2, T3)
impl<Ctx: Clone, T1: Parsable<Ctx>, T2: Parsable<Ctx>, T3: Parsable<Ctx>> Parsable<Ctx> for (T1, T2, T3)
Source§impl<Ctx: Clone, T1: Parsable<Ctx>, T2: Parsable<Ctx>, T3: Parsable<Ctx>, T4: Parsable<Ctx>> Parsable<Ctx> for (T1, T2, T3, T4)
impl<Ctx: Clone, T1: Parsable<Ctx>, T2: Parsable<Ctx>, T3: Parsable<Ctx>, T4: Parsable<Ctx>> Parsable<Ctx> for (T1, T2, T3, T4)
Source§impl<Ctx: Clone, T1: Parsable<Ctx>, T2: Parsable<Ctx>, T3: Parsable<Ctx>, T4: Parsable<Ctx>, T5: Parsable<Ctx>> Parsable<Ctx> for (T1, T2, T3, T4, T5)
impl<Ctx: Clone, T1: Parsable<Ctx>, T2: Parsable<Ctx>, T3: Parsable<Ctx>, T4: Parsable<Ctx>, T5: Parsable<Ctx>> Parsable<Ctx> for (T1, T2, T3, T4, T5)
Source§impl<Ctx: Clone, T1: Parsable<Ctx>, T2: Parsable<Ctx>, T3: Parsable<Ctx>, T4: Parsable<Ctx>, T5: Parsable<Ctx>, T6: Parsable<Ctx>> Parsable<Ctx> for (T1, T2, T3, T4, T5, T6)
impl<Ctx: Clone, T1: Parsable<Ctx>, T2: Parsable<Ctx>, T3: Parsable<Ctx>, T4: Parsable<Ctx>, T5: Parsable<Ctx>, T6: Parsable<Ctx>> Parsable<Ctx> for (T1, T2, T3, T4, T5, T6)
Source§impl<Ctx: Clone, T1: Parsable<Ctx>, T2: Parsable<Ctx>, T3: Parsable<Ctx>, T4: Parsable<Ctx>, T5: Parsable<Ctx>, T6: Parsable<Ctx>, T7: Parsable<Ctx>> Parsable<Ctx> for (T1, T2, T3, T4, T5, T6, T7)
impl<Ctx: Clone, T1: Parsable<Ctx>, T2: Parsable<Ctx>, T3: Parsable<Ctx>, T4: Parsable<Ctx>, T5: Parsable<Ctx>, T6: Parsable<Ctx>, T7: Parsable<Ctx>> Parsable<Ctx> for (T1, T2, T3, T4, T5, T6, T7)
Source§impl<Ctx: Clone, T1: Parsable<Ctx>, T2: Parsable<Ctx>, T3: Parsable<Ctx>, T4: Parsable<Ctx>, T5: Parsable<Ctx>, T6: Parsable<Ctx>, T7: Parsable<Ctx>, T8: Parsable<Ctx>> Parsable<Ctx> for (T1, T2, T3, T4, T5, T6, T7, T8)
impl<Ctx: Clone, T1: Parsable<Ctx>, T2: Parsable<Ctx>, T3: Parsable<Ctx>, T4: Parsable<Ctx>, T5: Parsable<Ctx>, T6: Parsable<Ctx>, T7: Parsable<Ctx>, T8: Parsable<Ctx>> Parsable<Ctx> for (T1, T2, T3, T4, T5, T6, T7, T8)
Source§impl<Ctx: Clone, T1: Parsable<Ctx>, T2: Parsable<Ctx>, T3: Parsable<Ctx>, T4: Parsable<Ctx>, T5: Parsable<Ctx>, T6: Parsable<Ctx>, T7: Parsable<Ctx>, T8: Parsable<Ctx>, T9: Parsable<Ctx>> Parsable<Ctx> for (T1, T2, T3, T4, T5, T6, T7, T8, T9)
impl<Ctx: Clone, T1: Parsable<Ctx>, T2: Parsable<Ctx>, T3: Parsable<Ctx>, T4: Parsable<Ctx>, T5: Parsable<Ctx>, T6: Parsable<Ctx>, T7: Parsable<Ctx>, T8: Parsable<Ctx>, T9: Parsable<Ctx>> Parsable<Ctx> for (T1, T2, T3, T4, T5, T6, T7, T8, T9)
type Parser = TupleParser9<<T1 as Parsable<Ctx>>::Parser, <T2 as Parsable<Ctx>>::Parser, <T3 as Parsable<Ctx>>::Parser, <T4 as Parsable<Ctx>>::Parser, <T5 as Parsable<Ctx>>::Parser, <T6 as Parsable<Ctx>>::Parser, <T7 as Parsable<Ctx>>::Parser, <T8 as Parsable<Ctx>>::Parser, <T9 as Parsable<Ctx>>::Parser>
Source§impl<Ctx: Clone, T1: Parsable<Ctx>, T2: Parsable<Ctx>, T3: Parsable<Ctx>, T4: Parsable<Ctx>, T5: Parsable<Ctx>, T6: Parsable<Ctx>, T7: Parsable<Ctx>, T8: Parsable<Ctx>, T9: Parsable<Ctx>, T10: Parsable<Ctx>> Parsable<Ctx> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)
impl<Ctx: Clone, T1: Parsable<Ctx>, T2: Parsable<Ctx>, T3: Parsable<Ctx>, T4: Parsable<Ctx>, T5: Parsable<Ctx>, T6: Parsable<Ctx>, T7: Parsable<Ctx>, T8: Parsable<Ctx>, T9: Parsable<Ctx>, T10: Parsable<Ctx>> Parsable<Ctx> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)
type Parser = TupleParser10<<T1 as Parsable<Ctx>>::Parser, <T2 as Parsable<Ctx>>::Parser, <T3 as Parsable<Ctx>>::Parser, <T4 as Parsable<Ctx>>::Parser, <T5 as Parsable<Ctx>>::Parser, <T6 as Parsable<Ctx>>::Parser, <T7 as Parsable<Ctx>>::Parser, <T8 as Parsable<Ctx>>::Parser, <T9 as Parsable<Ctx>>::Parser, <T10 as Parsable<Ctx>>::Parser>
Source§impl<Ctx: Clone, T1: Parsable<Ctx>, T2: Parsable<Ctx>, T3: Parsable<Ctx>, T4: Parsable<Ctx>, T5: Parsable<Ctx>, T6: Parsable<Ctx>, T7: Parsable<Ctx>, T8: Parsable<Ctx>, T9: Parsable<Ctx>, T10: Parsable<Ctx>, T11: Parsable<Ctx>> Parsable<Ctx> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)
impl<Ctx: Clone, T1: Parsable<Ctx>, T2: Parsable<Ctx>, T3: Parsable<Ctx>, T4: Parsable<Ctx>, T5: Parsable<Ctx>, T6: Parsable<Ctx>, T7: Parsable<Ctx>, T8: Parsable<Ctx>, T9: Parsable<Ctx>, T10: Parsable<Ctx>, T11: Parsable<Ctx>> Parsable<Ctx> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)
type Parser = TupleParser11<<T1 as Parsable<Ctx>>::Parser, <T2 as Parsable<Ctx>>::Parser, <T3 as Parsable<Ctx>>::Parser, <T4 as Parsable<Ctx>>::Parser, <T5 as Parsable<Ctx>>::Parser, <T6 as Parsable<Ctx>>::Parser, <T7 as Parsable<Ctx>>::Parser, <T8 as Parsable<Ctx>>::Parser, <T9 as Parsable<Ctx>>::Parser, <T10 as Parsable<Ctx>>::Parser, <T11 as Parsable<Ctx>>::Parser>
Source§impl<Ctx: Clone, T1: Parsable<Ctx>, T2: Parsable<Ctx>, T3: Parsable<Ctx>, T4: Parsable<Ctx>, T5: Parsable<Ctx>, T6: Parsable<Ctx>, T7: Parsable<Ctx>, T8: Parsable<Ctx>, T9: Parsable<Ctx>, T10: Parsable<Ctx>, T11: Parsable<Ctx>, T12: Parsable<Ctx>> Parsable<Ctx> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)
impl<Ctx: Clone, T1: Parsable<Ctx>, T2: Parsable<Ctx>, T3: Parsable<Ctx>, T4: Parsable<Ctx>, T5: Parsable<Ctx>, T6: Parsable<Ctx>, T7: Parsable<Ctx>, T8: Parsable<Ctx>, T9: Parsable<Ctx>, T10: Parsable<Ctx>, T11: Parsable<Ctx>, T12: Parsable<Ctx>> Parsable<Ctx> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)
type Parser = TupleParser12<<T1 as Parsable<Ctx>>::Parser, <T2 as Parsable<Ctx>>::Parser, <T3 as Parsable<Ctx>>::Parser, <T4 as Parsable<Ctx>>::Parser, <T5 as Parsable<Ctx>>::Parser, <T6 as Parsable<Ctx>>::Parser, <T7 as Parsable<Ctx>>::Parser, <T8 as Parsable<Ctx>>::Parser, <T9 as Parsable<Ctx>>::Parser, <T10 as Parsable<Ctx>>::Parser, <T11 as Parsable<Ctx>>::Parser, <T12 as Parsable<Ctx>>::Parser>
Source§impl<Ctx: Clone, T1: Parsable<Ctx>, T2: Parsable<Ctx>, T3: Parsable<Ctx>, T4: Parsable<Ctx>, T5: Parsable<Ctx>, T6: Parsable<Ctx>, T7: Parsable<Ctx>, T8: Parsable<Ctx>, T9: Parsable<Ctx>, T10: Parsable<Ctx>, T11: Parsable<Ctx>, T12: Parsable<Ctx>, T13: Parsable<Ctx>> Parsable<Ctx> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)
impl<Ctx: Clone, T1: Parsable<Ctx>, T2: Parsable<Ctx>, T3: Parsable<Ctx>, T4: Parsable<Ctx>, T5: Parsable<Ctx>, T6: Parsable<Ctx>, T7: Parsable<Ctx>, T8: Parsable<Ctx>, T9: Parsable<Ctx>, T10: Parsable<Ctx>, T11: Parsable<Ctx>, T12: Parsable<Ctx>, T13: Parsable<Ctx>> Parsable<Ctx> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)
type Parser = TupleParser13<<T1 as Parsable<Ctx>>::Parser, <T2 as Parsable<Ctx>>::Parser, <T3 as Parsable<Ctx>>::Parser, <T4 as Parsable<Ctx>>::Parser, <T5 as Parsable<Ctx>>::Parser, <T6 as Parsable<Ctx>>::Parser, <T7 as Parsable<Ctx>>::Parser, <T8 as Parsable<Ctx>>::Parser, <T9 as Parsable<Ctx>>::Parser, <T10 as Parsable<Ctx>>::Parser, <T11 as Parsable<Ctx>>::Parser, <T12 as Parsable<Ctx>>::Parser, <T13 as Parsable<Ctx>>::Parser>
Source§impl<Ctx: Clone, T1: Parsable<Ctx>, T2: Parsable<Ctx>, T3: Parsable<Ctx>, T4: Parsable<Ctx>, T5: Parsable<Ctx>, T6: Parsable<Ctx>, T7: Parsable<Ctx>, T8: Parsable<Ctx>, T9: Parsable<Ctx>, T10: Parsable<Ctx>, T11: Parsable<Ctx>, T12: Parsable<Ctx>, T13: Parsable<Ctx>, T14: Parsable<Ctx>> Parsable<Ctx> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)
impl<Ctx: Clone, T1: Parsable<Ctx>, T2: Parsable<Ctx>, T3: Parsable<Ctx>, T4: Parsable<Ctx>, T5: Parsable<Ctx>, T6: Parsable<Ctx>, T7: Parsable<Ctx>, T8: Parsable<Ctx>, T9: Parsable<Ctx>, T10: Parsable<Ctx>, T11: Parsable<Ctx>, T12: Parsable<Ctx>, T13: Parsable<Ctx>, T14: Parsable<Ctx>> Parsable<Ctx> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)
type Parser = TupleParser14<<T1 as Parsable<Ctx>>::Parser, <T2 as Parsable<Ctx>>::Parser, <T3 as Parsable<Ctx>>::Parser, <T4 as Parsable<Ctx>>::Parser, <T5 as Parsable<Ctx>>::Parser, <T6 as Parsable<Ctx>>::Parser, <T7 as Parsable<Ctx>>::Parser, <T8 as Parsable<Ctx>>::Parser, <T9 as Parsable<Ctx>>::Parser, <T10 as Parsable<Ctx>>::Parser, <T11 as Parsable<Ctx>>::Parser, <T12 as Parsable<Ctx>>::Parser, <T13 as Parsable<Ctx>>::Parser, <T14 as Parsable<Ctx>>::Parser>
Source§impl<Ctx: Clone, T1: Parsable<Ctx>, T2: Parsable<Ctx>, T3: Parsable<Ctx>, T4: Parsable<Ctx>, T5: Parsable<Ctx>, T6: Parsable<Ctx>, T7: Parsable<Ctx>, T8: Parsable<Ctx>, T9: Parsable<Ctx>, T10: Parsable<Ctx>, T11: Parsable<Ctx>, T12: Parsable<Ctx>, T13: Parsable<Ctx>, T14: Parsable<Ctx>, T15: Parsable<Ctx>> Parsable<Ctx> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)
impl<Ctx: Clone, T1: Parsable<Ctx>, T2: Parsable<Ctx>, T3: Parsable<Ctx>, T4: Parsable<Ctx>, T5: Parsable<Ctx>, T6: Parsable<Ctx>, T7: Parsable<Ctx>, T8: Parsable<Ctx>, T9: Parsable<Ctx>, T10: Parsable<Ctx>, T11: Parsable<Ctx>, T12: Parsable<Ctx>, T13: Parsable<Ctx>, T14: Parsable<Ctx>, T15: Parsable<Ctx>> Parsable<Ctx> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)
type Parser = TupleParser15<<T1 as Parsable<Ctx>>::Parser, <T2 as Parsable<Ctx>>::Parser, <T3 as Parsable<Ctx>>::Parser, <T4 as Parsable<Ctx>>::Parser, <T5 as Parsable<Ctx>>::Parser, <T6 as Parsable<Ctx>>::Parser, <T7 as Parsable<Ctx>>::Parser, <T8 as Parsable<Ctx>>::Parser, <T9 as Parsable<Ctx>>::Parser, <T10 as Parsable<Ctx>>::Parser, <T11 as Parsable<Ctx>>::Parser, <T12 as Parsable<Ctx>>::Parser, <T13 as Parsable<Ctx>>::Parser, <T14 as Parsable<Ctx>>::Parser, <T15 as Parsable<Ctx>>::Parser>
Source§impl<Ctx: Clone, T1: Parsable<Ctx>, T2: Parsable<Ctx>, T3: Parsable<Ctx>, T4: Parsable<Ctx>, T5: Parsable<Ctx>, T6: Parsable<Ctx>, T7: Parsable<Ctx>, T8: Parsable<Ctx>, T9: Parsable<Ctx>, T10: Parsable<Ctx>, T11: Parsable<Ctx>, T12: Parsable<Ctx>, T13: Parsable<Ctx>, T14: Parsable<Ctx>, T15: Parsable<Ctx>, T16: Parsable<Ctx>> Parsable<Ctx> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16)
impl<Ctx: Clone, T1: Parsable<Ctx>, T2: Parsable<Ctx>, T3: Parsable<Ctx>, T4: Parsable<Ctx>, T5: Parsable<Ctx>, T6: Parsable<Ctx>, T7: Parsable<Ctx>, T8: Parsable<Ctx>, T9: Parsable<Ctx>, T10: Parsable<Ctx>, T11: Parsable<Ctx>, T12: Parsable<Ctx>, T13: Parsable<Ctx>, T14: Parsable<Ctx>, T15: Parsable<Ctx>, T16: Parsable<Ctx>> Parsable<Ctx> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16)
type Parser = TupleParser16<<T1 as Parsable<Ctx>>::Parser, <T2 as Parsable<Ctx>>::Parser, <T3 as Parsable<Ctx>>::Parser, <T4 as Parsable<Ctx>>::Parser, <T5 as Parsable<Ctx>>::Parser, <T6 as Parsable<Ctx>>::Parser, <T7 as Parsable<Ctx>>::Parser, <T8 as Parsable<Ctx>>::Parser, <T9 as Parsable<Ctx>>::Parser, <T10 as Parsable<Ctx>>::Parser, <T11 as Parsable<Ctx>>::Parser, <T12 as Parsable<Ctx>>::Parser, <T13 as Parsable<Ctx>>::Parser, <T14 as Parsable<Ctx>>::Parser, <T15 as Parsable<Ctx>>::Parser, <T16 as Parsable<Ctx>>::Parser>
Source§impl<Ctx: Clone, T: Parsable<Ctx> + Eq + Hash + Ord> Parsable<Ctx> for BTreeSet<T>
Available on crate feature std only.
impl<Ctx: Clone, T: Parsable<Ctx> + Eq + Hash + Ord> Parsable<Ctx> for BTreeSet<T>
std only.Source§impl<Ctx: Clone, T: Parsable<Ctx> + Eq + Hash> Parsable<Ctx> for HashSet<T>
Available on crate feature std only.
impl<Ctx: Clone, T: Parsable<Ctx> + Eq + Hash> Parsable<Ctx> for HashSet<T>
std only.Source§impl<Ctx: Clone, T: Parsable<Ctx>> Parsable<Ctx> for LinkedList<T>
Available on crate feature std only.
impl<Ctx: Clone, T: Parsable<Ctx>> Parsable<Ctx> for LinkedList<T>
std only.type Parser = CollectionParser<LinkedList<T>, <T as Parsable<Ctx>>::Parser>
Source§impl<Ctx: Clone, T: Parsable<Ctx>> Parsable<Ctx> for VecDeque<T>
Available on crate feature std only.
impl<Ctx: Clone, T: Parsable<Ctx>> Parsable<Ctx> for VecDeque<T>
std only.Source§impl<Ctx: Clone, T: Parsable<Ctx>> Parsable<Ctx> for Vec<T>
Available on crate feature std only.
impl<Ctx: Clone, T: Parsable<Ctx>> Parsable<Ctx> for Vec<T>
std only.