Add TryFrom implementation for VFolder

This commit is contained in:
Moritz Hölting 2024-03-21 19:50:00 +01:00
parent 7997cd9213
commit 78a3d8f520
1 changed files with 35 additions and 0 deletions

View File

@ -187,6 +187,41 @@ impl VFolder {
} }
} }
impl TryFrom<&Path> for VFolder {
type Error = io::Error;
fn try_from(value: &Path) -> Result<Self, Self::Error> {
let mut root_vfolder = VFolder::new();
let root_folder = fs::read_dir(value)?;
for dir_entry in root_folder {
let dir_entry = dir_entry?;
let path = dir_entry.path();
let name = dir_entry
.file_name()
.into_string()
.map(Some)
.unwrap_or_default();
if let Some(name) = name {
if path.is_dir() {
root_vfolder.add_existing_folder(&name, VFolder::try_from(path.as_path())?);
} else if path.is_file() {
let data = fs::read(path)?;
root_vfolder.add_file(&name, VFile::Binary(data));
} else {
unreachable!("Path is neither file nor directory");
}
} else {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
"Invalid file name",
));
}
}
Ok(root_vfolder)
}
}
/// File representation in virtual file system /// File representation in virtual file system
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]