use std::fs;
use super::{FontFile, ResourceSet, sanitize_ident};
use crate::meta::Project;
pub fn stage(project: &Project, set: &ResourceSet, fonts: &[FontFile]) -> Result<(), String> {
let harmony = crate::ohos::harmony_dir(project);
if !harmony.exists() {
return Ok(());
}
let dir = harmony.join("entry/src/main/resources/rawfile/day");
let _ = fs::remove_dir_all(&dir);
let svgs: Vec<std::path::PathBuf> = super::vector_svg_dir(project)
.read_dir()
.map(|rd| {
rd.flatten()
.map(|e| e.path())
.filter(|p| p.extension().and_then(|x| x.to_str()) == Some("svg"))
.collect()
})
.unwrap_or_default();
if set.images.is_empty() && set.data.is_empty() && fonts.is_empty() && svgs.is_empty() {
return Ok(());
}
fs::create_dir_all(&dir).map_err(|e| format!("mkdir {}: {e}", dir.display()))?;
if !fonts.is_empty() {
let fdir = dir.join("fonts");
fs::create_dir_all(&fdir).map_err(|e| format!("mkdir {}: {e}", fdir.display()))?;
let mut manifest = Vec::new();
for f in fonts {
let name = f.staged_name();
let dest = fdir.join(&name);
fs::copy(&f.path, &dest).map_err(|e| format!("stage {}: {e}", dest.display()))?;
manifest.push(serde_json::json!({ "family": f.family, "file": name }));
}
let json = serde_json::to_string_pretty(&manifest).expect("font manifest");
fs::write(dir.join("fonts.json"), json).map_err(|e| format!("stage fonts.json: {e}"))?;
}
for img in &set.images {
let dest = dir.join(format!("{}.png", sanitize_ident(&img.name)));
fs::copy(&img.path, &dest).map_err(|e| format!("stage {}: {e}", dest.display()))?;
}
for svg in &svgs {
if let Some(name) = svg.file_name() {
let dest = dir.join(name);
fs::copy(svg, &dest).map_err(|e| format!("stage {}: {e}", dest.display()))?;
}
}
for d in &set.data {
let dest = dir.join(&d.name);
if let Some(parent) = dest.parent() {
fs::create_dir_all(parent).map_err(|e| format!("mkdir {}: {e}", parent.display()))?;
}
fs::copy(&d.path, &dest).map_err(|e| format!("stage {}: {e}", dest.display()))?;
}
Ok(())
}