endcap-sl-software-ri-gener.../src/integrated.rs

59 lines
1.7 KiB
Rust
Raw Normal View History

2025-02-12 22:10:48 +09:00
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(())
}