use serde::{Deserialize, Serialize};
use std::path::{Path, PathBuf};
use crate::constants::DEFAULT_VNODE_SIZE;
use crate::error::OxenError;
use crate::model::{LocalRepository, Remote};
use crate::storage::StorageConfig;
use crate::util;
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct RepositoryConfig {
pub remote_name: Option<String>,
pub remotes: Vec<Remote>,
pub subtree_paths: Option<Vec<PathBuf>>,
pub depth: Option<i32>,
pub min_version: Option<String>,
pub vnode_size: Option<u64>,
pub storage: Option<StorageConfig>,
pub vfs: Option<bool>,
pub remote_mode: Option<bool>,
pub workspace_name: Option<String>,
pub workspaces: Option<Vec<String>>,
}
impl Default for RepositoryConfig {
fn default() -> Self {
RepositoryConfig {
remote_name: None,
remotes: Vec::new(),
subtree_paths: None,
depth: None,
min_version: None,
vnode_size: Some(DEFAULT_VNODE_SIZE),
storage: None,
vfs: None,
remote_mode: None,
workspace_name: None,
workspaces: None,
}
}
}
impl RepositoryConfig {
pub fn from_repo(repo: &LocalRepository) -> Result<Self, OxenError> {
let path = util::fs::config_filepath(&repo.path);
Self::from_file(&path)
}
pub fn from_file(path: impl AsRef<Path>) -> Result<Self, OxenError> {
let contents = util::fs::read_from_path(&path)?;
let remote_config: RepositoryConfig = toml::from_str(&contents)?;
Ok(remote_config)
}
pub fn save(&self, path: impl AsRef<Path>) -> Result<(), OxenError> {
let toml = toml::to_string(&self)?;
util::fs::write_to_path(&path, toml)?;
Ok(())
}
pub fn vnode_size(&self) -> u64 {
self.vnode_size.unwrap_or(DEFAULT_VNODE_SIZE)
}
}