aboutsummaryrefslogtreecommitdiff
path: root/src/escape.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/escape.rs')
-rw-r--r--src/escape.rs74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/escape.rs b/src/escape.rs
new file mode 100644
index 0000000..c58a5ae
--- /dev/null
+++ b/src/escape.rs
@@ -0,0 +1,74 @@
+//! XML character escape things.
+use std::ops::Range;
+
+use quick_xml::escape::EscapeError as QuickXMLEscapeError;
+
+/// Escape/unescape error.
+#[derive(Debug, thiserror::Error)]
+#[non_exhaustive]
+#[allow(clippy::module_name_repetitions)]
+pub enum EscapeError
+{
+ /// Null character entity not allowed.
+ #[error(
+ "Error while escaping character at range {0:?}: Null character entity not allowed"
+ )]
+ EntityWithNull(Range<usize>),
+
+ /// Unrecognized escape symbol.
+ #[error(
+ "Error while escaping character at range {0:?}: Unrecognized escape symbol: {1:?}"
+ )]
+ UnrecognizedSymbol(Range<usize>, String),
+
+ /// Missing ; after &.
+ #[error("Error while escaping character at range {0:?}: Cannot find ';' after '&'")]
+ UnterminatedEntity(Range<usize>),
+
+ /// Hexadecimal value is too long too convert to UTF-8.
+ #[error("Hexadecimal value is too long to convert to UTF-8")]
+ TooLongHexadecimal,
+
+ /// Invalid hexadecimal character.
+ #[error("{0}' is not a valid hexadecimal character")]
+ InvalidHexadecimal(char),
+
+ /// Decimal value is too long to convert to UTF-8.
+ #[error("Decimal value is too long to convert to UTF-8")]
+ TooLongDecimal,
+
+ /// Invalid decimal character.
+ #[error("'{0}' is not a valid decimal character")]
+ InvalidDecimal(char),
+
+ /// Invalid codepoint.
+ #[error("'{0}' is not a valid codepoint")]
+ InvalidCodepoint(u32),
+}
+
+impl EscapeError
+{
+ pub(crate) fn from_quick_xml(err: QuickXMLEscapeError) -> Self
+ {
+ match err {
+ QuickXMLEscapeError::EntityWithNull(range) => Self::EntityWithNull(range),
+ QuickXMLEscapeError::UnrecognizedSymbol(range, symbol) => {
+ Self::UnrecognizedSymbol(range, symbol)
+ }
+ QuickXMLEscapeError::UnterminatedEntity(range) => {
+ Self::UnterminatedEntity(range)
+ }
+ QuickXMLEscapeError::TooLongHexadecimal => Self::TooLongHexadecimal,
+ QuickXMLEscapeError::InvalidHexadecimal(character) => {
+ Self::InvalidHexadecimal(character)
+ }
+ QuickXMLEscapeError::TooLongDecimal => Self::TooLongDecimal,
+ QuickXMLEscapeError::InvalidDecimal(character) => {
+ Self::InvalidDecimal(character)
+ }
+ QuickXMLEscapeError::InvalidCodepoint(codepoint) => {
+ Self::InvalidCodepoint(codepoint)
+ }
+ }
+ }
+}