crate::ix!();
#[async_trait]
pub trait LoadFromDirectory: Sized {
type Error;
async fn load_from_directory(
dir: impl AsRef<Path> + Send,
) -> Result<Vec<Self>, Self::Error>;
}
#[async_trait]
impl<T> LoadFromDirectory for T
where
T: LoadFromFile + Send + Sized,
T::Error: Display + From<SaveLoadError> + From<io::Error> + Send + 'static,
{
type Error = T::Error;
async fn load_from_directory(
dir: impl AsRef<Path> + Send,
) -> Result<Vec<Self>, Self::Error> {
let dir = dir.as_ref();
if !dir.is_dir() {
return Err(SaveLoadError::InvalidDirectory {
dir: dir.to_path_buf()
}.into());
}
let mut results = Vec::new();
let mut entries = tokio::fs::read_dir(dir).await?;
while let Some(entry) = entries.next_entry().await? {
let path = entry.path();
if path.is_file() {
match Self::load_from_file(&path).await {
Ok(item) => results.push(item),
Err(e) => warn!("Failed to load from file {:?}: {}", path, e),
}
}
}
Ok(results)
}
}