aboutsummaryrefslogtreecommitdiff
path: root/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 8b13789..e5086bc 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1 +1,55 @@
+//! XML is awful.
+#![deny(clippy::all, clippy::pedantic, unsafe_code, missing_docs)]
+use crate::deserializer::{Deserializer, Error as DeserializerError};
+use crate::tagged::TagStart;
+pub mod attribute;
+pub mod deserializer;
+pub mod tagged;
+
+mod event;
+
+/// Trait implemented by types that want to be deserializable from tagged XML elements.
+pub trait DeserializeTagged: Sized
+{
+ /// Error type.
+ type Error: std::error::Error + Send + Sync + 'static;
+
+ /// Deserializes into a new `Self`.
+ ///
+ /// # Errors
+ /// When or if a error is returned is decided by the type implementing this trait.
+ fn deserialize<TDeserializer: Deserializer>(
+ start: &TagStart,
+ deserializer: &mut TDeserializer,
+ ) -> Result<Self, Self::Error>;
+}
+
+/// Result extension.
+pub trait ResultExt<Value, DeError>
+{
+ /// Returns `Ok(None)` if `Err` is `DeserializerError::UnexpectedEvent`.
+ fn try_event(self) -> Result<Option<Value>, DeserializerError<DeError>>;
+}
+
+impl<Value, DeError> ResultExt<Value, DeError>
+ for Result<Value, DeserializerError<DeError>>
+{
+ fn try_event(self) -> Result<Option<Value>, DeserializerError<DeError>>
+ {
+ self.map_or_else(
+ |err| {
+ if let DeserializerError::UnexpectedEvent {
+ expected_event_name: _,
+ found_event: _,
+ } = err
+ {
+ return Ok(None);
+ }
+
+ Err(err)
+ },
+ |value| Ok(Some(value)),
+ )
+ }
+}