use std::{env, error::Error, path::PathBuf, sync::Arc};
use crate::{
config::ProtofetchConfig, fetch::ParallelConfig, git::cache::ProtofetchGitCache, Protofetch,
};
#[derive(Default)]
pub struct ProtofetchBuilder {
root: Option<PathBuf>,
module_file_name: Option<PathBuf>,
lock_file_name: Option<PathBuf>,
cache_directory_path: Option<PathBuf>,
output_directory_name: Option<PathBuf>,
jobs: Option<usize>,
copy_jobs: Option<usize>,
}
impl ProtofetchBuilder {
pub fn root(mut self, path: impl Into<PathBuf>) -> Self {
self.root = Some(path.into());
self
}
pub fn module_file_name(mut self, path: impl Into<PathBuf>) -> Self {
self.module_file_name = Some(path.into());
self
}
pub fn lock_file_name(mut self, path: impl Into<PathBuf>) -> Self {
self.lock_file_name = Some(path.into());
self
}
pub fn output_directory_name(mut self, path: impl Into<PathBuf>) -> Self {
self.output_directory_name = Some(path.into());
self
}
pub fn cache_directory(mut self, path: impl Into<PathBuf>) -> Self {
self.cache_directory_path = Some(path.into());
self
}
pub fn jobs(mut self, jobs: usize) -> Self {
self.jobs = Some(jobs.max(1));
self
}
pub fn copy_jobs(mut self, jobs: usize) -> Self {
self.copy_jobs = Some(jobs.max(1));
self
}
pub fn try_build(self) -> Result<Protofetch, Box<dyn Error>> {
let config = ProtofetchConfig::load()?;
let Self {
root,
module_file_name,
lock_file_name,
output_directory_name,
cache_directory_path,
jobs,
copy_jobs,
} = self;
let root = match root {
Some(root) => root,
None => env::current_dir()?,
};
let module_file_name = module_file_name.unwrap_or_else(|| PathBuf::from("protofetch.toml"));
let lock_file_name = lock_file_name.unwrap_or_else(|| PathBuf::from("protofetch.lock"));
let cache_directory = root.join(cache_directory_path.unwrap_or(config.cache_dir));
let cache = ProtofetchGitCache::new(cache_directory, config.default_protocol)?;
let mut parallel = ParallelConfig::default();
if let Some(j) = config.jobs {
parallel.network_jobs = j.max(1);
}
if let Some(j) = config.copy_jobs {
parallel.copy_jobs = j.max(1);
}
if let Some(j) = jobs {
parallel.network_jobs = j;
}
if let Some(j) = copy_jobs {
parallel.copy_jobs = j;
}
Ok(Protofetch {
cache: Arc::new(cache),
root,
module_file_name,
lock_file_name,
output_directory_name,
parallel,
})
}
}