mirror of
https://gitlab.cern.ch/wotsubo/endcap-sl-software-ri-generator.git
synced 2025-02-23 17:17:08 +09:00
58 lines
1.7 KiB
Rust
58 lines
1.7 KiB
Rust
use std::path;
|
|
|
|
use thiserror::Error;
|
|
|
|
use crate::{
|
|
converter, generator,
|
|
io::{get_xml_gitinfo, XmlGitInfoError},
|
|
types,
|
|
};
|
|
|
|
#[derive(Debug, Error)]
|
|
pub enum Error {
|
|
#[error("error in getting xml git info: {0}")]
|
|
XmlGitInfoError(#[from] XmlGitInfoError),
|
|
#[error("io error: {0}")]
|
|
IOError(#[from] std::io::Error),
|
|
#[error("xml parse error: {0}")]
|
|
XmlParseError(#[from] roxmltree::Error),
|
|
#[error("dom conversion error: {0}")]
|
|
DomConversionError(#[from] converter::DomConversionError),
|
|
#[error("code generation error: {0}")]
|
|
CodeGenError(#[from] generator::CodeGenError),
|
|
}
|
|
|
|
/// Generate register interface code from xml in `xml` and write them under directory `out`.
|
|
pub fn generate(xml: &path::Path, out: &path::Path) -> Result<(), Error> {
|
|
log::debug!("generate called: xml:{:?}, out: {:?}", xml, out);
|
|
|
|
let xml_git_info = get_xml_gitinfo(xml)?;
|
|
log::debug!("xml git info {xml_git_info:?}");
|
|
|
|
let xmlfile = std::fs::read_to_string(xml)?;
|
|
let doc = roxmltree::Document::parse_with_options(
|
|
&xmlfile,
|
|
roxmltree::ParsingOptions {
|
|
allow_dtd: true,
|
|
nodes_limit: u32::MAX,
|
|
},
|
|
)?;
|
|
log::debug!("xml parsed {doc:?}");
|
|
|
|
let register_map = types::Module::from_xml_dom(doc.root_element(), xml_git_info)?;
|
|
log::debug!("converted {register_map:?}");
|
|
|
|
let files = register_map.generate_code()?;
|
|
if log::log_enabled!(log::Level::Debug) {
|
|
for (path, code) in &files {
|
|
log::debug!("path: {:?}", path);
|
|
log::debug!("{}", prettyplease::unparse(code));
|
|
log::trace!("{}", prettyplease::unparse(code));
|
|
}
|
|
}
|
|
|
|
crate::write_to_files(files, out)?;
|
|
log::debug!("wrote to files");
|
|
|
|
Ok(())
|
|
}
|