//! XML is awful. #![deny(clippy::all, clippy::pedantic, unsafe_code, missing_docs)] use crate::deserializer::{Deserializer, Error as DeserializerError, MaybeStatic}; use crate::tagged::TagStart; pub mod attribute; pub mod deserializer; pub mod tagged; mod event; mod util; /// Trait implemented by types that want to be deserializable from tagged XML elements. pub trait DeserializeTagged: Sized + MaybeStatic { /// 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( start: &TagStart, deserializer: &mut TDeserializer, ) -> Result; } /// Result extension. pub trait ResultExt { /// Returns `Ok(None)` if `Err` is `DeserializerError::UnexpectedEvent`. fn try_event(self) -> Result, DeserializerError>; } impl ResultExt for Result> { fn try_event(self) -> Result, DeserializerError> { self.map_or_else( |err| { if let DeserializerError::UnexpectedEvent { expected_event_name: _, found_event: _, } = err { return Ok(None); } Err(err) }, |value| Ok(Some(value)), ) } }