use crate::reference::LexicalSource;
use crate::xml::{Access, AccessError, Snapshot, Xml};
use structured_asn1::memory::Work;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TextValue<'view> {
Absent,
ComplexContent,
Present(&'view str),
}
pub trait TextXml: Xml {
fn with_text<R, VE, W: Work>(
&self,
snapshot: Snapshot<Self::Document, Self::Generation>,
node: Self::Id,
source: LexicalSource<'_>,
execution: &W,
visitor: impl for<'view> FnOnce(TextValue<'view>) -> Result<R, VE>,
) -> Result<R, crate::reference::VisitError<Self::Error, VE>>;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct QNameValue<'view> {
pub namespace: Option<&'view str>,
pub local_name: &'view str,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum QNameFact<'view> {
Absent,
ComplexContent,
Malformed,
UnboundPrefix(&'view str),
Unsupported,
Value(QNameValue<'view>),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct QNameReading<'view> {
pub lexical: Option<&'view str>,
pub fact: QNameFact<'view>,
}
pub trait QNameXml: Xml {
fn with_qname<R, VE, W: Work>(
&self,
snapshot: Snapshot<Self::Document, Self::Generation>,
node: Self::Id,
source: LexicalSource<'_>,
execution: &W,
visitor: impl for<'view> FnOnce(QNameReading<'view>) -> Result<R, VE>,
) -> Result<R, crate::reference::VisitError<Self::Error, VE>>;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum UriValue<'view> {
Absent,
ComplexContent,
Malformed,
Unsupported,
Valid(&'view str),
}
pub trait UriXml: Xml {
fn with_uri<R, VE, W: Work>(
&self,
snapshot: Snapshot<Self::Document, Self::Generation>,
node: Self::Id,
source: LexicalSource<'_>,
execution: &W,
visitor: impl for<'view> FnOnce(UriValue<'view>) -> Result<R, VE>,
) -> Result<R, crate::reference::VisitError<Self::Error, VE>>;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Datatype {
Id,
AnyUri,
Integer,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Fact {
Absent,
ComplexContent,
Malformed,
Unsupported,
Valid,
}
pub trait ScalarXml: Xml {
fn scalar<W: Work>(
&self,
snapshot: Snapshot<Self::Document, Self::Generation>,
node: Self::Id,
source: LexicalSource<'_>,
datatype: Datatype,
execution: &W,
) -> Result<Fact, Self::Error>;
}
#[derive(Debug)]
pub enum Error<E, N> {
Access(AccessError<E, N>),
Value {
node: N,
datatype: Datatype,
fact: Fact,
},
}
pub type ScalarResult<X> = Result<(), Error<<X as Xml>::Error, <X as Xml>::Id>>;
pub fn check<X: ScalarXml, W: Work>(
access: &Access<'_, X, W>,
node: X::Id,
source: LexicalSource<'_>,
datatype: Datatype,
) -> ScalarResult<X> {
let fact = access
.query(node, |xml, snapshot, work| {
xml.scalar(snapshot, node, source, datatype, work)
})
.map_err(Error::Access)?;
match fact {
Fact::Valid => Ok(()),
fact => Err(Error::Value {
node,
datatype,
fact,
}),
}
}