use std::{path::Path, result::Result};
use proc_macro::TokenStream;
use quote::quote;
use walkdir::WalkDir;
pub fn parse_dir(asset_dir: &Path) -> TokenStream {
let mut textures = Vec::new();
let assets = WalkDir::new(asset_dir)
.sort_by_file_name()
.into_iter()
.filter_map(Result::ok)
.filter_map(|entry| {
if !entry.path().is_file() {
return None;
}
let path = entry.path();
let extension = path.extension()?.to_string_lossy();
let relative_path = path.strip_prefix(asset_dir).ok()?;
let id = relative_path
.iter()
.map(|path| path.to_string_lossy())
.collect::<Vec<_>>()
.join(".");
let id = id.strip_suffix(&format!(".{extension}"))?;
if extension == "png" {
textures.push((id.to_owned(), path.to_path_buf()));
return None;
}
let path = path.display().to_string();
Some(quote!(
chuot::assets::source::EmbeddedRawAsset {
id: #id,
extension: #extension,
bytes: include_bytes!(#path)
}
))
})
.collect::<Vec<_>>();
let atlas = super::atlas::parse_textures(&textures);
quote! {
.with_embedded_assets(&[#(#assets),*])
.with_embedded_atlas(#atlas)
}
.into()
}