use super::container::path_is_container;
use super::resources::asset::{Assets, LocalAsset};
use crate::result::{AssetError, Error, Result};
use settings_manager::local_settings::LocalSettings;
use std::io;
use std::path::{Path, PathBuf};
use thot_core::types::{ResourceId, ResourcePath};
pub fn init(path: &Path, container: Option<&Path>) -> Result<ResourceId> {
let container = match container {
Some(p) => p,
None => match path.parent() {
Some(p) => p,
None => {
return Err(io::Error::new(
io::ErrorKind::InvalidFilename,
"path is not a valid filename",
)
.into())
}
},
};
if !path_is_container(container) {
return Err(Error::AssetError(AssetError::PathNotAContainer(
PathBuf::from(path),
)));
}
let mut assets = Assets::load(container)?;
let a_path = ResourcePath::new(PathBuf::from(path))?;
let a_path = Some(a_path);
for a in &assets.assets {
if a.path == a_path {
return Err(Error::AssetError(AssetError::FileAlreadyAsset(
PathBuf::from(path),
)));
}
}
let asset_path = ResourcePath::new(PathBuf::from(path))?;
let asset = LocalAsset::new(asset_path)?;
let rid = asset.properties.rid.clone();
assets.assets.push(asset);
assets.save()?;
Ok(rid)
}
pub fn mv() -> Result {
todo!();
}
pub fn delete() -> Result {
todo!();
}
pub fn update() -> Result {
todo!();
}
pub fn add_bucket(name: &Path) -> Result {
todo!();
}
pub fn make_bucket(path: &Path) -> Result {
todo!();
}
pub fn path_is_asset(path: &Path, container: &Path) -> bool {
todo!();
}
pub fn container_from_path_ancestor(path: &Path) -> Result<PathBuf> {
match path.ancestors().find(|p| path_is_container(p)) {
None => {
return Err(Error::AssetError(AssetError::ContainerNotFound(
path.to_path_buf(),
)))
}
Some(p) => Ok(p.to_path_buf()),
}
}
#[cfg(test)]
#[path = "./asset_test.rs"]
mod asset_test;