From 4c235b972e2400bd2bb92b74b12558b485dc7142 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?cel=20=F0=9F=8C=B8?= Date: Mon, 11 Nov 2024 14:37:57 +0000 Subject: [PATCH] move Parser traits' generic outputs into associated types --- src/xml/parsers.rs | 368 +++++++++++++++++++++++++++--------- src/xml/parsers_complete.rs | 368 +++++++++++++++++++++++++++--------- 2 files changed, 550 insertions(+), 186 deletions(-) diff --git a/src/xml/parsers.rs b/src/xml/parsers.rs index 293e552..773302f 100644 --- a/src/xml/parsers.rs +++ b/src/xml/parsers.rs @@ -29,13 +29,17 @@ use super::{ TokenizedType, UnprefixedName, VersionInfo, VersionNum, XMLDecl, PI, S, }; -pub trait Parser<'s, T> { - fn parse(input: &'s str) -> IResult<&str, T>; +pub trait Parser<'s> { + type Output; + + fn parse(input: &'s str) -> IResult<&str, Self::Output>; } /// [1] NSAttName ::= PrefixedAttName | DefaultAttName -impl<'s> Parser<'s, NSAttName<'s>> for NSAttName<'s> { - fn parse(input: &'s str) -> IResult<&str, NSAttName<'s>> { +impl<'s> Parser<'s> for NSAttName<'s> { + type Output = NSAttName<'s>; + + fn parse(input: &'s str) -> IResult<&str, Self::Output> { alt(( map(PrefixedAttName::parse, |prefixed_att_name| { NSAttName::PrefixedAttName(prefixed_att_name) @@ -46,7 +50,9 @@ impl<'s> Parser<'s, NSAttName<'s>> for NSAttName<'s> { } /// [2] PrefixedAttName ::= 'xmlns:' NCName -impl<'s> Parser<'s, PrefixedAttName<'s>> for PrefixedAttName<'s> { +impl<'s> Parser<'s> for PrefixedAttName<'s> { + type Output = PrefixedAttName<'s>; + fn parse(input: &'s str) -> IResult<&str, PrefixedAttName<'s>> { map(preceded(tag("xmlns:"), NCName::parse), |nc_name| { PrefixedAttName(nc_name) @@ -55,7 +61,9 @@ impl<'s> Parser<'s, PrefixedAttName<'s>> for PrefixedAttName<'s> { } /// [3] DefaultAttName ::= 'xmlns'; -impl Parser<'_, DefaultAttName> for DefaultAttName { +impl Parser<'_> for DefaultAttName { + type Output = DefaultAttName; + fn parse(input: &str) -> IResult<&str, DefaultAttName> { value(DefaultAttName, tag("xmlns"))(input) } @@ -63,7 +71,9 @@ impl Parser<'_, DefaultAttName> for DefaultAttName { /// [5] Name ::= NameStartChar (NameChar)* /// [4] NCName ::= Name - (Char* ':' Char*) -impl<'s> Parser<'s, NCName<'s>> for NCName<'s> { +impl<'s> Parser<'s> for NCName<'s> { + type Output = NCName<'s>; + fn parse(input: &'s str) -> IResult<&str, NCName<'s>> { let (rest, name) = peek(recognize(Name::parse))(input)?; if let Some(char) = name.find(':') { @@ -75,7 +85,9 @@ impl<'s> Parser<'s, NCName<'s>> for NCName<'s> { } /// [7] QName ::= PrefixedName | UnprefixedName -impl<'s> Parser<'s, QName<'s>> for QName<'s> { +impl<'s> Parser<'s> for QName<'s> { + type Output = QName<'s>; + fn parse(input: &'s str) -> IResult<&str, QName<'s>> { alt(( map(PrefixedName::parse, |prefixed_name| { @@ -89,7 +101,9 @@ impl<'s> Parser<'s, QName<'s>> for QName<'s> { } /// [8] PrefixedName ::= Prefix ':' LocalPart -impl<'s> Parser<'s, PrefixedName<'s>> for PrefixedName<'s> { +impl<'s> Parser<'s> for PrefixedName<'s> { + type Output = PrefixedName<'s>; + fn parse(input: &'s str) -> IResult<&str, PrefixedName<'s>> { map( separated_pair(Prefix::parse, char(':'), LocalPart::parse), @@ -99,21 +113,27 @@ impl<'s> Parser<'s, PrefixedName<'s>> for PrefixedName<'s> { } /// [9] UnprefixedName ::= LocalPart -impl<'s> Parser<'s, UnprefixedName<'s>> for UnprefixedName<'s> { +impl<'s> Parser<'s> for UnprefixedName<'s> { + type Output = UnprefixedName<'s>; + fn parse(input: &'s str) -> IResult<&str, UnprefixedName<'s>> { map(LocalPart::parse, |local_part| UnprefixedName(local_part))(input) } } /// [10] Prefix ::= NCName -impl<'s> Parser<'s, Prefix<'s>> for Prefix<'s> { +impl<'s> Parser<'s> for Prefix<'s> { + type Output = Prefix<'s>; + fn parse(input: &'s str) -> IResult<&str, Prefix<'s>> { map(NCName::parse, |nc_name| Prefix(nc_name))(input) } } /// [11] LocalPart ::= NCName -impl<'s> Parser<'s, LocalPart<'s>> for LocalPart<'s> { +impl<'s> Parser<'s> for LocalPart<'s> { + type Output = LocalPart<'s>; + fn parse(input: &'s str) -> IResult<&str, LocalPart<'s>> { map(NCName::parse, |nc_name| LocalPart(nc_name))(input) } @@ -122,14 +142,18 @@ impl<'s> Parser<'s, LocalPart<'s>> for LocalPart<'s> { // xml spec /// [1] document ::= prolog element Misc* -impl<'s> Parser<'s, Document<'s>> for Document<'s> { +impl<'s> Parser<'s> for Document<'s> { + type Output = Document<'s>; + fn parse(input: &'s str) -> IResult<&str, Document<'s>> { tuple((Prolog::parse, Element::parse, many0(Misc::parse)))(input) } } /// [2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */ -impl Parser<'_, Char> for Char { +impl Parser<'_> for Char { + type Output = Char; + fn parse(input: &str) -> IResult<&str, Char> { map( satisfy( @@ -141,7 +165,9 @@ impl Parser<'_, Char> for Char { } /// [3] S ::= (#x20 | #x9 | #xD | #xA)+ -impl Parser<'_, S> for S { +impl Parser<'_> for S { + type Output = S; + fn parse(input: &str) -> IResult<&str, S> { // TODO?: whitespacing // map(is_a("\u{20}\u{9}\u{D}\u{A}"), |s| S(s))(input) @@ -150,7 +176,9 @@ impl Parser<'_, S> for S { } /// [4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF] -impl Parser<'_, NameStartChar> for NameStartChar { +impl Parser<'_> for NameStartChar { + type Output = NameStartChar; + fn parse(input: &str) -> IResult<&str, NameStartChar> { map( satisfy( @@ -162,7 +190,9 @@ impl Parser<'_, NameStartChar> for NameStartChar { } /// [4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040] -impl Parser<'_, NameChar> for NameChar { +impl Parser<'_> for NameChar { + type Output = NameChar; + fn parse(input: &str) -> IResult<&str, NameChar> { map( alt(( @@ -177,7 +207,9 @@ impl Parser<'_, NameChar> for NameChar { } /// [5] Name ::= NameStartChar (NameChar)* -impl<'s> Parser<'s, Name<'s>> for Name<'s> { +impl<'s> Parser<'s> for Name<'s> { + type Output = Name<'s>; + fn parse(input: &'s str) -> IResult<&str, Name<'s>> { map( recognize(pair(NameStartChar::parse, many0(NameChar::parse))), @@ -187,7 +219,9 @@ impl<'s> Parser<'s, Name<'s>> for Name<'s> { } /// [6] Names ::= Name (#x20 Name)* -impl<'s> Parser<'s, Names<'s>> for Names<'s> { +impl<'s> Parser<'s> for Names<'s> { + type Output = Names<'s>; + // TODO: fix fn parse(input: &'s str) -> IResult<&str, Names<'s>> { map( @@ -198,7 +232,9 @@ impl<'s> Parser<'s, Names<'s>> for Names<'s> { } /// [7] Nmtoken ::= (NameChar)+ -impl<'s> Parser<'s, Nmtoken<'s>> for Nmtoken<'s> { +impl<'s> Parser<'s> for Nmtoken<'s> { + type Output = Nmtoken<'s>; + fn parse(input: &'s str) -> IResult<&str, Nmtoken<'s>> { map(recognize(many1(NameChar::parse)), |nmtoken| { Nmtoken(nmtoken) @@ -207,7 +243,9 @@ impl<'s> Parser<'s, Nmtoken<'s>> for Nmtoken<'s> { } /// [8] Nmtokens ::= Nmtoken (#x20 Nmtoken)* -impl<'s> Parser<'s, Nmtokens<'s>> for Nmtokens<'s> { +impl<'s> Parser<'s> for Nmtokens<'s> { + type Output = Nmtokens<'s>; + fn parse(input: &'s str) -> IResult<&str, Nmtokens<'s>> { map( pair( @@ -221,7 +259,9 @@ impl<'s> Parser<'s, Nmtokens<'s>> for Nmtokens<'s> { /// [9] EntityValue ::= '"' ([^%&"] | PEReference | Reference)* '"' /// | "'" ([^%&'] | PEReference | Reference)* "'" -impl<'s> Parser<'s, EntityValue<'s>> for EntityValue<'s> { +impl<'s> Parser<'s> for EntityValue<'s> { + type Output = EntityValue<'s>; + fn parse(input: &'s str) -> IResult<&str, EntityValue<'s>> { alt(( map( @@ -268,7 +308,9 @@ impl<'s> Parser<'s, EntityValue<'s>> for EntityValue<'s> { /// [10] AttValue ::= '"' ([^<&"] | Reference)* '"' /// | "'" ([^<&'] | Reference)* "'" -impl<'s> Parser<'s, AttValue<'s>> for AttValue<'s> { +impl<'s> Parser<'s> for AttValue<'s> { + type Output = AttValue<'s>; + fn parse(input: &'s str) -> IResult<&str, AttValue<'s>> { alt(( map( @@ -302,7 +344,9 @@ impl<'s> Parser<'s, AttValue<'s>> for AttValue<'s> { } /// [11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'") -impl<'s> Parser<'s, SystemLiteral<'s>> for SystemLiteral<'s> { +impl<'s> Parser<'s> for SystemLiteral<'s> { + type Output = SystemLiteral<'s>; + fn parse(input: &'s str) -> IResult<&str, SystemLiteral<'s>> { alt(( map( @@ -318,7 +362,9 @@ impl<'s> Parser<'s, SystemLiteral<'s>> for SystemLiteral<'s> { } /// [12] PubidLiteral ::= '"' PubidChar* '"' | "'" (PubidChar - "'")* "'" -impl<'s> Parser<'s, PubidLiteral<'s>> for PubidLiteral<'s> { +impl<'s> Parser<'s> for PubidLiteral<'s> { + type Output = PubidLiteral<'s>; + fn parse(input: &'s str) -> IResult<&str, PubidLiteral<'s>> { alt(( map( @@ -338,7 +384,9 @@ impl<'s> Parser<'s, PubidLiteral<'s>> for PubidLiteral<'s> { } /// [13] PubidChar ::= #x20 | #xD | #xA | [a-zA-Z0-9] | [-'()+,./:=?;!*#@$_%] -impl Parser<'_, PubidChar> for PubidChar { +impl Parser<'_> for PubidChar { + type Output = PubidChar; + fn parse(input: &'_ str) -> IResult<&str, PubidChar> { map( satisfy( @@ -350,7 +398,9 @@ impl Parser<'_, PubidChar> for PubidChar { } /// [14] CharData ::= [^<&]* - ([^<&]* ']]>' [^<&]*) -impl<'s> Parser<'s, CharData<'s>> for CharData<'s> { +impl<'s> Parser<'s> for CharData<'s> { + type Output = CharData<'s>; + fn parse(input: &'s str) -> IResult<&str, CharData<'s>> { map( recognize(many_till( @@ -363,7 +413,9 @@ impl<'s> Parser<'s, CharData<'s>> for CharData<'s> { } /// Comment ::= '' -impl<'s> Parser<'s, Comment<'s>> for Comment<'s> { +impl<'s> Parser<'s> for Comment<'s> { + type Output = Comment<'s>; + fn parse(input: &'s str) -> IResult<&str, Comment<'s>> { map( delimited( @@ -377,7 +429,9 @@ impl<'s> Parser<'s, Comment<'s>> for Comment<'s> { } /// [16] PI ::= '' Char*)))? '?>' -impl<'s> Parser<'s, PI<'s>> for PI<'s> { +impl<'s> Parser<'s> for PI<'s> { + type Output = PI<'s>; + fn parse(input: &'s str) -> IResult<&str, PI<'s>> { map( delimited( @@ -400,7 +454,9 @@ impl<'s> Parser<'s, PI<'s>> for PI<'s> { } /// [17] PITarget ::= Name - (('X' | 'x') ('M' | 'm') ('L' | 'l')) -impl<'s> Parser<'s, PITarget<'s>> for PITarget<'s> { +impl<'s> Parser<'s> for PITarget<'s> { + type Output = PITarget<'s>; + fn parse(input: &'s str) -> IResult<&str, PITarget<'s>> { let (rest, name) = Name::parse(input)?; if name.0.to_lowercase() == "xml" { @@ -416,7 +472,9 @@ impl<'s> Parser<'s, PITarget<'s>> for PITarget<'s> { } /// [18] CDSect ::= CDStart CData CDEnd -impl<'s> Parser<'s, CDSect<'s>> for CDSect<'s> { +impl<'s> Parser<'s> for CDSect<'s> { + type Output = CDSect<'s>; + fn parse(input: &'s str) -> IResult<&str, CDSect<'s>> { map( delimited(CDStart::parse, CData::parse, CDEnd::parse), @@ -426,14 +484,18 @@ impl<'s> Parser<'s, CDSect<'s>> for CDSect<'s> { } /// [19] CDStart ::= ' for CDStart { +impl Parser<'_> for CDStart { + type Output = CDStart; + fn parse(input: &'_ str) -> IResult<&str, CDStart> { value(CDStart, tag("' Char*)) -impl<'s> Parser<'s, CData<'s>> for CData<'s> { +impl<'s> Parser<'s> for CData<'s> { + type Output = CData<'s>; + fn parse(input: &'s str) -> IResult<&str, CData<'s>> { map( recognize(many_till(Char::parse, peek(tag("]]>")))), @@ -443,14 +505,18 @@ impl<'s> Parser<'s, CData<'s>> for CData<'s> { } /// [21] CDEnd ::= ']]>' -impl Parser<'_, CDEnd> for CDEnd { +impl Parser<'_> for CDEnd { + type Output = CDEnd; + fn parse(input: &'_ str) -> IResult<&str, CDEnd> { value(CDEnd, tag("]]>"))(input) } } /// [22] prolog ::= XMLDecl? Misc* (doctypedecl Misc*)? -impl<'s> Parser<'s, Prolog<'s>> for Prolog<'s> { +impl<'s> Parser<'s> for Prolog<'s> { + type Output = Prolog<'s>; + fn parse(input: &'s str) -> IResult<&str, Prolog<'s>> { tuple(( opt(XMLDecl::parse), @@ -461,7 +527,9 @@ impl<'s> Parser<'s, Prolog<'s>> for Prolog<'s> { } /// [23] XMLDecl ::= '' -impl<'s> Parser<'s, XMLDecl<'s>> for XMLDecl<'s> { +impl<'s> Parser<'s> for XMLDecl<'s> { + type Output = XMLDecl<'s>; + fn parse(input: &'s str) -> IResult<&str, XMLDecl<'s>> { map( delimited( @@ -483,7 +551,9 @@ impl<'s> Parser<'s, XMLDecl<'s>> for XMLDecl<'s> { } /// [24] VersionInfo ::= S 'version' Eq ("'" VersionNum "'" | '"' VersionNum '"') -impl Parser<'_, VersionInfo> for VersionInfo { +impl Parser<'_> for VersionInfo { + type Output = VersionInfo; + fn parse(input: &'_ str) -> IResult<&str, VersionInfo> { preceded( tuple((S::parse, tag("version"), Eq::parse)), @@ -502,7 +572,9 @@ impl Parser<'_, VersionInfo> for VersionInfo { } /// [25] Eq ::= S? '=' S? -impl Parser<'_, Eq> for Eq { +impl Parser<'_> for Eq { + type Output = Eq; + fn parse(input: &'_ str) -> IResult<&str, Eq> { value( Eq, @@ -512,7 +584,9 @@ impl Parser<'_, Eq> for Eq { } /// [26] VersionNum ::= '1.' [0-9]+ -impl Parser<'_, VersionNum> for VersionNum { +impl Parser<'_> for VersionNum { + type Output = VersionNum; + fn parse(input: &'_ str) -> IResult<&str, VersionNum> { preceded( tag("1."), @@ -525,7 +599,9 @@ impl Parser<'_, VersionNum> for VersionNum { } /// [27] Misc ::= Comment | PI | S -impl<'s> Parser<'s, Misc<'s>> for Misc<'s> { +impl<'s> Parser<'s> for Misc<'s> { + type Output = Misc<'s>; + fn parse(input: &'s str) -> IResult<&str, Misc<'s>> { alt(( map(Comment::parse, |comment| Misc::Comment(comment)), @@ -537,7 +613,9 @@ impl<'s> Parser<'s, Misc<'s>> for Misc<'s> { /// [16] doctypedecl ::= '' /// [28] doctypedecl ::= '' -impl<'s> Parser<'s, DoctypeDecl<'s>> for DoctypeDecl<'s> { +impl<'s> Parser<'s> for DoctypeDecl<'s> { + type Output = DoctypeDecl<'s>; + fn parse(input: &'s str) -> IResult<&str, DoctypeDecl<'s>> { map( delimited( @@ -565,7 +643,9 @@ impl<'s> Parser<'s, DoctypeDecl<'s>> for DoctypeDecl<'s> { } /// [28a] DeclSep ::= PEReference | S -impl<'s> Parser<'s, DeclSep<'s>> for DeclSep<'s> { +impl<'s> Parser<'s> for DeclSep<'s> { + type Output = DeclSep<'s>; + fn parse(input: &'s str) -> IResult<&str, DeclSep<'s>> { alt(( map(PEReference::parse, |pe_reference| { @@ -577,7 +657,9 @@ impl<'s> Parser<'s, DeclSep<'s>> for DeclSep<'s> { } /// [28b] intSubset ::= (markupdecl | DeclSep)* -impl<'s> Parser<'s, IntSubset<'s>> for IntSubset<'s> { +impl<'s> Parser<'s> for IntSubset<'s> { + type Output = IntSubset<'s>; + fn parse(input: &'s str) -> IResult<&str, IntSubset<'s>> { many0(alt(( map(MarkupDecl::parse, |markup_decl| { @@ -591,7 +673,9 @@ impl<'s> Parser<'s, IntSubset<'s>> for IntSubset<'s> { } /// [29] markupdecl ::= elementdecl | AttlistDecl | EntityDecl | NotationDecl | PI | Comment -impl<'s> Parser<'s, MarkupDecl<'s>> for MarkupDecl<'s> { +impl<'s> Parser<'s> for MarkupDecl<'s> { + type Output = MarkupDecl<'s>; + fn parse(input: &'s str) -> IResult<&str, MarkupDecl<'s>> { alt(( map(Elementdecl::parse, |elementdecl| { @@ -613,7 +697,9 @@ impl<'s> Parser<'s, MarkupDecl<'s>> for MarkupDecl<'s> { } /// [30] extSubset ::= TextDecl? extSubsetDecl -impl<'s> Parser<'s, ExtSubset<'s>> for ExtSubset<'s> { +impl<'s> Parser<'s> for ExtSubset<'s> { + type Output = ExtSubset<'s>; + fn parse(input: &'s str) -> IResult<&str, ExtSubset<'s>> { map( pair(opt(TextDecl::parse), ExtSubsetDecl::parse), @@ -626,7 +712,9 @@ impl<'s> Parser<'s, ExtSubset<'s>> for ExtSubset<'s> { } /// [31] extSubsetDecl ::= ( markupdecl | conditionalSect | DeclSep)* -impl<'s> Parser<'s, ExtSubsetDecl<'s>> for ExtSubsetDecl<'s> { +impl<'s> Parser<'s> for ExtSubsetDecl<'s> { + type Output = ExtSubsetDecl<'s>; + fn parse(input: &'s str) -> IResult<&str, ExtSubsetDecl<'s>> { many0(alt(( map(MarkupDecl::parse, |markup_decl| { @@ -643,7 +731,9 @@ impl<'s> Parser<'s, ExtSubsetDecl<'s>> for ExtSubsetDecl<'s> { } /// [32] SDDecl ::= S 'standalone' Eq (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no') '"')) -impl Parser<'_, SDDecl> for SDDecl { +impl Parser<'_> for SDDecl { + type Output = SDDecl; + fn parse(input: &'_ str) -> IResult<&str, SDDecl> { preceded( tuple((S::parse, tag("standalone"), Eq::parse)), @@ -672,7 +762,9 @@ impl Parser<'_, SDDecl> for SDDecl { // (Productions 33 through 38 have been removed.) /// [39] element ::= EmptyElemTag | STag content ETag -impl<'s> Parser<'s, Element<'s>> for Element<'s> { +impl<'s> Parser<'s> for Element<'s> { + type Output = Element<'s>; + fn parse(input: &'s str) -> IResult<&str, Element<'s>> { alt(( map(EmptyElemTag::parse, |empty_elem_tag| { @@ -688,7 +780,9 @@ impl<'s> Parser<'s, Element<'s>> for Element<'s> { /// [12] STag ::= '<' QName (S Attribute)* S? '>' /// [40] STag ::= '<' Name (S Attribute)* S? '>' -impl<'s> Parser<'s, STag<'s>> for STag<'s> { +impl<'s> Parser<'s> for STag<'s> { + type Output = STag<'s>; + fn parse(input: &'s str) -> IResult<&str, STag<'s>> { map( delimited( @@ -702,7 +796,9 @@ impl<'s> Parser<'s, STag<'s>> for STag<'s> { } /// [15] Attribute ::= NSAttName Eq AttValue | QName Eq AttValue -impl<'s> Parser<'s, Attribute<'s>> for Attribute<'s> { +impl<'s> Parser<'s> for Attribute<'s> { + type Output = Attribute<'s>; + fn parse(input: &'s str) -> IResult<&str, Attribute<'s>> { alt(( map( @@ -724,7 +820,9 @@ impl<'s> Parser<'s, Attribute<'s>> for Attribute<'s> { /// [13] ETag ::= '' /// [42] ETag ::= '' -impl<'s> Parser<'s, ETag<'s>> for ETag<'s> { +impl<'s> Parser<'s> for ETag<'s> { + type Output = ETag<'s>; + fn parse(input: &'s str) -> IResult<&str, ETag<'s>> { map( delimited(tag(""))), @@ -733,7 +831,9 @@ impl<'s> Parser<'s, ETag<'s>> for ETag<'s> { } } -impl<'s> Parser<'s, ContentItem<'s>> for ContentItem<'s> { +impl<'s> Parser<'s> for ContentItem<'s> { + type Output = ContentItem<'s>; + fn parse(input: &'s str) -> IResult<&str, ContentItem<'s>> { alt(( map(Element::parse, |element| ContentItem::Element(element)), @@ -748,7 +848,9 @@ impl<'s> Parser<'s, ContentItem<'s>> for ContentItem<'s> { } /// [43] content ::= CharData? ((element | Reference | CDSect | PI | Comment) CharData?)* -impl<'s> Parser<'s, Content<'s>> for Content<'s> { +impl<'s> Parser<'s> for Content<'s> { + type Output = Content<'s>; + fn parse(input: &'s str) -> IResult<&str, Content<'s>> { map( pair( @@ -773,7 +875,9 @@ impl<'s> Parser<'s, Content<'s>> for Content<'s> { /// [14] EmptyElemTag ::= '<' QName (S Attribute)* S? '/>' /// [44] EmptyElemTag ::= '<' Name (S Attribute)* S? '/>' [WFC: Unique Att Spec] -impl<'s> Parser<'s, EmptyElemTag<'s>> for EmptyElemTag<'s> { +impl<'s> Parser<'s> for EmptyElemTag<'s> { + type Output = EmptyElemTag<'s>; + fn parse(input: &'s str) -> IResult<&str, EmptyElemTag<'s>> { map( delimited( @@ -788,7 +892,9 @@ impl<'s> Parser<'s, EmptyElemTag<'s>> for EmptyElemTag<'s> { /// [17] elementdecl ::= '' /// [45] elementdecl ::= '' -impl<'s> Parser<'s, Elementdecl<'s>> for Elementdecl<'s> { +impl<'s> Parser<'s> for Elementdecl<'s> { + type Output = Elementdecl<'s>; + fn parse(input: &'s str) -> IResult<&str, Elementdecl> { map( delimited( @@ -802,7 +908,9 @@ impl<'s> Parser<'s, Elementdecl<'s>> for Elementdecl<'s> { } /// [46] contentspec ::= 'EMPTY' | 'ANY' | Mixed | children -impl<'s> Parser<'s, Contentspec<'s>> for Contentspec<'s> { +impl<'s> Parser<'s> for Contentspec<'s> { + type Output = Contentspec<'s>; + fn parse(input: &'s str) -> IResult<&str, Contentspec<'s>> { alt(( value(Contentspec::Empty, tag("EMPTY")), @@ -814,7 +922,9 @@ impl<'s> Parser<'s, Contentspec<'s>> for Contentspec<'s> { } /// Occurence ::= ('?' | '*' | '+')? -impl Parser<'_, Occurence> for Occurence { +impl Parser<'_> for Occurence { + type Output = Occurence; + fn parse(input: &'_ str) -> IResult<&str, Occurence> { map( opt(alt((tag("?"), tag("*"), tag("+")))), @@ -829,7 +939,9 @@ impl Parser<'_, Occurence> for Occurence { } /// [47] children ::= (choice | seq) ('?' | '*' | '+')? -impl<'s> Parser<'s, Children<'s>> for Children<'s> { +impl<'s> Parser<'s> for Children<'s> { + type Output = Children<'s>; + fn parse(input: &'s str) -> IResult<&str, Children<'s>> { map( pair( @@ -846,7 +958,9 @@ impl<'s> Parser<'s, Children<'s>> for Children<'s> { /// [18] cp ::= (QName | choice | seq) ('?' | '*' | '+')? /// [48] cp ::= (Name | choice | seq) ('?' | '*' | '+')? -impl<'s> Parser<'s, Cp<'s>> for Cp<'s> { +impl<'s> Parser<'s> for Cp<'s> { + type Output = Cp<'s>; + fn parse(input: &'s str) -> IResult<&str, Cp<'s>> { map( pair( @@ -863,7 +977,9 @@ impl<'s> Parser<'s, Cp<'s>> for Cp<'s> { } /// [49] choice ::= '(' S? cp ( S? '|' S? cp )+ S? ')' -impl<'s> Parser<'s, Choice<'s>> for Choice<'s> { +impl<'s> Parser<'s> for Choice<'s> { + type Output = Choice<'s>; + fn parse(input: &'s str) -> IResult<&str, Choice<'s>> { map( delimited( @@ -886,7 +1002,9 @@ impl<'s> Parser<'s, Choice<'s>> for Choice<'s> { } /// [50] seq ::= '(' S? cp ( S? ',' S? cp )* S? ')' -impl<'s> Parser<'s, Seq<'s>> for Seq<'s> { +impl<'s> Parser<'s> for Seq<'s> { + type Output = Seq<'s>; + fn parse(input: &'s str) -> IResult<&str, Seq<'s>> { map( delimited( @@ -910,7 +1028,9 @@ impl<'s> Parser<'s, Seq<'s>> for Seq<'s> { /// [19] Mixed ::= '(' S? '#PCDATA' (S? '|' S? QName)* S? ')*' | '(' S? '#PCDATA' S? ')' /// [51] Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*' | '(' S? '#PCDATA' S? ')' -impl<'s> Parser<'s, Mixed<'s>> for Mixed<'s> { +impl<'s> Parser<'s> for Mixed<'s> { + type Output = Mixed<'s>; + fn parse(input: &'s str) -> IResult<&str, Mixed<'s>> { alt(( map( @@ -940,7 +1060,9 @@ impl<'s> Parser<'s, Mixed<'s>> for Mixed<'s> { /// [20] AttlistDecl ::= '' /// [52] AttlistDecl ::= '' -impl<'s> Parser<'s, AttlistDecl<'s>> for AttlistDecl<'s> { +impl<'s> Parser<'s> for AttlistDecl<'s> { + type Output = AttlistDecl<'s>; + fn parse(input: &'s str) -> IResult<&str, AttlistDecl<'s>> { map( delimited( @@ -958,7 +1080,9 @@ impl<'s> Parser<'s, AttlistDecl<'s>> for AttlistDecl<'s> { /// [21] AttDef ::= S (QName | NSAttName) S AttType S DefaultDecl /// [53] AttDef ::= S Name S AttType S DefaultDecl -impl<'s> Parser<'s, AttDef<'s>> for AttDef<'s> { +impl<'s> Parser<'s> for AttDef<'s> { + type Output = AttDef<'s>; + fn parse(input: &'s str) -> IResult<&str, AttDef<'s>> { map( tuple(( @@ -984,7 +1108,9 @@ impl<'s> Parser<'s, AttDef<'s>> for AttDef<'s> { } /// [54] AttType ::= StringType | TokenizedType | EnumeratedType -impl<'s> Parser<'s, AttType<'s>> for AttType<'s> { +impl<'s> Parser<'s> for AttType<'s> { + type Output = AttType<'s>; + fn parse(input: &'s str) -> IResult<&str, AttType<'s>> { alt(( value(AttType::StringType, StringType::parse), @@ -999,14 +1125,18 @@ impl<'s> Parser<'s, AttType<'s>> for AttType<'s> { } /// [55] StringType ::= 'CDATA' -impl Parser<'_, StringType> for StringType { +impl Parser<'_> for StringType { + type Output = StringType; + fn parse(input: &'_ str) -> IResult<&str, StringType> { value(StringType, tag("CDATA"))(input) } } /// [56] TokenizedType ::= 'ID' | 'IDREF' | 'IDREFS' | 'ENTITY' | 'ENTITIES' | 'NMTOKEN' | 'NMTOKENS' -impl Parser<'_, TokenizedType> for TokenizedType { +impl Parser<'_> for TokenizedType { + type Output = TokenizedType; + fn parse(input: &'_ str) -> IResult<&str, TokenizedType> { alt(( value(TokenizedType::ID, tag("ID")), @@ -1024,7 +1154,9 @@ impl Parser<'_, TokenizedType> for TokenizedType { } /// [57] EnumeratedType ::= NotationType | Enumeration -impl<'s> Parser<'s, EnumeratedType<'s>> for EnumeratedType<'s> { +impl<'s> Parser<'s> for EnumeratedType<'s> { + type Output = EnumeratedType<'s>; + fn parse(input: &'s str) -> IResult<&str, EnumeratedType<'s>> { alt(( map(NotationType::parse, |notation_type| { @@ -1038,7 +1170,9 @@ impl<'s> Parser<'s, EnumeratedType<'s>> for EnumeratedType<'s> { } /// [58] NotationType ::= 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')' -impl<'s> Parser<'s, NotationType<'s>> for NotationType<'s> { +impl<'s> Parser<'s> for NotationType<'s> { + type Output = NotationType<'s>; + fn parse(input: &'s str) -> IResult<&str, NotationType<'s>> { map( delimited( @@ -1061,7 +1195,9 @@ impl<'s> Parser<'s, NotationType<'s>> for NotationType<'s> { } /// [59] Enumeration ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')' -impl<'s> Parser<'s, Enumeration<'s>> for Enumeration<'s> { +impl<'s> Parser<'s> for Enumeration<'s> { + type Output = Enumeration<'s>; + fn parse(input: &'s str) -> IResult<&str, Enumeration<'s>> { map( delimited( @@ -1084,7 +1220,9 @@ impl<'s> Parser<'s, Enumeration<'s>> for Enumeration<'s> { } /// [60] DefaultDecl ::= '#REQUIRED' | '#IMPLIED' | (('#FIXED' S)? AttValue) -impl<'s> Parser<'s, DefaultDecl<'s>> for DefaultDecl<'s> { +impl<'s> Parser<'s> for DefaultDecl<'s> { + type Output = DefaultDecl<'s>; + fn parse(input: &'s str) -> IResult<&str, DefaultDecl<'s>> { alt(( value(DefaultDecl::Required, tag("#REQUIRED")), @@ -1098,7 +1236,9 @@ impl<'s> Parser<'s, DefaultDecl<'s>> for DefaultDecl<'s> { } /// [61] conditionalSect ::= includeSect | ignoreSect -impl<'s> Parser<'s, ConditionalSect<'s>> for ConditionalSect<'s> { +impl<'s> Parser<'s> for ConditionalSect<'s> { + type Output = ConditionalSect<'s>; + fn parse(input: &'s str) -> IResult<&str, ConditionalSect<'s>> { alt(( map(IncludeSect::parse, |include_sect| { @@ -1112,7 +1252,9 @@ impl<'s> Parser<'s, ConditionalSect<'s>> for ConditionalSect<'s> { } /// [62] includeSect ::= '' -impl<'s> Parser<'s, IncludeSect<'s>> for IncludeSect<'s> { +impl<'s> Parser<'s> for IncludeSect<'s> { + type Output = IncludeSect<'s>; + fn parse(input: &'s str) -> IResult<&str, IncludeSect<'s>> { map( delimited( @@ -1132,7 +1274,9 @@ impl<'s> Parser<'s, IncludeSect<'s>> for IncludeSect<'s> { } /// [63] ignoreSect ::= '' -impl<'s> Parser<'s, IgnoreSect<'s>> for IgnoreSect<'s> { +impl<'s> Parser<'s> for IgnoreSect<'s> { + type Output = IgnoreSect<'s>; + fn parse(input: &'s str) -> IResult<&str, IgnoreSect<'s>> { map( delimited( @@ -1152,7 +1296,9 @@ impl<'s> Parser<'s, IgnoreSect<'s>> for IgnoreSect<'s> { } /// [64] ignoreSectContents ::= Ignore ('' Ignore)* -impl<'s> Parser<'s, IgnoreSectContents<'s>> for IgnoreSectContents<'s> { +impl<'s> Parser<'s> for IgnoreSectContents<'s> { + type Output = IgnoreSectContents<'s>; + fn parse(input: &'s str) -> IResult<&str, IgnoreSectContents<'s>> { map( pair( @@ -1171,7 +1317,9 @@ impl<'s> Parser<'s, IgnoreSectContents<'s>> for IgnoreSectContents<'s> { } /// [65] Ignore ::= Char* - (Char* ('') Char*) -impl<'s> Parser<'s, Ignore<'s>> for Ignore<'s> { +impl<'s> Parser<'s> for Ignore<'s> { + type Output = Ignore<'s>; + fn parse(input: &'s str) -> IResult<&str, Ignore<'s>> { map( recognize(many_till(Char::parse, peek(alt((tag("")))))), @@ -1181,7 +1329,9 @@ impl<'s> Parser<'s, Ignore<'s>> for Ignore<'s> { } /// [66] CharRef ::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';' -impl<'s> Parser<'s, CharRef<'s>> for CharRef<'s> { +impl<'s> Parser<'s> for CharRef<'s> { + type Output = CharRef<'s>; + fn parse(input: &'s str) -> IResult<&str, CharRef<'s>> { alt(( delimited( @@ -1204,7 +1354,9 @@ impl<'s> Parser<'s, CharRef<'s>> for CharRef<'s> { } /// [67] Reference ::= EntityRef | CharRef -impl<'s> Parser<'s, Reference<'s>> for Reference<'s> { +impl<'s> Parser<'s> for Reference<'s> { + type Output = Reference<'s>; + fn parse(input: &'s str) -> IResult<&str, Reference<'s>> { alt(( map(EntityRef::parse, |entity_ref| { @@ -1216,7 +1368,9 @@ impl<'s> Parser<'s, Reference<'s>> for Reference<'s> { } /// [68] EntityRef ::= '&' Name ';' -impl<'s> Parser<'s, EntityRef<'s>> for EntityRef<'s> { +impl<'s> Parser<'s> for EntityRef<'s> { + type Output = EntityRef<'s>; + fn parse(input: &'s str) -> IResult<&str, EntityRef<'s>> { map(delimited(tag("&"), Name::parse, tag(";")), |entity_ref| { EntityRef(entity_ref) @@ -1225,7 +1379,9 @@ impl<'s> Parser<'s, EntityRef<'s>> for EntityRef<'s> { } /// [69] PEReference ::= '%' Name ';' -impl<'s> Parser<'s, PEReference<'s>> for PEReference<'s> { +impl<'s> Parser<'s> for PEReference<'s> { + type Output = PEReference<'s>; + fn parse(input: &'s str) -> IResult<&str, PEReference<'s>> { map(delimited(tag("%"), Name::parse, tag(";")), |pe_reference| { PEReference(pe_reference) @@ -1234,7 +1390,9 @@ impl<'s> Parser<'s, PEReference<'s>> for PEReference<'s> { } /// [70] EntityDecl ::= GEDecl | PEDecl -impl<'s> Parser<'s, EntityDecl<'s>> for EntityDecl<'s> { +impl<'s> Parser<'s> for EntityDecl<'s> { + type Output = EntityDecl<'s>; + fn parse(input: &'s str) -> IResult<&str, EntityDecl<'s>> { alt(( map(GEDecl::parse, |ge_decl| EntityDecl::GEDecl(ge_decl)), @@ -1244,7 +1402,9 @@ impl<'s> Parser<'s, EntityDecl<'s>> for EntityDecl<'s> { } /// [71] GEDecl ::= '' -impl<'s> Parser<'s, GEDecl<'s>> for GEDecl<'s> { +impl<'s> Parser<'s> for GEDecl<'s> { + type Output = GEDecl<'s>; + fn parse(input: &'s str) -> IResult<&str, GEDecl<'s>> { map( delimited( @@ -1258,7 +1418,9 @@ impl<'s> Parser<'s, GEDecl<'s>> for GEDecl<'s> { } /// [72] PEDecl ::= '' -impl<'s> Parser<'s, PEDecl<'s>> for PEDecl<'s> { +impl<'s> Parser<'s> for PEDecl<'s> { + type Output = PEDecl<'s>; + fn parse(input: &'s str) -> IResult<&str, PEDecl<'s>> { map( delimited( @@ -1272,7 +1434,9 @@ impl<'s> Parser<'s, PEDecl<'s>> for PEDecl<'s> { } /// [73] EntityDef ::= EntityValue | (ExternalID NDataDecl?) -impl<'s> Parser<'s, EntityDef<'s>> for EntityDef<'s> { +impl<'s> Parser<'s> for EntityDef<'s> { + type Output = EntityDef<'s>; + fn parse(input: &'s str) -> IResult<&str, EntityDef<'s>> { alt(( map(EntityValue::parse, |entity_value| { @@ -1290,7 +1454,9 @@ impl<'s> Parser<'s, EntityDef<'s>> for EntityDef<'s> { } /// [74] PEDef ::= EntityValue | ExternalID -impl<'s> Parser<'s, PEDef<'s>> for PEDef<'s> { +impl<'s> Parser<'s> for PEDef<'s> { + type Output = PEDef<'s>; + fn parse(input: &'s str) -> IResult<&str, PEDef<'s>> { alt(( map(EntityValue::parse, |entity_value| { @@ -1305,7 +1471,9 @@ impl<'s> Parser<'s, PEDef<'s>> for PEDef<'s> { /// [75] ExternalID ::= 'SYSTEM' S SystemLiteral | 'PUBLIC' S PubidLiteral S SystemLiteral // pub fn external_id(input: &str) -> IResult<&str, ExternalID> { -impl<'s> Parser<'s, ExternalID<'s>> for ExternalID<'s> { +impl<'s> Parser<'s> for ExternalID<'s> { + type Output = ExternalID<'s>; + fn parse(input: &'s str) -> IResult<&str, ExternalID<'s>> { alt(( map( @@ -1327,7 +1495,9 @@ impl<'s> Parser<'s, ExternalID<'s>> for ExternalID<'s> { } /// [76] NDataDecl ::= S 'NDATA' S Name -impl<'s> Parser<'s, NDataDecl<'s>> for NDataDecl<'s> { +impl<'s> Parser<'s> for NDataDecl<'s> { + type Output = NDataDecl<'s>; + fn parse(input: &'s str) -> IResult<&str, NDataDecl<'s>> { map( preceded(tuple((S::parse, tag("NDATA"), S::parse)), Name::parse), @@ -1337,7 +1507,9 @@ impl<'s> Parser<'s, NDataDecl<'s>> for NDataDecl<'s> { } /// [77] TextDecl ::= '' -impl<'s> Parser<'s, TextDecl<'s>> for TextDecl<'s> { +impl<'s> Parser<'s> for TextDecl<'s> { + type Output = TextDecl<'s>; + fn parse(input: &'s str) -> IResult<&str, TextDecl<'s>> { map( delimited( @@ -1357,7 +1529,9 @@ impl<'s> Parser<'s, TextDecl<'s>> for TextDecl<'s> { } /// [78] extParsedEnt ::= TextDecl? content -impl<'s> Parser<'s, ExtParsedEnt<'s>> for ExtParsedEnt<'s> { +impl<'s> Parser<'s> for ExtParsedEnt<'s> { + type Output = ExtParsedEnt<'s>; + fn parse(input: &'s str) -> IResult<&str, ExtParsedEnt<'s>> { map( pair(opt(TextDecl::parse), Content::parse), @@ -1367,7 +1541,9 @@ impl<'s> Parser<'s, ExtParsedEnt<'s>> for ExtParsedEnt<'s> { } /// [80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' | "'" EncName -impl<'s> Parser<'s, EncodingDecl<'s>> for EncodingDecl<'s> { +impl<'s> Parser<'s> for EncodingDecl<'s> { + type Output = EncodingDecl<'s>; + fn parse(input: &'s str) -> IResult<&str, EncodingDecl<'s>> { map( preceded( @@ -1383,7 +1559,9 @@ impl<'s> Parser<'s, EncodingDecl<'s>> for EncodingDecl<'s> { } /// [81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')* -impl<'s> Parser<'s, EncName<'s>> for EncName<'s> { +impl<'s> Parser<'s> for EncName<'s> { + type Output = EncName<'s>; + fn parse(input: &'s str) -> IResult<&str, EncName<'s>> { map( recognize(pair( @@ -1398,7 +1576,9 @@ impl<'s> Parser<'s, EncName<'s>> for EncName<'s> { } /// [82] NotationDecl ::= '' -impl<'s> Parser<'s, NotationDecl<'s>> for NotationDecl<'s> { +impl<'s> Parser<'s> for NotationDecl<'s> { + type Output = NotationDecl<'s>; + fn parse(input: &'s str) -> IResult<&str, NotationDecl<'s>> { map( delimited( @@ -1423,7 +1603,9 @@ impl<'s> Parser<'s, NotationDecl<'s>> for NotationDecl<'s> { } /// [83] PublicID ::= 'PUBLIC' S PubidLiteral -impl<'s> Parser<'s, PublicID<'s>> for PublicID<'s> { +impl<'s> Parser<'s> for PublicID<'s> { + type Output = PublicID<'s>; + fn parse(input: &'s str) -> IResult<&str, PublicID<'s>> { map( preceded(pair(tag("PUBLIC"), S::parse), PubidLiteral::parse), diff --git a/src/xml/parsers_complete.rs b/src/xml/parsers_complete.rs index fff8bf2..b057f62 100644 --- a/src/xml/parsers_complete.rs +++ b/src/xml/parsers_complete.rs @@ -26,13 +26,17 @@ use super::{ TokenizedType, UnprefixedName, VersionInfo, VersionNum, XMLDecl, PI, S, }; -pub trait Parser<'s, T> { - fn parse(input: &'s str) -> IResult<&str, T>; +pub trait Parser<'s> { + type Output; + + fn parse(input: &'s str) -> IResult<&str, Self::Output>; } /// [1] NSAttName ::= PrefixedAttName | DefaultAttName -impl<'s> Parser<'s, NSAttName<'s>> for NSAttName<'s> { - fn parse(input: &'s str) -> IResult<&str, NSAttName<'s>> { +impl<'s> Parser<'s> for NSAttName<'s> { + type Output = NSAttName<'s>; + + fn parse(input: &'s str) -> IResult<&str, Self::Output> { alt(( map(PrefixedAttName::parse, |prefixed_att_name| { NSAttName::PrefixedAttName(prefixed_att_name) @@ -43,7 +47,9 @@ impl<'s> Parser<'s, NSAttName<'s>> for NSAttName<'s> { } /// [2] PrefixedAttName ::= 'xmlns:' NCName -impl<'s> Parser<'s, PrefixedAttName<'s>> for PrefixedAttName<'s> { +impl<'s> Parser<'s> for PrefixedAttName<'s> { + type Output = PrefixedAttName<'s>; + fn parse(input: &'s str) -> IResult<&str, PrefixedAttName<'s>> { map(preceded(tag("xmlns:"), NCName::parse), |nc_name| { PrefixedAttName(nc_name) @@ -52,7 +58,9 @@ impl<'s> Parser<'s, PrefixedAttName<'s>> for PrefixedAttName<'s> { } /// [3] DefaultAttName ::= 'xmlns'; -impl Parser<'_, DefaultAttName> for DefaultAttName { +impl Parser<'_> for DefaultAttName { + type Output = DefaultAttName; + fn parse(input: &str) -> IResult<&str, DefaultAttName> { value(DefaultAttName, tag("xmlns"))(input) } @@ -60,7 +68,9 @@ impl Parser<'_, DefaultAttName> for DefaultAttName { /// [5] Name ::= NameStartChar (NameChar)* /// [4] NCName ::= Name - (Char* ':' Char*) -impl<'s> Parser<'s, NCName<'s>> for NCName<'s> { +impl<'s> Parser<'s> for NCName<'s> { + type Output = NCName<'s>; + fn parse(input: &'s str) -> IResult<&str, NCName<'s>> { let (rest, name) = peek(recognize(Name::parse))(input)?; if let Some(char) = name.find(':') { @@ -72,7 +82,9 @@ impl<'s> Parser<'s, NCName<'s>> for NCName<'s> { } /// [7] QName ::= PrefixedName | UnprefixedName -impl<'s> Parser<'s, QName<'s>> for QName<'s> { +impl<'s> Parser<'s> for QName<'s> { + type Output = QName<'s>; + fn parse(input: &'s str) -> IResult<&str, QName<'s>> { alt(( map(PrefixedName::parse, |prefixed_name| { @@ -86,7 +98,9 @@ impl<'s> Parser<'s, QName<'s>> for QName<'s> { } /// [8] PrefixedName ::= Prefix ':' LocalPart -impl<'s> Parser<'s, PrefixedName<'s>> for PrefixedName<'s> { +impl<'s> Parser<'s> for PrefixedName<'s> { + type Output = PrefixedName<'s>; + fn parse(input: &'s str) -> IResult<&str, PrefixedName<'s>> { map( separated_pair(Prefix::parse, char(':'), LocalPart::parse), @@ -96,21 +110,27 @@ impl<'s> Parser<'s, PrefixedName<'s>> for PrefixedName<'s> { } /// [9] UnprefixedName ::= LocalPart -impl<'s> Parser<'s, UnprefixedName<'s>> for UnprefixedName<'s> { +impl<'s> Parser<'s> for UnprefixedName<'s> { + type Output = UnprefixedName<'s>; + fn parse(input: &'s str) -> IResult<&str, UnprefixedName<'s>> { map(LocalPart::parse, |local_part| UnprefixedName(local_part))(input) } } /// [10] Prefix ::= NCName -impl<'s> Parser<'s, Prefix<'s>> for Prefix<'s> { +impl<'s> Parser<'s> for Prefix<'s> { + type Output = Prefix<'s>; + fn parse(input: &'s str) -> IResult<&str, Prefix<'s>> { map(NCName::parse, |nc_name| Prefix(nc_name))(input) } } /// [11] LocalPart ::= NCName -impl<'s> Parser<'s, LocalPart<'s>> for LocalPart<'s> { +impl<'s> Parser<'s> for LocalPart<'s> { + type Output = LocalPart<'s>; + fn parse(input: &'s str) -> IResult<&str, LocalPart<'s>> { map(NCName::parse, |nc_name| LocalPart(nc_name))(input) } @@ -119,14 +139,18 @@ impl<'s> Parser<'s, LocalPart<'s>> for LocalPart<'s> { // xml spec /// [1] document ::= prolog element Misc* -impl<'s> Parser<'s, Document<'s>> for Document<'s> { +impl<'s> Parser<'s> for Document<'s> { + type Output = Document<'s>; + fn parse(input: &'s str) -> IResult<&str, Document<'s>> { tuple((Prolog::parse, Element::parse, many0(Misc::parse)))(input) } } /// [2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */ -impl Parser<'_, Char> for Char { +impl Parser<'_> for Char { + type Output = Char; + fn parse(input: &str) -> IResult<&str, Char> { map( satisfy( @@ -138,7 +162,9 @@ impl Parser<'_, Char> for Char { } /// [3] S ::= (#x20 | #x9 | #xD | #xA)+ -impl Parser<'_, S> for S { +impl Parser<'_> for S { + type Output = S; + fn parse(input: &str) -> IResult<&str, S> { // TODO?: whitespacing // map(is_a("\u{20}\u{9}\u{D}\u{A}"), |s| S(s))(input) @@ -147,7 +173,9 @@ impl Parser<'_, S> for S { } /// [4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF] -impl Parser<'_, NameStartChar> for NameStartChar { +impl Parser<'_> for NameStartChar { + type Output = NameStartChar; + fn parse(input: &str) -> IResult<&str, NameStartChar> { map( satisfy( @@ -159,7 +187,9 @@ impl Parser<'_, NameStartChar> for NameStartChar { } /// [4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040] -impl Parser<'_, NameChar> for NameChar { +impl Parser<'_> for NameChar { + type Output = NameChar; + fn parse(input: &str) -> IResult<&str, NameChar> { map( alt(( @@ -174,7 +204,9 @@ impl Parser<'_, NameChar> for NameChar { } /// [5] Name ::= NameStartChar (NameChar)* -impl<'s> Parser<'s, Name<'s>> for Name<'s> { +impl<'s> Parser<'s> for Name<'s> { + type Output = Name<'s>; + fn parse(input: &'s str) -> IResult<&str, Name<'s>> { map( recognize(pair(NameStartChar::parse, many0(NameChar::parse))), @@ -184,7 +216,9 @@ impl<'s> Parser<'s, Name<'s>> for Name<'s> { } /// [6] Names ::= Name (#x20 Name)* -impl<'s> Parser<'s, Names<'s>> for Names<'s> { +impl<'s> Parser<'s> for Names<'s> { + type Output = Names<'s>; + // TODO: fix fn parse(input: &'s str) -> IResult<&str, Names<'s>> { map( @@ -195,7 +229,9 @@ impl<'s> Parser<'s, Names<'s>> for Names<'s> { } /// [7] Nmtoken ::= (NameChar)+ -impl<'s> Parser<'s, Nmtoken<'s>> for Nmtoken<'s> { +impl<'s> Parser<'s> for Nmtoken<'s> { + type Output = Nmtoken<'s>; + fn parse(input: &'s str) -> IResult<&str, Nmtoken<'s>> { map(recognize(many1(NameChar::parse)), |nmtoken| { Nmtoken(nmtoken) @@ -204,7 +240,9 @@ impl<'s> Parser<'s, Nmtoken<'s>> for Nmtoken<'s> { } /// [8] Nmtokens ::= Nmtoken (#x20 Nmtoken)* -impl<'s> Parser<'s, Nmtokens<'s>> for Nmtokens<'s> { +impl<'s> Parser<'s> for Nmtokens<'s> { + type Output = Nmtokens<'s>; + fn parse(input: &'s str) -> IResult<&str, Nmtokens<'s>> { map( pair( @@ -218,7 +256,9 @@ impl<'s> Parser<'s, Nmtokens<'s>> for Nmtokens<'s> { /// [9] EntityValue ::= '"' ([^%&"] | PEReference | Reference)* '"' /// | "'" ([^%&'] | PEReference | Reference)* "'" -impl<'s> Parser<'s, EntityValue<'s>> for EntityValue<'s> { +impl<'s> Parser<'s> for EntityValue<'s> { + type Output = EntityValue<'s>; + fn parse(input: &'s str) -> IResult<&str, EntityValue<'s>> { alt(( map( @@ -265,7 +305,9 @@ impl<'s> Parser<'s, EntityValue<'s>> for EntityValue<'s> { /// [10] AttValue ::= '"' ([^<&"] | Reference)* '"' /// | "'" ([^<&'] | Reference)* "'" -impl<'s> Parser<'s, AttValue<'s>> for AttValue<'s> { +impl<'s> Parser<'s> for AttValue<'s> { + type Output = AttValue<'s>; + fn parse(input: &'s str) -> IResult<&str, AttValue<'s>> { alt(( map( @@ -299,7 +341,9 @@ impl<'s> Parser<'s, AttValue<'s>> for AttValue<'s> { } /// [11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'") -impl<'s> Parser<'s, SystemLiteral<'s>> for SystemLiteral<'s> { +impl<'s> Parser<'s> for SystemLiteral<'s> { + type Output = SystemLiteral<'s>; + fn parse(input: &'s str) -> IResult<&str, SystemLiteral<'s>> { alt(( map( @@ -315,7 +359,9 @@ impl<'s> Parser<'s, SystemLiteral<'s>> for SystemLiteral<'s> { } /// [12] PubidLiteral ::= '"' PubidChar* '"' | "'" (PubidChar - "'")* "'" -impl<'s> Parser<'s, PubidLiteral<'s>> for PubidLiteral<'s> { +impl<'s> Parser<'s> for PubidLiteral<'s> { + type Output = PubidLiteral<'s>; + fn parse(input: &'s str) -> IResult<&str, PubidLiteral<'s>> { alt(( map( @@ -335,7 +381,9 @@ impl<'s> Parser<'s, PubidLiteral<'s>> for PubidLiteral<'s> { } /// [13] PubidChar ::= #x20 | #xD | #xA | [a-zA-Z0-9] | [-'()+,./:=?;!*#@$_%] -impl Parser<'_, PubidChar> for PubidChar { +impl Parser<'_> for PubidChar { + type Output = PubidChar; + fn parse(input: &'_ str) -> IResult<&str, PubidChar> { map( satisfy( @@ -347,7 +395,9 @@ impl Parser<'_, PubidChar> for PubidChar { } /// [14] CharData ::= [^<&]* - ([^<&]* ']]>' [^<&]*) -impl<'s> Parser<'s, CharData<'s>> for CharData<'s> { +impl<'s> Parser<'s> for CharData<'s> { + type Output = CharData<'s>; + fn parse(input: &'s str) -> IResult<&str, CharData<'s>> { map( recognize(many_till( @@ -360,7 +410,9 @@ impl<'s> Parser<'s, CharData<'s>> for CharData<'s> { } /// Comment ::= '' -impl<'s> Parser<'s, Comment<'s>> for Comment<'s> { +impl<'s> Parser<'s> for Comment<'s> { + type Output = Comment<'s>; + fn parse(input: &'s str) -> IResult<&str, Comment<'s>> { map( delimited( @@ -374,7 +426,9 @@ impl<'s> Parser<'s, Comment<'s>> for Comment<'s> { } /// [16] PI ::= '' Char*)))? '?>' -impl<'s> Parser<'s, PI<'s>> for PI<'s> { +impl<'s> Parser<'s> for PI<'s> { + type Output = PI<'s>; + fn parse(input: &'s str) -> IResult<&str, PI<'s>> { map( delimited( @@ -397,7 +451,9 @@ impl<'s> Parser<'s, PI<'s>> for PI<'s> { } /// [17] PITarget ::= Name - (('X' | 'x') ('M' | 'm') ('L' | 'l')) -impl<'s> Parser<'s, PITarget<'s>> for PITarget<'s> { +impl<'s> Parser<'s> for PITarget<'s> { + type Output = PITarget<'s>; + fn parse(input: &'s str) -> IResult<&str, PITarget<'s>> { let (rest, name) = Name::parse(input)?; if name.0.to_lowercase() == "xml" { @@ -413,7 +469,9 @@ impl<'s> Parser<'s, PITarget<'s>> for PITarget<'s> { } /// [18] CDSect ::= CDStart CData CDEnd -impl<'s> Parser<'s, CDSect<'s>> for CDSect<'s> { +impl<'s> Parser<'s> for CDSect<'s> { + type Output = CDSect<'s>; + fn parse(input: &'s str) -> IResult<&str, CDSect<'s>> { map( delimited(CDStart::parse, CData::parse, CDEnd::parse), @@ -423,14 +481,18 @@ impl<'s> Parser<'s, CDSect<'s>> for CDSect<'s> { } /// [19] CDStart ::= ' for CDStart { +impl Parser<'_> for CDStart { + type Output = CDStart; + fn parse(input: &'_ str) -> IResult<&str, CDStart> { value(CDStart, tag("' Char*)) -impl<'s> Parser<'s, CData<'s>> for CData<'s> { +impl<'s> Parser<'s> for CData<'s> { + type Output = CData<'s>; + fn parse(input: &'s str) -> IResult<&str, CData<'s>> { map( recognize(many_till(Char::parse, peek(tag("]]>")))), @@ -440,14 +502,18 @@ impl<'s> Parser<'s, CData<'s>> for CData<'s> { } /// [21] CDEnd ::= ']]>' -impl Parser<'_, CDEnd> for CDEnd { +impl Parser<'_> for CDEnd { + type Output = CDEnd; + fn parse(input: &'_ str) -> IResult<&str, CDEnd> { value(CDEnd, tag("]]>"))(input) } } /// [22] prolog ::= XMLDecl? Misc* (doctypedecl Misc*)? -impl<'s> Parser<'s, Prolog<'s>> for Prolog<'s> { +impl<'s> Parser<'s> for Prolog<'s> { + type Output = Prolog<'s>; + fn parse(input: &'s str) -> IResult<&str, Prolog<'s>> { tuple(( opt(XMLDecl::parse), @@ -458,7 +524,9 @@ impl<'s> Parser<'s, Prolog<'s>> for Prolog<'s> { } /// [23] XMLDecl ::= '' -impl<'s> Parser<'s, XMLDecl<'s>> for XMLDecl<'s> { +impl<'s> Parser<'s> for XMLDecl<'s> { + type Output = XMLDecl<'s>; + fn parse(input: &'s str) -> IResult<&str, XMLDecl<'s>> { map( delimited( @@ -480,7 +548,9 @@ impl<'s> Parser<'s, XMLDecl<'s>> for XMLDecl<'s> { } /// [24] VersionInfo ::= S 'version' Eq ("'" VersionNum "'" | '"' VersionNum '"') -impl Parser<'_, VersionInfo> for VersionInfo { +impl Parser<'_> for VersionInfo { + type Output = VersionInfo; + fn parse(input: &'_ str) -> IResult<&str, VersionInfo> { preceded( tuple((S::parse, tag("version"), Eq::parse)), @@ -499,7 +569,9 @@ impl Parser<'_, VersionInfo> for VersionInfo { } /// [25] Eq ::= S? '=' S? -impl Parser<'_, Eq> for Eq { +impl Parser<'_> for Eq { + type Output = Eq; + fn parse(input: &'_ str) -> IResult<&str, Eq> { value( Eq, @@ -509,7 +581,9 @@ impl Parser<'_, Eq> for Eq { } /// [26] VersionNum ::= '1.' [0-9]+ -impl Parser<'_, VersionNum> for VersionNum { +impl Parser<'_> for VersionNum { + type Output = VersionNum; + fn parse(input: &'_ str) -> IResult<&str, VersionNum> { preceded( tag("1."), @@ -522,7 +596,9 @@ impl Parser<'_, VersionNum> for VersionNum { } /// [27] Misc ::= Comment | PI | S -impl<'s> Parser<'s, Misc<'s>> for Misc<'s> { +impl<'s> Parser<'s> for Misc<'s> { + type Output = Misc<'s>; + fn parse(input: &'s str) -> IResult<&str, Misc<'s>> { alt(( map(Comment::parse, |comment| Misc::Comment(comment)), @@ -534,7 +610,9 @@ impl<'s> Parser<'s, Misc<'s>> for Misc<'s> { /// [16] doctypedecl ::= '' /// [28] doctypedecl ::= '' -impl<'s> Parser<'s, DoctypeDecl<'s>> for DoctypeDecl<'s> { +impl<'s> Parser<'s> for DoctypeDecl<'s> { + type Output = DoctypeDecl<'s>; + fn parse(input: &'s str) -> IResult<&str, DoctypeDecl<'s>> { map( delimited( @@ -562,7 +640,9 @@ impl<'s> Parser<'s, DoctypeDecl<'s>> for DoctypeDecl<'s> { } /// [28a] DeclSep ::= PEReference | S -impl<'s> Parser<'s, DeclSep<'s>> for DeclSep<'s> { +impl<'s> Parser<'s> for DeclSep<'s> { + type Output = DeclSep<'s>; + fn parse(input: &'s str) -> IResult<&str, DeclSep<'s>> { alt(( map(PEReference::parse, |pe_reference| { @@ -574,7 +654,9 @@ impl<'s> Parser<'s, DeclSep<'s>> for DeclSep<'s> { } /// [28b] intSubset ::= (markupdecl | DeclSep)* -impl<'s> Parser<'s, IntSubset<'s>> for IntSubset<'s> { +impl<'s> Parser<'s> for IntSubset<'s> { + type Output = IntSubset<'s>; + fn parse(input: &'s str) -> IResult<&str, IntSubset<'s>> { many0(alt(( map(MarkupDecl::parse, |markup_decl| { @@ -588,7 +670,9 @@ impl<'s> Parser<'s, IntSubset<'s>> for IntSubset<'s> { } /// [29] markupdecl ::= elementdecl | AttlistDecl | EntityDecl | NotationDecl | PI | Comment -impl<'s> Parser<'s, MarkupDecl<'s>> for MarkupDecl<'s> { +impl<'s> Parser<'s> for MarkupDecl<'s> { + type Output = MarkupDecl<'s>; + fn parse(input: &'s str) -> IResult<&str, MarkupDecl<'s>> { alt(( map(Elementdecl::parse, |elementdecl| { @@ -610,7 +694,9 @@ impl<'s> Parser<'s, MarkupDecl<'s>> for MarkupDecl<'s> { } /// [30] extSubset ::= TextDecl? extSubsetDecl -impl<'s> Parser<'s, ExtSubset<'s>> for ExtSubset<'s> { +impl<'s> Parser<'s> for ExtSubset<'s> { + type Output = ExtSubset<'s>; + fn parse(input: &'s str) -> IResult<&str, ExtSubset<'s>> { map( pair(opt(TextDecl::parse), ExtSubsetDecl::parse), @@ -623,7 +709,9 @@ impl<'s> Parser<'s, ExtSubset<'s>> for ExtSubset<'s> { } /// [31] extSubsetDecl ::= ( markupdecl | conditionalSect | DeclSep)* -impl<'s> Parser<'s, ExtSubsetDecl<'s>> for ExtSubsetDecl<'s> { +impl<'s> Parser<'s> for ExtSubsetDecl<'s> { + type Output = ExtSubsetDecl<'s>; + fn parse(input: &'s str) -> IResult<&str, ExtSubsetDecl<'s>> { many0(alt(( map(MarkupDecl::parse, |markup_decl| { @@ -640,7 +728,9 @@ impl<'s> Parser<'s, ExtSubsetDecl<'s>> for ExtSubsetDecl<'s> { } /// [32] SDDecl ::= S 'standalone' Eq (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no') '"')) -impl Parser<'_, SDDecl> for SDDecl { +impl Parser<'_> for SDDecl { + type Output = SDDecl; + fn parse(input: &'_ str) -> IResult<&str, SDDecl> { preceded( tuple((S::parse, tag("standalone"), Eq::parse)), @@ -669,7 +759,9 @@ impl Parser<'_, SDDecl> for SDDecl { // (Productions 33 through 38 have been removed.) /// [39] element ::= EmptyElemTag | STag content ETag -impl<'s> Parser<'s, Element<'s>> for Element<'s> { +impl<'s> Parser<'s> for Element<'s> { + type Output = Element<'s>; + fn parse(input: &'s str) -> IResult<&str, Element<'s>> { alt(( map(EmptyElemTag::parse, |empty_elem_tag| { @@ -685,7 +777,9 @@ impl<'s> Parser<'s, Element<'s>> for Element<'s> { /// [12] STag ::= '<' QName (S Attribute)* S? '>' /// [40] STag ::= '<' Name (S Attribute)* S? '>' -impl<'s> Parser<'s, STag<'s>> for STag<'s> { +impl<'s> Parser<'s> for STag<'s> { + type Output = STag<'s>; + fn parse(input: &'s str) -> IResult<&str, STag<'s>> { map( delimited( @@ -699,7 +793,9 @@ impl<'s> Parser<'s, STag<'s>> for STag<'s> { } /// [15] Attribute ::= NSAttName Eq AttValue | QName Eq AttValue -impl<'s> Parser<'s, Attribute<'s>> for Attribute<'s> { +impl<'s> Parser<'s> for Attribute<'s> { + type Output = Attribute<'s>; + fn parse(input: &'s str) -> IResult<&str, Attribute<'s>> { alt(( map( @@ -721,7 +817,9 @@ impl<'s> Parser<'s, Attribute<'s>> for Attribute<'s> { /// [13] ETag ::= '' /// [42] ETag ::= '' -impl<'s> Parser<'s, ETag<'s>> for ETag<'s> { +impl<'s> Parser<'s> for ETag<'s> { + type Output = ETag<'s>; + fn parse(input: &'s str) -> IResult<&str, ETag<'s>> { map( delimited(tag(""))), @@ -730,7 +828,9 @@ impl<'s> Parser<'s, ETag<'s>> for ETag<'s> { } } -impl<'s> Parser<'s, ContentItem<'s>> for ContentItem<'s> { +impl<'s> Parser<'s> for ContentItem<'s> { + type Output = ContentItem<'s>; + fn parse(input: &'s str) -> IResult<&str, ContentItem<'s>> { alt(( map(Element::parse, |element| ContentItem::Element(element)), @@ -745,7 +845,9 @@ impl<'s> Parser<'s, ContentItem<'s>> for ContentItem<'s> { } /// [43] content ::= CharData? ((element | Reference | CDSect | PI | Comment) CharData?)* -impl<'s> Parser<'s, Content<'s>> for Content<'s> { +impl<'s> Parser<'s> for Content<'s> { + type Output = Content<'s>; + fn parse(input: &'s str) -> IResult<&str, Content<'s>> { map( pair( @@ -770,7 +872,9 @@ impl<'s> Parser<'s, Content<'s>> for Content<'s> { /// [14] EmptyElemTag ::= '<' QName (S Attribute)* S? '/>' /// [44] EmptyElemTag ::= '<' Name (S Attribute)* S? '/>' [WFC: Unique Att Spec] -impl<'s> Parser<'s, EmptyElemTag<'s>> for EmptyElemTag<'s> { +impl<'s> Parser<'s> for EmptyElemTag<'s> { + type Output = EmptyElemTag<'s>; + fn parse(input: &'s str) -> IResult<&str, EmptyElemTag<'s>> { map( delimited( @@ -785,7 +889,9 @@ impl<'s> Parser<'s, EmptyElemTag<'s>> for EmptyElemTag<'s> { /// [17] elementdecl ::= '' /// [45] elementdecl ::= '' -impl<'s> Parser<'s, Elementdecl<'s>> for Elementdecl<'s> { +impl<'s> Parser<'s> for Elementdecl<'s> { + type Output = Elementdecl<'s>; + fn parse(input: &'s str) -> IResult<&str, Elementdecl> { map( delimited( @@ -799,7 +905,9 @@ impl<'s> Parser<'s, Elementdecl<'s>> for Elementdecl<'s> { } /// [46] contentspec ::= 'EMPTY' | 'ANY' | Mixed | children -impl<'s> Parser<'s, Contentspec<'s>> for Contentspec<'s> { +impl<'s> Parser<'s> for Contentspec<'s> { + type Output = Contentspec<'s>; + fn parse(input: &'s str) -> IResult<&str, Contentspec<'s>> { alt(( value(Contentspec::Empty, tag("EMPTY")), @@ -811,7 +919,9 @@ impl<'s> Parser<'s, Contentspec<'s>> for Contentspec<'s> { } /// Occurence ::= ('?' | '*' | '+')? -impl Parser<'_, Occurence> for Occurence { +impl Parser<'_> for Occurence { + type Output = Occurence; + fn parse(input: &'_ str) -> IResult<&str, Occurence> { map( opt(alt((tag("?"), tag("*"), tag("+")))), @@ -826,7 +936,9 @@ impl Parser<'_, Occurence> for Occurence { } /// [47] children ::= (choice | seq) ('?' | '*' | '+')? -impl<'s> Parser<'s, Children<'s>> for Children<'s> { +impl<'s> Parser<'s> for Children<'s> { + type Output = Children<'s>; + fn parse(input: &'s str) -> IResult<&str, Children<'s>> { map( pair( @@ -843,7 +955,9 @@ impl<'s> Parser<'s, Children<'s>> for Children<'s> { /// [18] cp ::= (QName | choice | seq) ('?' | '*' | '+')? /// [48] cp ::= (Name | choice | seq) ('?' | '*' | '+')? -impl<'s> Parser<'s, Cp<'s>> for Cp<'s> { +impl<'s> Parser<'s> for Cp<'s> { + type Output = Cp<'s>; + fn parse(input: &'s str) -> IResult<&str, Cp<'s>> { map( pair( @@ -860,7 +974,9 @@ impl<'s> Parser<'s, Cp<'s>> for Cp<'s> { } /// [49] choice ::= '(' S? cp ( S? '|' S? cp )+ S? ')' -impl<'s> Parser<'s, Choice<'s>> for Choice<'s> { +impl<'s> Parser<'s> for Choice<'s> { + type Output = Choice<'s>; + fn parse(input: &'s str) -> IResult<&str, Choice<'s>> { map( delimited( @@ -883,7 +999,9 @@ impl<'s> Parser<'s, Choice<'s>> for Choice<'s> { } /// [50] seq ::= '(' S? cp ( S? ',' S? cp )* S? ')' -impl<'s> Parser<'s, Seq<'s>> for Seq<'s> { +impl<'s> Parser<'s> for Seq<'s> { + type Output = Seq<'s>; + fn parse(input: &'s str) -> IResult<&str, Seq<'s>> { map( delimited( @@ -907,7 +1025,9 @@ impl<'s> Parser<'s, Seq<'s>> for Seq<'s> { /// [19] Mixed ::= '(' S? '#PCDATA' (S? '|' S? QName)* S? ')*' | '(' S? '#PCDATA' S? ')' /// [51] Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*' | '(' S? '#PCDATA' S? ')' -impl<'s> Parser<'s, Mixed<'s>> for Mixed<'s> { +impl<'s> Parser<'s> for Mixed<'s> { + type Output = Mixed<'s>; + fn parse(input: &'s str) -> IResult<&str, Mixed<'s>> { alt(( map( @@ -937,7 +1057,9 @@ impl<'s> Parser<'s, Mixed<'s>> for Mixed<'s> { /// [20] AttlistDecl ::= '' /// [52] AttlistDecl ::= '' -impl<'s> Parser<'s, AttlistDecl<'s>> for AttlistDecl<'s> { +impl<'s> Parser<'s> for AttlistDecl<'s> { + type Output = AttlistDecl<'s>; + fn parse(input: &'s str) -> IResult<&str, AttlistDecl<'s>> { map( delimited( @@ -955,7 +1077,9 @@ impl<'s> Parser<'s, AttlistDecl<'s>> for AttlistDecl<'s> { /// [21] AttDef ::= S (QName | NSAttName) S AttType S DefaultDecl /// [53] AttDef ::= S Name S AttType S DefaultDecl -impl<'s> Parser<'s, AttDef<'s>> for AttDef<'s> { +impl<'s> Parser<'s> for AttDef<'s> { + type Output = AttDef<'s>; + fn parse(input: &'s str) -> IResult<&str, AttDef<'s>> { map( tuple(( @@ -981,7 +1105,9 @@ impl<'s> Parser<'s, AttDef<'s>> for AttDef<'s> { } /// [54] AttType ::= StringType | TokenizedType | EnumeratedType -impl<'s> Parser<'s, AttType<'s>> for AttType<'s> { +impl<'s> Parser<'s> for AttType<'s> { + type Output = AttType<'s>; + fn parse(input: &'s str) -> IResult<&str, AttType<'s>> { alt(( value(AttType::StringType, StringType::parse), @@ -996,14 +1122,18 @@ impl<'s> Parser<'s, AttType<'s>> for AttType<'s> { } /// [55] StringType ::= 'CDATA' -impl Parser<'_, StringType> for StringType { +impl Parser<'_> for StringType { + type Output = StringType; + fn parse(input: &'_ str) -> IResult<&str, StringType> { value(StringType, tag("CDATA"))(input) } } /// [56] TokenizedType ::= 'ID' | 'IDREF' | 'IDREFS' | 'ENTITY' | 'ENTITIES' | 'NMTOKEN' | 'NMTOKENS' -impl Parser<'_, TokenizedType> for TokenizedType { +impl Parser<'_> for TokenizedType { + type Output = TokenizedType; + fn parse(input: &'_ str) -> IResult<&str, TokenizedType> { alt(( value(TokenizedType::ID, tag("ID")), @@ -1021,7 +1151,9 @@ impl Parser<'_, TokenizedType> for TokenizedType { } /// [57] EnumeratedType ::= NotationType | Enumeration -impl<'s> Parser<'s, EnumeratedType<'s>> for EnumeratedType<'s> { +impl<'s> Parser<'s> for EnumeratedType<'s> { + type Output = EnumeratedType<'s>; + fn parse(input: &'s str) -> IResult<&str, EnumeratedType<'s>> { alt(( map(NotationType::parse, |notation_type| { @@ -1035,7 +1167,9 @@ impl<'s> Parser<'s, EnumeratedType<'s>> for EnumeratedType<'s> { } /// [58] NotationType ::= 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')' -impl<'s> Parser<'s, NotationType<'s>> for NotationType<'s> { +impl<'s> Parser<'s> for NotationType<'s> { + type Output = NotationType<'s>; + fn parse(input: &'s str) -> IResult<&str, NotationType<'s>> { map( delimited( @@ -1058,7 +1192,9 @@ impl<'s> Parser<'s, NotationType<'s>> for NotationType<'s> { } /// [59] Enumeration ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')' -impl<'s> Parser<'s, Enumeration<'s>> for Enumeration<'s> { +impl<'s> Parser<'s> for Enumeration<'s> { + type Output = Enumeration<'s>; + fn parse(input: &'s str) -> IResult<&str, Enumeration<'s>> { map( delimited( @@ -1081,7 +1217,9 @@ impl<'s> Parser<'s, Enumeration<'s>> for Enumeration<'s> { } /// [60] DefaultDecl ::= '#REQUIRED' | '#IMPLIED' | (('#FIXED' S)? AttValue) -impl<'s> Parser<'s, DefaultDecl<'s>> for DefaultDecl<'s> { +impl<'s> Parser<'s> for DefaultDecl<'s> { + type Output = DefaultDecl<'s>; + fn parse(input: &'s str) -> IResult<&str, DefaultDecl<'s>> { alt(( value(DefaultDecl::Required, tag("#REQUIRED")), @@ -1095,7 +1233,9 @@ impl<'s> Parser<'s, DefaultDecl<'s>> for DefaultDecl<'s> { } /// [61] conditionalSect ::= includeSect | ignoreSect -impl<'s> Parser<'s, ConditionalSect<'s>> for ConditionalSect<'s> { +impl<'s> Parser<'s> for ConditionalSect<'s> { + type Output = ConditionalSect<'s>; + fn parse(input: &'s str) -> IResult<&str, ConditionalSect<'s>> { alt(( map(IncludeSect::parse, |include_sect| { @@ -1109,7 +1249,9 @@ impl<'s> Parser<'s, ConditionalSect<'s>> for ConditionalSect<'s> { } /// [62] includeSect ::= '' -impl<'s> Parser<'s, IncludeSect<'s>> for IncludeSect<'s> { +impl<'s> Parser<'s> for IncludeSect<'s> { + type Output = IncludeSect<'s>; + fn parse(input: &'s str) -> IResult<&str, IncludeSect<'s>> { map( delimited( @@ -1129,7 +1271,9 @@ impl<'s> Parser<'s, IncludeSect<'s>> for IncludeSect<'s> { } /// [63] ignoreSect ::= '' -impl<'s> Parser<'s, IgnoreSect<'s>> for IgnoreSect<'s> { +impl<'s> Parser<'s> for IgnoreSect<'s> { + type Output = IgnoreSect<'s>; + fn parse(input: &'s str) -> IResult<&str, IgnoreSect<'s>> { map( delimited( @@ -1149,7 +1293,9 @@ impl<'s> Parser<'s, IgnoreSect<'s>> for IgnoreSect<'s> { } /// [64] ignoreSectContents ::= Ignore ('' Ignore)* -impl<'s> Parser<'s, IgnoreSectContents<'s>> for IgnoreSectContents<'s> { +impl<'s> Parser<'s> for IgnoreSectContents<'s> { + type Output = IgnoreSectContents<'s>; + fn parse(input: &'s str) -> IResult<&str, IgnoreSectContents<'s>> { map( pair( @@ -1168,7 +1314,9 @@ impl<'s> Parser<'s, IgnoreSectContents<'s>> for IgnoreSectContents<'s> { } /// [65] Ignore ::= Char* - (Char* ('') Char*) -impl<'s> Parser<'s, Ignore<'s>> for Ignore<'s> { +impl<'s> Parser<'s> for Ignore<'s> { + type Output = Ignore<'s>; + fn parse(input: &'s str) -> IResult<&str, Ignore<'s>> { map( recognize(many_till(Char::parse, peek(alt((tag("")))))), @@ -1178,7 +1326,9 @@ impl<'s> Parser<'s, Ignore<'s>> for Ignore<'s> { } /// [66] CharRef ::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';' -impl<'s> Parser<'s, CharRef<'s>> for CharRef<'s> { +impl<'s> Parser<'s> for CharRef<'s> { + type Output = CharRef<'s>; + fn parse(input: &'s str) -> IResult<&str, CharRef<'s>> { alt(( delimited( @@ -1201,7 +1351,9 @@ impl<'s> Parser<'s, CharRef<'s>> for CharRef<'s> { } /// [67] Reference ::= EntityRef | CharRef -impl<'s> Parser<'s, Reference<'s>> for Reference<'s> { +impl<'s> Parser<'s> for Reference<'s> { + type Output = Reference<'s>; + fn parse(input: &'s str) -> IResult<&str, Reference<'s>> { alt(( map(EntityRef::parse, |entity_ref| { @@ -1213,7 +1365,9 @@ impl<'s> Parser<'s, Reference<'s>> for Reference<'s> { } /// [68] EntityRef ::= '&' Name ';' -impl<'s> Parser<'s, EntityRef<'s>> for EntityRef<'s> { +impl<'s> Parser<'s> for EntityRef<'s> { + type Output = EntityRef<'s>; + fn parse(input: &'s str) -> IResult<&str, EntityRef<'s>> { map(delimited(tag("&"), Name::parse, tag(";")), |entity_ref| { EntityRef(entity_ref) @@ -1222,7 +1376,9 @@ impl<'s> Parser<'s, EntityRef<'s>> for EntityRef<'s> { } /// [69] PEReference ::= '%' Name ';' -impl<'s> Parser<'s, PEReference<'s>> for PEReference<'s> { +impl<'s> Parser<'s> for PEReference<'s> { + type Output = PEReference<'s>; + fn parse(input: &'s str) -> IResult<&str, PEReference<'s>> { map(delimited(tag("%"), Name::parse, tag(";")), |pe_reference| { PEReference(pe_reference) @@ -1231,7 +1387,9 @@ impl<'s> Parser<'s, PEReference<'s>> for PEReference<'s> { } /// [70] EntityDecl ::= GEDecl | PEDecl -impl<'s> Parser<'s, EntityDecl<'s>> for EntityDecl<'s> { +impl<'s> Parser<'s> for EntityDecl<'s> { + type Output = EntityDecl<'s>; + fn parse(input: &'s str) -> IResult<&str, EntityDecl<'s>> { alt(( map(GEDecl::parse, |ge_decl| EntityDecl::GEDecl(ge_decl)), @@ -1241,7 +1399,9 @@ impl<'s> Parser<'s, EntityDecl<'s>> for EntityDecl<'s> { } /// [71] GEDecl ::= '' -impl<'s> Parser<'s, GEDecl<'s>> for GEDecl<'s> { +impl<'s> Parser<'s> for GEDecl<'s> { + type Output = GEDecl<'s>; + fn parse(input: &'s str) -> IResult<&str, GEDecl<'s>> { map( delimited( @@ -1255,7 +1415,9 @@ impl<'s> Parser<'s, GEDecl<'s>> for GEDecl<'s> { } /// [72] PEDecl ::= '' -impl<'s> Parser<'s, PEDecl<'s>> for PEDecl<'s> { +impl<'s> Parser<'s> for PEDecl<'s> { + type Output = PEDecl<'s>; + fn parse(input: &'s str) -> IResult<&str, PEDecl<'s>> { map( delimited( @@ -1269,7 +1431,9 @@ impl<'s> Parser<'s, PEDecl<'s>> for PEDecl<'s> { } /// [73] EntityDef ::= EntityValue | (ExternalID NDataDecl?) -impl<'s> Parser<'s, EntityDef<'s>> for EntityDef<'s> { +impl<'s> Parser<'s> for EntityDef<'s> { + type Output = EntityDef<'s>; + fn parse(input: &'s str) -> IResult<&str, EntityDef<'s>> { alt(( map(EntityValue::parse, |entity_value| { @@ -1287,7 +1451,9 @@ impl<'s> Parser<'s, EntityDef<'s>> for EntityDef<'s> { } /// [74] PEDef ::= EntityValue | ExternalID -impl<'s> Parser<'s, PEDef<'s>> for PEDef<'s> { +impl<'s> Parser<'s> for PEDef<'s> { + type Output = PEDef<'s>; + fn parse(input: &'s str) -> IResult<&str, PEDef<'s>> { alt(( map(EntityValue::parse, |entity_value| { @@ -1302,7 +1468,9 @@ impl<'s> Parser<'s, PEDef<'s>> for PEDef<'s> { /// [75] ExternalID ::= 'SYSTEM' S SystemLiteral | 'PUBLIC' S PubidLiteral S SystemLiteral // pub fn external_id(input: &str) -> IResult<&str, ExternalID> { -impl<'s> Parser<'s, ExternalID<'s>> for ExternalID<'s> { +impl<'s> Parser<'s> for ExternalID<'s> { + type Output = ExternalID<'s>; + fn parse(input: &'s str) -> IResult<&str, ExternalID<'s>> { alt(( map( @@ -1324,7 +1492,9 @@ impl<'s> Parser<'s, ExternalID<'s>> for ExternalID<'s> { } /// [76] NDataDecl ::= S 'NDATA' S Name -impl<'s> Parser<'s, NDataDecl<'s>> for NDataDecl<'s> { +impl<'s> Parser<'s> for NDataDecl<'s> { + type Output = NDataDecl<'s>; + fn parse(input: &'s str) -> IResult<&str, NDataDecl<'s>> { map( preceded(tuple((S::parse, tag("NDATA"), S::parse)), Name::parse), @@ -1334,7 +1504,9 @@ impl<'s> Parser<'s, NDataDecl<'s>> for NDataDecl<'s> { } /// [77] TextDecl ::= '' -impl<'s> Parser<'s, TextDecl<'s>> for TextDecl<'s> { +impl<'s> Parser<'s> for TextDecl<'s> { + type Output = TextDecl<'s>; + fn parse(input: &'s str) -> IResult<&str, TextDecl<'s>> { map( delimited( @@ -1354,7 +1526,9 @@ impl<'s> Parser<'s, TextDecl<'s>> for TextDecl<'s> { } /// [78] extParsedEnt ::= TextDecl? content -impl<'s> Parser<'s, ExtParsedEnt<'s>> for ExtParsedEnt<'s> { +impl<'s> Parser<'s> for ExtParsedEnt<'s> { + type Output = ExtParsedEnt<'s>; + fn parse(input: &'s str) -> IResult<&str, ExtParsedEnt<'s>> { map( pair(opt(TextDecl::parse), Content::parse), @@ -1364,7 +1538,9 @@ impl<'s> Parser<'s, ExtParsedEnt<'s>> for ExtParsedEnt<'s> { } /// [80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' | "'" EncName -impl<'s> Parser<'s, EncodingDecl<'s>> for EncodingDecl<'s> { +impl<'s> Parser<'s> for EncodingDecl<'s> { + type Output = EncodingDecl<'s>; + fn parse(input: &'s str) -> IResult<&str, EncodingDecl<'s>> { map( preceded( @@ -1380,7 +1556,9 @@ impl<'s> Parser<'s, EncodingDecl<'s>> for EncodingDecl<'s> { } /// [81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')* -impl<'s> Parser<'s, EncName<'s>> for EncName<'s> { +impl<'s> Parser<'s> for EncName<'s> { + type Output = EncName<'s>; + fn parse(input: &'s str) -> IResult<&str, EncName<'s>> { map( recognize(pair( @@ -1395,7 +1573,9 @@ impl<'s> Parser<'s, EncName<'s>> for EncName<'s> { } /// [82] NotationDecl ::= '' -impl<'s> Parser<'s, NotationDecl<'s>> for NotationDecl<'s> { +impl<'s> Parser<'s> for NotationDecl<'s> { + type Output = NotationDecl<'s>; + fn parse(input: &'s str) -> IResult<&str, NotationDecl<'s>> { map( delimited( @@ -1420,7 +1600,9 @@ impl<'s> Parser<'s, NotationDecl<'s>> for NotationDecl<'s> { } /// [83] PublicID ::= 'PUBLIC' S PubidLiteral -impl<'s> Parser<'s, PublicID<'s>> for PublicID<'s> { +impl<'s> Parser<'s> for PublicID<'s> { + type Output = PublicID<'s>; + fn parse(input: &'s str) -> IResult<&str, PublicID<'s>> { map( preceded(pair(tag("PUBLIC"), S::parse), PubidLiteral::parse),