use std::{collections::BTreeMap, fmt::Debug, hash::Hash, marker::PhantomData};
use peace_core::Profile;
use peace_resources::paths::{PeaceAppDir, PeaceDir, ProfileDir, ProfileHistoryDir, WorkspaceDir};
use peace_rt_model::{
params::{
KeyKnown, KeyMaybe, ParamsKeys, ParamsKeysImpl, ParamsTypeRegs, ProfileParams,
WorkspaceParams,
},
Workspace,
};
use serde::{de::DeserializeOwned, Serialize};
#[derive(Debug)]
pub struct MultiProfileNoFlow<'ctx, E, O, PKeys>
where
PKeys: ParamsKeys + 'static,
{
output: &'ctx mut O,
workspace: &'ctx Workspace,
profiles: Vec<Profile>,
profile_dirs: BTreeMap<Profile, ProfileDir>,
profile_history_dirs: BTreeMap<Profile, ProfileHistoryDir>,
params_type_regs: ParamsTypeRegs<PKeys>,
workspace_params: WorkspaceParams<<PKeys::WorkspaceParamsKMaybe as KeyMaybe>::Key>,
profile_to_profile_params:
BTreeMap<Profile, ProfileParams<<PKeys::ProfileParamsKMaybe as KeyMaybe>::Key>>,
marker: PhantomData<E>,
}
#[derive(Debug)]
pub struct MultiProfileNoFlowView<'view, O, PKeys>
where
PKeys: ParamsKeys + 'static,
{
pub output: &'view mut O,
pub workspace: &'view Workspace,
pub profiles: &'view Vec<Profile>,
pub profile_dirs: &'view BTreeMap<Profile, ProfileDir>,
pub profile_history_dirs: &'view BTreeMap<Profile, ProfileHistoryDir>,
pub params_type_regs: &'view ParamsTypeRegs<PKeys>,
pub workspace_params: &'view WorkspaceParams<<PKeys::WorkspaceParamsKMaybe as KeyMaybe>::Key>,
pub profile_to_profile_params:
&'view BTreeMap<Profile, ProfileParams<<PKeys::ProfileParamsKMaybe as KeyMaybe>::Key>>,
}
impl<'ctx, E, O, PKeys> MultiProfileNoFlow<'ctx, E, O, PKeys>
where
PKeys: ParamsKeys + 'static,
{
#[allow(clippy::too_many_arguments)] pub(crate) fn new(
output: &'ctx mut O,
workspace: &'ctx Workspace,
profiles: Vec<Profile>,
profile_dirs: BTreeMap<Profile, ProfileDir>,
profile_history_dirs: BTreeMap<Profile, ProfileHistoryDir>,
params_type_regs: ParamsTypeRegs<PKeys>,
workspace_params: WorkspaceParams<<PKeys::WorkspaceParamsKMaybe as KeyMaybe>::Key>,
profile_to_profile_params: BTreeMap<
Profile,
ProfileParams<<PKeys::ProfileParamsKMaybe as KeyMaybe>::Key>,
>,
) -> Self {
Self {
output,
workspace,
profiles,
profile_dirs,
profile_history_dirs,
params_type_regs,
workspace_params,
profile_to_profile_params,
marker: PhantomData,
}
}
pub fn view(&mut self) -> MultiProfileNoFlowView<'_, O, PKeys> {
let Self {
output,
workspace,
profiles,
profile_dirs,
profile_history_dirs,
params_type_regs,
workspace_params,
profile_to_profile_params,
marker: PhantomData,
} = self;
MultiProfileNoFlowView {
output,
workspace,
profiles,
profile_dirs,
profile_history_dirs,
params_type_regs,
workspace_params,
profile_to_profile_params,
}
}
pub fn output(&self) -> &O {
self.output
}
pub fn output_mut(&mut self) -> &mut O {
self.output
}
pub fn workspace(&self) -> &Workspace {
self.workspace
}
pub fn workspace_dir(&self) -> &WorkspaceDir {
self.workspace.dirs().workspace_dir()
}
pub fn peace_dir(&self) -> &PeaceDir {
self.workspace.dirs().peace_dir()
}
pub fn peace_app_dir(&self) -> &PeaceAppDir {
self.workspace.dirs().peace_app_dir()
}
pub fn profiles(&self) -> &[Profile] {
self.profiles.as_ref()
}
pub fn profile_dirs(&self) -> &BTreeMap<Profile, ProfileDir> {
&self.profile_dirs
}
pub fn profile_history_dirs(&self) -> &BTreeMap<Profile, ProfileHistoryDir> {
&self.profile_history_dirs
}
pub fn params_type_regs(&self) -> &ParamsTypeRegs<PKeys> {
&self.params_type_regs
}
}
impl<'ctx, E, O, WorkspaceParamsK, ProfileParamsKMaybe, FlowParamsKMaybe>
MultiProfileNoFlow<
'ctx,
E,
O,
ParamsKeysImpl<KeyKnown<WorkspaceParamsK>, ProfileParamsKMaybe, FlowParamsKMaybe>,
>
where
WorkspaceParamsK:
Clone + Debug + Eq + Hash + DeserializeOwned + Serialize + Send + Sync + 'static,
ProfileParamsKMaybe: KeyMaybe,
FlowParamsKMaybe: KeyMaybe,
{
pub fn workspace_params(&self) -> &WorkspaceParams<WorkspaceParamsK> {
&self.workspace_params
}
}
impl<'ctx, E, O, WorkspaceParamsKMaybe, ProfileParamsK, FlowParamsKMaybe>
MultiProfileNoFlow<
'ctx,
E,
O,
ParamsKeysImpl<WorkspaceParamsKMaybe, KeyKnown<ProfileParamsK>, FlowParamsKMaybe>,
>
where
WorkspaceParamsKMaybe: KeyMaybe,
ProfileParamsK:
Clone + Debug + Eq + Hash + DeserializeOwned + Serialize + Send + Sync + 'static,
FlowParamsKMaybe: KeyMaybe,
{
pub fn profile_to_profile_params(&self) -> &BTreeMap<Profile, ProfileParams<ProfileParamsK>> {
&self.profile_to_profile_params
}
}