use crate::error::Result;
use crate::schema::fetcher::SchemaFetcher;
use crate::schema::types::CompiledSchema;
use crate::schema::xsd::{
create_builtin_schema, parse_xsd, parse_xsd_multiple, parse_xsd_with_imports_multiple,
};
#[cfg(feature = "tokio")]
use crate::schema::fetcher::AsyncSchemaFetcher;
#[cfg(feature = "tokio")]
use crate::schema::xsd::parse_xsd_with_imports_multiple_async;
pub type Schema = CompiledSchema;
impl CompiledSchema {
pub fn from_xsd(content: impl AsRef<[u8]>) -> Result<Self> {
parse_xsd(content.as_ref())
}
pub fn builtin() -> Self {
create_builtin_schema()
}
pub fn builder() -> SchemaBuilder {
SchemaBuilder::default()
}
}
#[derive(Debug, Default, Clone)]
pub struct SchemaBuilder {
entries: Vec<(String, Vec<u8>)>,
}
impl SchemaBuilder {
pub fn new() -> Self {
Self::default()
}
pub fn add(mut self, uri: impl Into<String>, content: impl Into<Vec<u8>>) -> Self {
self.entries.push((uri.into(), content.into()));
self
}
fn refs(&self) -> Vec<(&str, &[u8])> {
self.entries
.iter()
.map(|(uri, content)| (uri.as_str(), content.as_slice()))
.collect()
}
pub fn resolve(self) -> Result<Schema> {
parse_xsd_multiple(&self.refs())
}
pub fn resolve_with<F: SchemaFetcher>(self, fetcher: &F) -> Result<Schema> {
parse_xsd_with_imports_multiple(&self.refs(), fetcher)
}
#[cfg(feature = "tokio")]
pub async fn resolve_with_async<F: AsyncSchemaFetcher>(self, fetcher: &F) -> Result<Schema> {
parse_xsd_with_imports_multiple_async(&self.refs(), fetcher).await
}
}