@@ -14,21 +14,25 @@ use std::fmt::{self, Debug, Formatter};
14
14
pub enum NamespaceError {
15
15
/// Specified namespace prefix is unknown, cannot resolve namespace for it
16
16
UnknownPrefix ( Vec < u8 > ) ,
17
- /// Error for when a reserved namespace is set incorrectly.
18
- ///
19
- /// This error returned in following cases:
20
- /// - the XML document attempts to bind `xml` prefix to something other than
21
- /// `http://www.w3.org/XML/1998/namespace`
22
- /// - the XML document attempts to bind `xmlns` prefix
23
- /// - the XML document attempts to bind some prefix (except `xml`) to
24
- /// `http://www.w3.org/XML/1998/namespace`
25
- /// - the XML document attempts to bind some prefix to
26
- /// `http://www.w3.org/2000/xmlns/`
27
- InvalidPrefixBind {
17
+ /// Attempts to bind the `xml` prefix to something other than `http://www.w3.org/XML/1998/namespace`
18
+ InvalidXmlPrefixBind {
19
+ /// Namespace to which `xml` tried to be bound
20
+ namespace : Vec < u8 > ,
21
+ } ,
22
+ /// Attempts to bind the `xmlnx` prefix to something other than `http://www.w3.org/2000/xmlns/`
23
+ InvalidXmlnsPrefixBind {
24
+ /// Namespace to which `xmlns` tried to be bound
25
+ namespace : Vec < u8 > ,
26
+ } ,
27
+ /// Attempts to bind some prefix to `http://www.w3.org/XML/1998/namespace`
28
+ InvalidXmlNamespaceBind {
29
+ /// The prefix that is tried to be bound
30
+ prefix : Vec < u8 > ,
31
+ } ,
32
+ /// Attempts to bind some prefix to `http://www.w3.org/2000/xmlns/`
33
+ InvalidXmlnsNamespaceBind {
28
34
/// The prefix that is tried to be bound
29
35
prefix : Vec < u8 > ,
30
- /// Namespace to which prefix tried to be bound
31
- namespace : Vec < u8 > ,
32
36
} ,
33
37
}
34
38
@@ -40,13 +44,26 @@ impl fmt::Display for NamespaceError {
40
44
write_byte_string ( f, prefix) ?;
41
45
f. write_str ( "'" )
42
46
}
43
- Self :: InvalidPrefixBind { prefix, namespace } => {
44
- f. write_str ( "the namespace prefix '" ) ?;
45
- write_byte_string ( f, prefix) ?;
46
- f. write_str ( "' cannot be bound to '" ) ?;
47
+ Self :: InvalidXmlPrefixBind { namespace } => {
48
+ f. write_str ( "the namespace prefix 'xml' cannot be bound to '" ) ?;
49
+ write_byte_string ( f, namespace) ?;
50
+ f. write_str ( "'" )
51
+ }
52
+ Self :: InvalidXmlnsPrefixBind { namespace } => {
53
+ f. write_str ( "the namespace prefix 'xmlns' cannot be bound to '" ) ?;
47
54
write_byte_string ( f, namespace) ?;
48
55
f. write_str ( "'" )
49
56
}
57
+ Self :: InvalidXmlNamespaceBind { prefix } => {
58
+ f. write_str ( "the namespace prefix '" ) ?;
59
+ write_byte_string ( f, prefix) ?;
60
+ f. write_str ( "' cannot be bound to 'http://www.w3.org/XML/1998/namespace'" )
61
+ }
62
+ Self :: InvalidXmlnsNamespaceBind { prefix } => {
63
+ f. write_str ( "the namespace prefix '" ) ?;
64
+ write_byte_string ( f, prefix) ?;
65
+ f. write_str ( "' cannot be bound to 'http://www.w3.org/2000/xmlns/'" )
66
+ }
50
67
}
51
68
}
52
69
}
@@ -522,29 +539,30 @@ impl NamespaceResolver {
522
539
Some ( PrefixDeclaration :: Named ( b"xml" ) ) => {
523
540
if Namespace ( & v) != RESERVED_NAMESPACE_XML . 1 {
524
541
// error, `xml` prefix explicitly set to different value
525
- return Err ( NamespaceError :: InvalidPrefixBind {
526
- prefix : b"xml" . to_vec ( ) ,
542
+ return Err ( NamespaceError :: InvalidXmlPrefixBind {
527
543
namespace : v. to_vec ( ) ,
528
544
} ) ;
529
545
}
530
546
// don't add another NamespaceEntry for the `xml` namespace prefix
531
547
}
532
548
Some ( PrefixDeclaration :: Named ( b"xmlns" ) ) => {
533
549
// error, `xmlns` prefix explicitly set
534
- return Err ( NamespaceError :: InvalidPrefixBind {
535
- prefix : b"xmlns" . to_vec ( ) ,
550
+ return Err ( NamespaceError :: InvalidXmlnsPrefixBind {
536
551
namespace : v. to_vec ( ) ,
537
552
} ) ;
538
553
}
539
554
Some ( PrefixDeclaration :: Named ( prefix) ) => {
540
555
let ns = Namespace ( & v) ;
541
556
542
- if ns == RESERVED_NAMESPACE_XML . 1 || ns == RESERVED_NAMESPACE_XMLNS . 1 {
557
+ if ns == RESERVED_NAMESPACE_XML . 1 {
543
558
// error, non-`xml` prefix set to xml uri
559
+ return Err ( NamespaceError :: InvalidXmlNamespaceBind {
560
+ prefix : prefix. to_vec ( ) ,
561
+ } ) ;
562
+ } else if ns == RESERVED_NAMESPACE_XMLNS . 1 {
544
563
// error, non-`xmlns` prefix set to xmlns uri
545
- return Err ( NamespaceError :: InvalidPrefixBind {
564
+ return Err ( NamespaceError :: InvalidXmlnsNamespaceBind {
546
565
prefix : prefix. to_vec ( ) ,
547
- namespace : v. to_vec ( ) ,
548
566
} ) ;
549
567
}
550
568
@@ -1029,8 +1047,7 @@ mod namespaces {
1029
1047
" xmlns:xml='not_correct_namespace'" ,
1030
1048
0 ,
1031
1049
) ) {
1032
- Err ( NamespaceError :: InvalidPrefixBind { prefix, namespace } ) => {
1033
- assert_eq ! ( prefix, b"xml" ) ;
1050
+ Err ( NamespaceError :: InvalidXmlPrefixBind { namespace } ) => {
1034
1051
assert_eq ! ( namespace, b"not_correct_namespace" ) ;
1035
1052
}
1036
1053
x => panic ! (
@@ -1047,8 +1064,7 @@ mod namespaces {
1047
1064
let mut resolver = NamespaceResolver :: default ( ) ;
1048
1065
let s = resolver. buffer . len ( ) ;
1049
1066
match resolver. push ( & BytesStart :: from_content ( " xmlns:xml=''" , 0 ) ) {
1050
- Err ( NamespaceError :: InvalidPrefixBind { prefix, namespace } ) => {
1051
- assert_eq ! ( prefix, b"xml" ) ;
1067
+ Err ( NamespaceError :: InvalidXmlPrefixBind { namespace } ) => {
1052
1068
assert_eq ! ( namespace, b"" ) ;
1053
1069
}
1054
1070
x => panic ! (
@@ -1068,9 +1084,8 @@ mod namespaces {
1068
1084
" xmlns:not_xml='http://www.w3.org/XML/1998/namespace'" ,
1069
1085
0 ,
1070
1086
) ) {
1071
- Err ( NamespaceError :: InvalidPrefixBind { prefix, namespace } ) => {
1087
+ Err ( NamespaceError :: InvalidXmlNamespaceBind { prefix } ) => {
1072
1088
assert_eq ! ( prefix, b"not_xml" ) ;
1073
- assert_eq ! ( namespace, b"http://www.w3.org/XML/1998/namespace" ) ;
1074
1089
}
1075
1090
x => panic ! (
1076
1091
"Expected `Err(InvalidPrefixBind {{ .. }})`, but got `{:?}`" ,
@@ -1114,8 +1129,7 @@ mod namespaces {
1114
1129
" xmlns:xmlns='http://www.w3.org/2000/xmlns/'" ,
1115
1130
0 ,
1116
1131
) ) {
1117
- Err ( NamespaceError :: InvalidPrefixBind { prefix, namespace } ) => {
1118
- assert_eq ! ( prefix, b"xmlns" ) ;
1132
+ Err ( NamespaceError :: InvalidXmlnsPrefixBind { namespace } ) => {
1119
1133
assert_eq ! ( namespace, b"http://www.w3.org/2000/xmlns/" ) ;
1120
1134
}
1121
1135
x => panic ! (
@@ -1135,8 +1149,7 @@ mod namespaces {
1135
1149
" xmlns:xmlns='not_correct_namespace'" ,
1136
1150
0 ,
1137
1151
) ) {
1138
- Err ( NamespaceError :: InvalidPrefixBind { prefix, namespace } ) => {
1139
- assert_eq ! ( prefix, b"xmlns" ) ;
1152
+ Err ( NamespaceError :: InvalidXmlnsPrefixBind { namespace } ) => {
1140
1153
assert_eq ! ( namespace, b"not_correct_namespace" ) ;
1141
1154
}
1142
1155
x => panic ! (
@@ -1153,8 +1166,7 @@ mod namespaces {
1153
1166
let mut resolver = NamespaceResolver :: default ( ) ;
1154
1167
let s = resolver. buffer . len ( ) ;
1155
1168
match resolver. push ( & BytesStart :: from_content ( " xmlns:xmlns=''" , 0 ) ) {
1156
- Err ( NamespaceError :: InvalidPrefixBind { prefix, namespace } ) => {
1157
- assert_eq ! ( prefix, b"xmlns" ) ;
1169
+ Err ( NamespaceError :: InvalidXmlnsPrefixBind { namespace } ) => {
1158
1170
assert_eq ! ( namespace, b"" ) ;
1159
1171
}
1160
1172
x => panic ! (
@@ -1174,9 +1186,8 @@ mod namespaces {
1174
1186
" xmlns:not_xmlns='http://www.w3.org/2000/xmlns/'" ,
1175
1187
0 ,
1176
1188
) ) {
1177
- Err ( NamespaceError :: InvalidPrefixBind { prefix, namespace } ) => {
1189
+ Err ( NamespaceError :: InvalidXmlnsNamespaceBind { prefix } ) => {
1178
1190
assert_eq ! ( prefix, b"not_xmlns" ) ;
1179
- assert_eq ! ( namespace, b"http://www.w3.org/2000/xmlns/" ) ;
1180
1191
}
1181
1192
x => panic ! (
1182
1193
"Expected `Err(InvalidPrefixBind {{ .. }})`, but got `{:?}`" ,
0 commit comments