use std::sync::Arc;
use crate::config::ConfigManager;
use crate::datastore::DataStore;
use crate::fs::Fs;
use crate::gates::HostFacts;
use crate::paths::Pather;
pub struct ExecutionContext {
pub fs: Arc<dyn Fs>,
pub datastore: Arc<dyn DataStore>,
pub paths: Arc<dyn Pather>,
pub config_manager: Arc<ConfigManager>,
pub syntax_checker: Arc<dyn crate::shell::SyntaxChecker>,
pub command_runner: Arc<dyn crate::datastore::CommandRunner>,
pub dry_run: bool,
pub no_provision: bool,
pub provision_rerun: bool,
pub force: bool,
pub view_mode: crate::commands::ViewMode,
pub group_mode: crate::commands::GroupMode,
pub verbose: bool,
pub host_facts: Arc<HostFacts>,
}
impl ExecutionContext {
pub fn production(dotfiles_root: &std::path::Path, verbose: bool) -> crate::Result<Self> {
let config_manager = Arc::new(ConfigManager::new(dotfiles_root)?);
let mut paths_builder = crate::paths::XdgPather::builder().dotfiles_root(dotfiles_root);
if let Ok(root_config) = config_manager.root_config() {
if !root_config.symlink.app_uses_library {
let home = std::env::var("HOME")
.map(std::path::PathBuf::from)
.unwrap_or_else(|_| std::path::PathBuf::from("/tmp/dodot-unknown-home"));
let xdg = std::env::var("XDG_CONFIG_HOME")
.map(std::path::PathBuf::from)
.unwrap_or_else(|_| home.join(".config"));
paths_builder = paths_builder.app_support_dir(xdg);
}
}
let paths = Arc::new(paths_builder.build()?);
let fs: Arc<dyn Fs> = Arc::new(crate::fs::OsFs::new());
let runner: Arc<dyn crate::datastore::CommandRunner> =
Arc::new(crate::datastore::ShellCommandRunner::new(verbose));
let datastore: Arc<dyn DataStore> = Arc::new(crate::datastore::FilesystemDataStore::new(
fs.clone(),
paths.clone(),
runner.clone(),
));
Ok(Self {
fs,
datastore,
paths,
config_manager,
syntax_checker: Arc::new(crate::shell::SystemSyntaxChecker),
command_runner: runner,
dry_run: false,
no_provision: false,
provision_rerun: false,
force: false,
view_mode: crate::commands::ViewMode::default(),
group_mode: crate::commands::GroupMode::default(),
verbose,
host_facts: Arc::new(HostFacts::detect()),
})
}
}