use super::error::FilesystemConfigError;
use bevy::prelude::Resource;
use std::path::{Path, PathBuf};
pub const DEFAULT_MAX_FILE_BYTES: u64 = 32 * 1024 * 1024;
#[derive(Clone, Debug, Eq, PartialEq, Resource)]
pub struct FilesystemConfig {
pub workspace_root: PathBuf,
pub max_file_bytes: u64,
}
impl FilesystemConfig {
pub fn from_workspace_root(
workspace_root: impl AsRef<Path>,
) -> Result<Self, FilesystemConfigError> {
let workspace_root = workspace_root
.as_ref()
.canonicalize()
.map_err(|source| FilesystemConfigError::CanonicalizeRoot { source })?;
if !workspace_root.is_dir() {
return Err(FilesystemConfigError::RootIsNotDirectory { workspace_root });
}
Ok(Self {
workspace_root,
max_file_bytes: DEFAULT_MAX_FILE_BYTES,
})
}
pub fn discover() -> Result<Self, FilesystemConfigError> {
let current_dir = std::env::current_dir()
.map_err(|source| FilesystemConfigError::CurrentDir { source })?;
Self::from_workspace_root(discover_workspace_root(current_dir)?)
}
}
pub(super) fn discover_workspace_root(
start: impl AsRef<Path>,
) -> Result<PathBuf, FilesystemConfigError> {
let start = start
.as_ref()
.canonicalize()
.map_err(|source| FilesystemConfigError::CanonicalizeRoot { source })?;
for ancestor in start.ancestors() {
if ancestor.join(".git").exists() {
return Ok(ancestor.to_owned());
}
}
Ok(start)
}