use std::{
collections::HashMap,
path::{Path, PathBuf},
};
use log::debug;
use serde::{Deserialize, Serialize};
use crate::assets::{AssetError, AssetFilterError};
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub enum AssetFilterOption {
Flag,
Bool(bool),
String(String),
StringList(Vec<String>),
}
pub fn option_is_flag(option: Option<AssetFilterOption>) -> Option<bool> {
match option {
Some(AssetFilterOption::Flag) => Some(true),
None => Some(false),
_ => None,
}
}
pub fn get_bool(option: AssetFilterOption) -> Option<bool> {
match option {
AssetFilterOption::Bool(value) => Some(value),
_ => None,
}
}
pub fn get_string(option: AssetFilterOption) -> Option<String> {
match option {
AssetFilterOption::String(value) => Some(value),
_ => None,
}
}
pub fn get_string_list(option: AssetFilterOption) -> Option<Vec<String>> {
match option {
AssetFilterOption::StringList(value) => Some(value),
_ => None,
}
}
pub trait AssetFilter<E>
where
E: AssetFilterError,
{
fn process_asset_file(
&self,
input_file_paths: &[PathBuf],
output_file_path: &Path,
options: &HashMap<String, AssetFilterOption>,
) -> Result<(), AssetError<E>>;
}
pub struct AssetFilterRegistry<E> {
filters: HashMap<String, Box<dyn AssetFilter<E>>>,
}
impl<E> AssetFilterRegistry<E> {
pub fn new(filters: HashMap<String, Box<dyn AssetFilter<E>>>) -> AssetFilterRegistry<E> {
AssetFilterRegistry { filters }
}
pub fn process_asset_file(
&self,
filter_name: String,
input_file_paths: &[PathBuf],
output_file_path: &Path,
options: &HashMap<String, AssetFilterOption>,
) -> Option<Result<(), AssetError<E>>>
where
E: AssetFilterError,
{
debug!(
"Processing files {:?} to output file {:?} by filter {}",
input_file_paths, output_file_path, filter_name
);
self.filters
.get(&filter_name)
.map(|filter| filter.process_asset_file(input_file_paths, output_file_path, options))
}
}