igor 0.1.2

Generic text-based vendoring
Documentation
use super::use_thundercloud_config_data::UseThundercloudConfigData;
use super::{InvarConfig, InvarState, ThunderConfig, UseThundercloudConfig};
use crate::config_model::invar_config_data::InvarConfigData;
use crate::file_system::{DirEntry, FileSystem};
use crate::path::AbsolutePath;

#[derive(Clone, Debug)]
pub struct ThunderConfigData<TFS: FileSystem, PFS: FileSystem> {
    use_thundercloud: UseThundercloudConfigData,
    default_invar_config: InvarConfigData,
    thundercloud_directory: AbsolutePath,
    cumulus: AbsolutePath,
    invar: AbsolutePath,
    project: AbsolutePath,
    thundercloud_file_system: TFS,
    project_file_system: PFS,
}

impl<TFS: FileSystem, PFS: FileSystem> ThunderConfigData<TFS, PFS> {
    pub fn new<IC: InvarConfig>(
        use_thundercloud: UseThundercloudConfigData,
        default_invar_config: IC,
        thundercloud_directory: AbsolutePath,
        invar: AbsolutePath,
        project: AbsolutePath,
        thundercloud_file_system: TFS,
        project_file_system: PFS,
    ) -> Self {
        let invar_state = default_invar_config.clone_state();
        let invar_defaults = use_thundercloud.invar_defaults();
        let invar_state = invar_state.with_invar_state(invar_defaults.clone_state());
        let target = invar_defaults.target().or(default_invar_config.target());
        let default_invar_config = InvarConfigData::new(invar_state.as_ref(), target);
        let mut cumulus = thundercloud_directory.clone();
        if !use_thundercloud.bare() {
            cumulus.push("cumulus");
        }
        ThunderConfigData {
            use_thundercloud,
            default_invar_config,
            thundercloud_directory,
            cumulus,
            invar,
            project,
            thundercloud_file_system: thundercloud_file_system.clone(),
            project_file_system: project_file_system.clone(),
        }
    }
}

impl<TFS: FileSystem, PFS: FileSystem> ThunderConfig for ThunderConfigData<TFS, PFS> {
    fn use_thundercloud(&self) -> &impl UseThundercloudConfig {
        &self.use_thundercloud
    }

    fn default_invar_config(&self) -> &impl InvarConfig {
        &self.default_invar_config
    }

    fn thundercloud_directory(&self) -> &AbsolutePath {
        &self.thundercloud_directory
    }

    fn cumulus(&self) -> &AbsolutePath {
        &self.cumulus
    }

    fn invar(&self) -> &AbsolutePath {
        &self.invar
    }

    fn project_root(&self) -> &AbsolutePath {
        &self.project
    }

    fn thundercloud_file_system(&self) -> impl FileSystem<DirEntryItem = impl DirEntry> {
        self.thundercloud_file_system.clone()
    }

    fn project_file_system(&self) -> impl FileSystem<DirEntryItem = impl DirEntry> {
        self.project_file_system.clone()
    }
}