mod datatype_library;
mod grammar;
mod parse;
mod validate;
use std::io::Read;
use crate::{
error::XMLError,
relaxng::{grammar::Grammar, parse::RelaxNGParseHandler, validate::ValidateHandler},
sax::{handler::SAXHandler, parser::XMLReaderBuilder},
uri::URIStr,
};
pub const XML_RELAX_NG_NAMESPACE: &str = "http://relaxng.org/ns/structure/1.0";
pub struct RelaxNGSchema {
grammar: Grammar,
}
impl RelaxNGSchema {
pub fn parse_uri<Handler: SAXHandler>(
uri: impl AsRef<URIStr>,
encoding: Option<&str>,
handler: Option<Handler>,
) -> Result<Self, XMLError> {
if let Some(handler) = handler {
let mut parser = XMLReaderBuilder::new()
.set_handler(RelaxNGParseHandler::with_handler(handler))
.build();
parser.parse_uri(uri, encoding)?;
let grammar = parser.handler.simplification().map_err(|err| err.error)?;
Ok(Self { grammar })
} else {
let mut parser = XMLReaderBuilder::new()
.set_handler(RelaxNGParseHandler::default())
.build();
parser.parse_uri(uri, encoding)?;
let grammar = parser.handler.simplification().map_err(|err| err.error)?;
Ok(Self { grammar })
}
}
pub fn parse_reader<'a, Handler: SAXHandler>(
reader: impl Read + 'a,
encoding: Option<&str>,
uri: impl AsRef<URIStr>,
handler: Option<Handler>,
) -> Result<Self, XMLError> {
if let Some(handler) = handler {
let mut parser = XMLReaderBuilder::new()
.set_handler(RelaxNGParseHandler::with_handler(handler))
.build();
parser.parse_reader(reader, encoding, Some(uri.as_ref()))?;
let grammar = parser.handler.simplification().map_err(|err| err.error)?;
Ok(Self { grammar })
} else {
let mut parser = XMLReaderBuilder::new()
.set_handler(RelaxNGParseHandler::default())
.build();
parser.parse_reader(reader, encoding, Some(uri.as_ref()))?;
let grammar = parser.handler.simplification().map_err(|err| err.error)?;
Ok(Self { grammar })
}
}
pub fn parse_str<Handler: SAXHandler>(
schema: &str,
uri: impl AsRef<URIStr>,
handler: Option<Handler>,
) -> Result<Self, XMLError> {
if let Some(handler) = handler {
let mut parser = XMLReaderBuilder::new()
.set_handler(RelaxNGParseHandler::with_handler(handler))
.build();
parser.parse_str(schema, Some(uri.as_ref()))?;
let grammar = parser.handler.simplification().map_err(|err| err.error)?;
Ok(Self { grammar })
} else {
let mut parser = XMLReaderBuilder::new()
.set_handler(RelaxNGParseHandler::default())
.build();
parser.parse_str(schema, Some(uri.as_ref()))?;
let grammar = parser.handler.simplification().map_err(|err| err.error)?;
Ok(Self { grammar })
}
}
pub fn new_validate_handler<H: SAXHandler>(&mut self, handler: H) -> ValidateHandler<'_, H> {
self.grammar.new_validate_handler(handler)
}
}