use std::{
error::Error,
path::{Path, PathBuf},
sync::Arc,
};
use crate::{
cli::command_handlers::{do_clean, do_fetch, do_init, do_lock, do_migrate},
fetch::ParallelConfig,
git::cache::ProtofetchGitCache,
};
mod builder;
pub use builder::ProtofetchBuilder;
pub struct Protofetch {
cache: Arc<ProtofetchGitCache>,
root: PathBuf,
module_file_name: PathBuf,
lock_file_name: PathBuf,
output_directory_name: Option<PathBuf>,
parallel: ParallelConfig,
}
#[allow(dead_code)]
fn _assert_protofetch_auto_traits() {
fn assert<T: Send + Sync + std::panic::UnwindSafe + std::panic::RefUnwindSafe>() {}
assert::<Protofetch>();
}
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum LockMode {
Locked,
Update,
Recreate,
}
impl Protofetch {
pub fn builder() -> ProtofetchBuilder {
ProtofetchBuilder::default()
}
pub fn init(&self, name: Option<String>) -> Result<(), Box<dyn Error>> {
do_init(&self.root, name, &self.module_file_name)
}
pub fn fetch(&self, lock_mode: LockMode) -> Result<(), Box<dyn Error>> {
do_fetch(
lock_mode,
self.cache.clone(),
&self.root,
&self.module_file_name,
&self.lock_file_name,
self.output_directory_name.as_deref(),
self.parallel,
)
}
pub fn lock(&self, lock_mode: LockMode) -> Result<(), Box<dyn Error>> {
do_lock(
lock_mode,
self.cache.clone(),
&self.root,
&self.module_file_name,
&self.lock_file_name,
self.parallel,
)?;
Ok(())
}
pub fn migrate(
&self,
name: Option<String>,
source_directory_path: impl AsRef<Path>,
) -> Result<(), Box<dyn Error>> {
do_migrate(
&self.root,
name,
&self.module_file_name,
source_directory_path.as_ref(),
)
}
pub fn clean(&self) -> Result<(), Box<dyn Error>> {
do_clean(
&self.root,
&self.module_file_name,
&self.lock_file_name,
self.output_directory_name.as_deref(),
)
}
pub fn clear_cache(&self) -> Result<(), Box<dyn Error>> {
self.cache.clear()?;
Ok(())
}
}