use crate::{
Result,
errors,
};
use std::borrow::Cow;
pub trait ElementState: Sized {
type Output: Sized;
fn parse_element_start(tag: &str) -> Option<Self>;
fn parse_element_attribute(&mut self, key: &str, value: Cow<'_, str>) -> Result<()> {
let _ = value;
return Err(errors::unexpected_attribute(key));
}
fn parse_element_inner_text(&mut self, text: Cow<'_, str>) -> Result<()> {
if !text.trim().is_empty() {
return Err(errors::unexpected_text());
}
Ok(())
}
fn parse_element_inner_node<P: ElementParser>(&mut self, tag: &str, parser: P) -> Result<()> {
let _ = parser;
return Err(errors::unexpected_element(tag));
}
fn parse_element_finish(self) -> Result<Self::Output>;
fn parse_error_not_found<T>() -> Result<T> {
Err(errors::missing_unknown_element())
}
}
pub trait ElementParser: Sized {
fn parse_element_state<E: ElementState>(self, state: &mut E) -> Result<()>;
}