use std::path::Path;
use yog_codegen::{Header, Regenerate};
use yog_codegen_rust::Rust;
use crate::project::manifest::{RUST_LIB, SOURCES_DIR};
const FILE: &str = "mod.g.rs";
pub fn lib_path(root: &Path) -> String {
if has_rust(root) {
format!("../{SOURCES_DIR}/{RUST_LIB}")
} else {
format!("{}/{FILE}", generated_dir())
}
}
pub fn has_rust(root: &Path) -> bool {
root.join(SOURCES_DIR).join(RUST_LIB).is_file()
}
pub fn root_file(root: &Path) -> std::path::PathBuf {
root.join(yog_ids::project::OBJ)
.join(generated_dir())
.join(FILE)
}
pub fn write(root: &Path, content: bool) -> Result<(), String> {
if has_rust(root) {
return Ok(());
}
let file = root_file(root);
if let Some(dir) = file.parent() {
std::fs::create_dir_all(dir).map_err(|e| format!("{}: {e}", dir.display()))?;
}
crate::write_if_changed(&file, source(content))
}
fn generated_dir() -> &'static str {
let obj = yog_ids::project::OBJ;
yog_ids::project::GENERATED
.strip_prefix(obj)
.map_or(yog_ids::project::GENERATED, |p| {
p.trim_start_matches(yog_ids::sep::PATH)
})
}
fn source(content: bool) -> String {
let mut code = HEADER.comment::<Rust>();
code.push_str("//! The mod's native: its code is Yog Script.\n\n");
if content {
code.push_str("yog_api::content!();\n\n");
}
code.push_str(
"/// The mod: what it registers is its content's.\npub struct ScriptMod;\n\nimpl yog_api::Mod for ScriptMod {\n fn register(_registry: &mut yog_api::Registry) {}\n}\n\nyog_api::export_mod!(ScriptMod);\n",
);
code
}
const HEADER: Header = Header {
tool: "`yog build`",
source: "yog.toml",
regenerate: Regenerate::EveryBuild,
};