use std::fs;
use super::{FontFile, ResourceSet, VectorAsset, sanitize_ident};
use crate::meta::Project;
use crate::ops::status;
pub fn stage(
project: &Project,
set: &ResourceSet,
fonts: &[FontFile],
vectors: &[VectorAsset],
) -> Result<(), String> {
if set.images.is_empty() && fonts.is_empty() && vectors.is_empty() {
return Ok(());
}
let res = project.root.join("build/day/android/res");
let _ = fs::remove_dir_all(&res);
if !fonts.is_empty() {
let dir = res.join("font");
fs::create_dir_all(&dir).map_err(|e| format!("mkdir {}: {e}", dir.display()))?;
for f in fonts {
let dest = dir.join(f.staged_name());
fs::copy(&f.path, &dest).map_err(|e| format!("stage {}: {e}", dest.display()))?;
}
}
let mut vector_names = std::collections::BTreeSet::new();
if !vectors.is_empty() {
let vd_dir = res.join("drawable");
let px_dir = res.join("drawable-xxxhdpi");
for v in vectors {
let ident = sanitize_ident(&v.name);
vector_names.insert(v.name.clone());
let tree = day_vector::parse(v.glyph.as_bytes())
.map_err(|e| format!("vector {}: {e}", v.name))?;
match day_vector::to_vector_drawable(&tree) {
Ok(xml) => {
fs::create_dir_all(&vd_dir).map_err(|e| format!("mkdir: {e}"))?;
fs::write(vd_dir.join(format!("{ident}.xml")), xml)
.map_err(|e| format!("stage vector {}: {e}", v.name))?;
}
Err(why) => {
status(
"Packing",
&format!(
"vector {} → raster on android ({why} is outside the VectorDrawable subset)",
v.name
),
);
let cached = super::vector_raster_dir(project).join(format!("{}.png", v.name));
fs::create_dir_all(&px_dir).map_err(|e| format!("mkdir: {e}"))?;
fs::copy(&cached, px_dir.join(format!("{ident}.png")))
.map_err(|e| format!("stage vector {}: {e}", v.name))?;
}
}
}
}
let raster_cache = super::vector_raster_dir(project);
for img in &set.images {
if img.path.starts_with(&raster_cache) && vector_names.contains(&img.name) {
continue; }
let bucket = match img.scale {
2 => "drawable-xhdpi",
3 => "drawable-xxhdpi",
4 => "drawable-xxxhdpi",
_ => "drawable",
};
let dir = res.join(bucket);
fs::create_dir_all(&dir).map_err(|e| format!("mkdir {}: {e}", dir.display()))?;
let ext = img
.path
.extension()
.and_then(|e| e.to_str())
.unwrap_or("png")
.to_ascii_lowercase();
let dest = dir.join(format!("{}.{}", sanitize_ident(&img.name), ext));
fs::copy(&img.path, &dest).map_err(|e| format!("stage {}: {e}", dest.display()))?;
}
Ok(())
}