mod datatype_library;
mod grammar;
mod parse;
mod validate;
use std::io::Read;
use crate::{
error::XMLError,
relaxng::{grammar::RelaxNGGrammar, parse::RelaxNGParseHandler},
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: RelaxNGGrammar,
}
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)?;
parser.handler.simplification().map_err(|err| err.error)?;
let grammar = parser.handler.build_grammar()?;
Ok(Self { grammar })
} else {
let mut parser = XMLReaderBuilder::new()
.set_handler(RelaxNGParseHandler::default())
.build();
parser.parse_uri(uri, encoding)?;
parser.handler.simplification().map_err(|err| err.error)?;
let grammar = parser.handler.build_grammar()?;
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()))?;
parser.handler.simplification().map_err(|err| err.error)?;
let grammar = parser.handler.build_grammar()?;
Ok(Self { grammar })
} else {
let mut parser = XMLReaderBuilder::new()
.set_handler(RelaxNGParseHandler::default())
.build();
parser.parse_reader(reader, encoding, Some(uri.as_ref()))?;
parser.handler.simplification().map_err(|err| err.error)?;
let grammar = parser.handler.build_grammar()?;
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()))?;
parser.handler.simplification().map_err(|err| err.error)?;
let grammar = parser.handler.build_grammar()?;
Ok(Self { grammar })
} else {
let mut parser = XMLReaderBuilder::new()
.set_handler(RelaxNGParseHandler::default())
.build();
parser.parse_str(schema, Some(uri.as_ref()))?;
parser.handler.simplification().map_err(|err| err.error)?;
let grammar = parser.handler.build_grammar()?;
Ok(Self { grammar })
}
}
}