aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar cel 🌸 <cel@bunny.garden>2024-11-11 14:37:57 +0000
committerLibravatar cel 🌸 <cel@bunny.garden>2024-11-11 14:37:57 +0000
commit4c235b972e2400bd2bb92b74b12558b485dc7142 (patch)
treec9d2b3607347e9479298859cfa4d50524955ee87
parente17f2d68765a0661478572a098ffdf6f1bd3d669 (diff)
downloadpeanuts-4c235b972e2400bd2bb92b74b12558b485dc7142.tar.gz
peanuts-4c235b972e2400bd2bb92b74b12558b485dc7142.tar.bz2
peanuts-4c235b972e2400bd2bb92b74b12558b485dc7142.zip
move Parser traits' generic outputs into associated types
-rw-r--r--src/xml/parsers.rs368
-rw-r--r--src/xml/parsers_complete.rs368
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 ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->'
-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 ::= '<?' PITarget (S (Char* - (Char* '?>' 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 ::= '<![CDATA['
-impl Parser<'_, CDStart> for CDStart {
+impl Parser<'_> for CDStart {
+ type Output = CDStart;
+
fn parse(input: &'_ str) -> IResult<&str, CDStart> {
value(CDStart, tag("<![CDATA["))(input)
}
}
/// [20] CData ::= (Char* - (Char* ']]>' 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 ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'
-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 ::= '<!DOCTYPE' S QName (S ExternalID)? S? ('[' (markupdecl | PEReference | S)* ']' S?)? '>'
/// [28] doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)? S? ('[' intSubset ']' S?)? '>'
-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 ::= '</' QName S? '>'
/// [42] ETag ::= '</' Name S? '>'
-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("</"), QName::parse, pair(opt(S::parse), 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 ::= '<!ELEMENT' S QName S contentspec S? '>'
/// [45] elementdecl ::= '<!ELEMENT' S Name S contentspec S? '>'
-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 ::= '<!ATTLIST' S QName AttDef* S? '>'
/// [52] AttlistDecl ::= '<!ATTLIST' S Name AttDef* S? '>'
-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 ::= '<![' S? 'INCLUDE' S? '[' extSubsetDecl ']]>'
-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 ::= '<![' S? 'IGNORE' S? '[' ignoreSectContents* ']]>'
-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 ('<![' ignoreSectContents ']]>' 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("<!["), 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 ::= '<!ENTITY' S Name S EntityDef S? '>'
-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 ::= '<!ENTITY' S '%' S Name S PEDef S? '>'
-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 ::= '<?xml' VersionInfo? EncodingDecl S? '?>'
-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 ::= '<!NOTATION' S Name S (ExternalID | PublicID) S? '>'
-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 ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->'
-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 ::= '<?' PITarget (S (Char* - (Char* '?>' 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 ::= '<![CDATA['
-impl Parser<'_, CDStart> for CDStart {
+impl Parser<'_> for CDStart {
+ type Output = CDStart;
+
fn parse(input: &'_ str) -> IResult<&str, CDStart> {
value(CDStart, tag("<![CDATA["))(input)
}
}
/// [20] CData ::= (Char* - (Char* ']]>' 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 ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'
-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 ::= '<!DOCTYPE' S QName (S ExternalID)? S? ('[' (markupdecl | PEReference | S)* ']' S?)? '>'
/// [28] doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)? S? ('[' intSubset ']' S?)? '>'
-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 ::= '</' QName S? '>'
/// [42] ETag ::= '</' Name S? '>'
-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("</"), QName::parse, pair(opt(S::parse), 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 ::= '<!ELEMENT' S QName S contentspec S? '>'
/// [45] elementdecl ::= '<!ELEMENT' S Name S contentspec S? '>'
-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 ::= '<!ATTLIST' S QName AttDef* S? '>'
/// [52] AttlistDecl ::= '<!ATTLIST' S Name AttDef* S? '>'
-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 ::= '<![' S? 'INCLUDE' S? '[' extSubsetDecl ']]>'
-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 ::= '<![' S? 'IGNORE' S? '[' ignoreSectContents* ']]>'
-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 ('<![' ignoreSectContents ']]>' 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("<!["), 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 ::= '<!ENTITY' S Name S EntityDef S? '>'
-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 ::= '<!ENTITY' S '%' S Name S PEDef S? '>'
-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 ::= '<?xml' VersionInfo? EncodingDecl S? '?>'
-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 ::= '<!NOTATION' S Name S (ExternalID | PublicID) S? '>'
-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),