Skip to content

Commit 8002cc6

Browse files
committed
Split reserved namespace binding errors
1 parent 4bbb94b commit 8002cc6

File tree

1 file changed

+49
-38
lines changed

1 file changed

+49
-38
lines changed

src/name.rs

Lines changed: 49 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,25 @@ use std::fmt::{self, Debug, Formatter};
1414
pub enum NamespaceError {
1515
/// Specified namespace prefix is unknown, cannot resolve namespace for it
1616
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 {
2834
/// The prefix that is tried to be bound
2935
prefix: Vec<u8>,
30-
/// Namespace to which prefix tried to be bound
31-
namespace: Vec<u8>,
3236
},
3337
}
3438

@@ -40,13 +44,26 @@ impl fmt::Display for NamespaceError {
4044
write_byte_string(f, prefix)?;
4145
f.write_str("'")
4246
}
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 '")?;
4754
write_byte_string(f, namespace)?;
4855
f.write_str("'")
4956
}
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+
}
5067
}
5168
}
5269
}
@@ -522,29 +539,30 @@ impl NamespaceResolver {
522539
Some(PrefixDeclaration::Named(b"xml")) => {
523540
if Namespace(&v) != RESERVED_NAMESPACE_XML.1 {
524541
// error, `xml` prefix explicitly set to different value
525-
return Err(NamespaceError::InvalidPrefixBind {
526-
prefix: b"xml".to_vec(),
542+
return Err(NamespaceError::InvalidXmlPrefixBind {
527543
namespace: v.to_vec(),
528544
});
529545
}
530546
// don't add another NamespaceEntry for the `xml` namespace prefix
531547
}
532548
Some(PrefixDeclaration::Named(b"xmlns")) => {
533549
// error, `xmlns` prefix explicitly set
534-
return Err(NamespaceError::InvalidPrefixBind {
535-
prefix: b"xmlns".to_vec(),
550+
return Err(NamespaceError::InvalidXmlnsPrefixBind {
536551
namespace: v.to_vec(),
537552
});
538553
}
539554
Some(PrefixDeclaration::Named(prefix)) => {
540555
let ns = Namespace(&v);
541556

542-
if ns == RESERVED_NAMESPACE_XML.1 || ns == RESERVED_NAMESPACE_XMLNS.1 {
557+
if ns == RESERVED_NAMESPACE_XML.1 {
543558
// 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 {
544563
// error, non-`xmlns` prefix set to xmlns uri
545-
return Err(NamespaceError::InvalidPrefixBind {
564+
return Err(NamespaceError::InvalidXmlnsNamespaceBind {
546565
prefix: prefix.to_vec(),
547-
namespace: v.to_vec(),
548566
});
549567
}
550568

@@ -1029,8 +1047,7 @@ mod namespaces {
10291047
" xmlns:xml='not_correct_namespace'",
10301048
0,
10311049
)) {
1032-
Err(NamespaceError::InvalidPrefixBind { prefix, namespace }) => {
1033-
assert_eq!(prefix, b"xml");
1050+
Err(NamespaceError::InvalidXmlPrefixBind { namespace }) => {
10341051
assert_eq!(namespace, b"not_correct_namespace");
10351052
}
10361053
x => panic!(
@@ -1047,8 +1064,7 @@ mod namespaces {
10471064
let mut resolver = NamespaceResolver::default();
10481065
let s = resolver.buffer.len();
10491066
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 }) => {
10521068
assert_eq!(namespace, b"");
10531069
}
10541070
x => panic!(
@@ -1068,9 +1084,8 @@ mod namespaces {
10681084
" xmlns:not_xml='http://www.w3.org/XML/1998/namespace'",
10691085
0,
10701086
)) {
1071-
Err(NamespaceError::InvalidPrefixBind { prefix, namespace }) => {
1087+
Err(NamespaceError::InvalidXmlNamespaceBind { prefix }) => {
10721088
assert_eq!(prefix, b"not_xml");
1073-
assert_eq!(namespace, b"http://www.w3.org/XML/1998/namespace");
10741089
}
10751090
x => panic!(
10761091
"Expected `Err(InvalidPrefixBind {{ .. }})`, but got `{:?}`",
@@ -1114,8 +1129,7 @@ mod namespaces {
11141129
" xmlns:xmlns='http://www.w3.org/2000/xmlns/'",
11151130
0,
11161131
)) {
1117-
Err(NamespaceError::InvalidPrefixBind { prefix, namespace }) => {
1118-
assert_eq!(prefix, b"xmlns");
1132+
Err(NamespaceError::InvalidXmlnsPrefixBind { namespace }) => {
11191133
assert_eq!(namespace, b"http://www.w3.org/2000/xmlns/");
11201134
}
11211135
x => panic!(
@@ -1135,8 +1149,7 @@ mod namespaces {
11351149
" xmlns:xmlns='not_correct_namespace'",
11361150
0,
11371151
)) {
1138-
Err(NamespaceError::InvalidPrefixBind { prefix, namespace }) => {
1139-
assert_eq!(prefix, b"xmlns");
1152+
Err(NamespaceError::InvalidXmlnsPrefixBind { namespace }) => {
11401153
assert_eq!(namespace, b"not_correct_namespace");
11411154
}
11421155
x => panic!(
@@ -1153,8 +1166,7 @@ mod namespaces {
11531166
let mut resolver = NamespaceResolver::default();
11541167
let s = resolver.buffer.len();
11551168
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 }) => {
11581170
assert_eq!(namespace, b"");
11591171
}
11601172
x => panic!(
@@ -1174,9 +1186,8 @@ mod namespaces {
11741186
" xmlns:not_xmlns='http://www.w3.org/2000/xmlns/'",
11751187
0,
11761188
)) {
1177-
Err(NamespaceError::InvalidPrefixBind { prefix, namespace }) => {
1189+
Err(NamespaceError::InvalidXmlnsNamespaceBind { prefix }) => {
11781190
assert_eq!(prefix, b"not_xmlns");
1179-
assert_eq!(namespace, b"http://www.w3.org/2000/xmlns/");
11801191
}
11811192
x => panic!(
11821193
"Expected `Err(InvalidPrefixBind {{ .. }})`, but got `{:?}`",

0 commit comments

Comments
 (0)