pub mod codegen;
pub mod error;
pub mod hints;
pub mod model;
pub mod parse;
pub mod validate;
pub use error::OxiforgeError;
#[cfg(feature = "runtime")]
pub use oxivgl::display;
#[cfg(feature = "runtime")]
pub use oxivgl::driver;
#[cfg(feature = "runtime")]
pub use oxivgl::fonts;
#[cfg(feature = "runtime")]
pub use oxivgl::prelude;
#[cfg(feature = "runtime")]
pub use oxivgl::snapshot;
#[cfg(feature = "runtime")]
pub use oxivgl::view;
pub fn generate_from_str(yaml: &str) -> Result<String, OxiforgeError> {
let hint_errors = hints::check_unknown_keys(yaml);
if let Some(e) = hint_errors.into_iter().next() {
return Err(e);
}
let doc = parse::parse_str(yaml)?;
let errors = validate::validate(&doc);
if let Some(e) = errors.into_iter().next() {
return Err(e);
}
codegen::generate(&doc).map_err(|e| OxiforgeError::Other(e.to_string()))
}
pub fn generate(yaml_path: &std::path::Path, out_dir: &std::path::Path) -> Result<(), OxiforgeError> {
let content = std::fs::read_to_string(yaml_path)?;
let hint_errors = hints::check_unknown_keys(&content);
if let Some(e) = hint_errors.into_iter().next() {
return Err(e);
}
let doc = parse::parse_str(&content)?;
let errors = validate::validate(&doc);
if let Some(e) = errors.into_iter().next() {
return Err(e);
}
let code = codegen::generate(&doc).map_err(|e| OxiforgeError::Other(e.to_string()))?;
let stem = yaml_path.file_stem().unwrap().to_str().unwrap();
let out_file = out_dir.join(format!("{stem}.rs"));
std::fs::write(&out_file, code)?;
println!("cargo::rerun-if-changed={}", yaml_path.display());
Ok(())
}