use std::marker::PhantomData;
use peace_resources::{resources::ts::SetUp, Resources};
use crate::{
cmd::{cmd_context_builder::KeyUnknown, ts::CmdContextCommon, CmdContextBuilder},
ItemSpecGraph, StatesTypeRegs, Workspace,
};
#[derive(Debug)]
pub struct CmdContext<'ctx, E, O, TS> {
pub workspace: &'ctx Workspace,
pub item_spec_graph: &'ctx ItemSpecGraph<E>,
pub output: &'ctx mut O,
pub resources: Resources<TS>,
pub states_type_regs: StatesTypeRegs,
#[cfg(feature = "output_progress")]
pub cmd_progress_tracker: crate::CmdProgressTracker,
pub(crate) marker: PhantomData<()>,
}
impl<'ctx, E, O> CmdContext<'ctx, E, O, SetUp>
where
E: std::error::Error + From<crate::Error>,
{
pub fn builder(
workspace: &'ctx Workspace,
item_spec_graph: &'ctx ItemSpecGraph<E>,
output: &'ctx mut O,
) -> CmdContextBuilder<'ctx, E, O, CmdContextCommon, KeyUnknown, KeyUnknown, KeyUnknown> {
CmdContextBuilder::new(workspace, item_spec_graph, output)
}
}
#[cfg(not(feature = "output_progress"))]
type CmdContextFields<'ctx, E, O, TS> = (
&'ctx Workspace,
&'ctx ItemSpecGraph<E>,
&'ctx mut O,
Resources<TS>,
StatesTypeRegs,
);
#[cfg(feature = "output_progress")]
type CmdContextFields<'ctx, E, O, TS> = (
&'ctx Workspace,
&'ctx ItemSpecGraph<E>,
&'ctx mut O,
Resources<TS>,
StatesTypeRegs,
crate::CmdProgressTracker,
);
impl<'ctx, E, O, TS> CmdContext<'ctx, E, O, TS>
where
E: std::error::Error,
{
pub fn into_inner(self) -> CmdContextFields<'ctx, E, O, TS> {
let Self {
workspace,
item_spec_graph,
output,
resources,
states_type_regs,
#[cfg(feature = "output_progress")]
cmd_progress_tracker,
marker: _,
} = self;
(
workspace,
item_spec_graph,
output,
resources,
states_type_regs,
#[cfg(feature = "output_progress")]
cmd_progress_tracker,
)
}
pub fn workspace(&self) -> &Workspace {
self.workspace
}
pub fn item_spec_graph(&self) -> &ItemSpecGraph<E> {
self.item_spec_graph
}
pub fn output(&self) -> &O {
&*self.output
}
pub fn output_mut(&mut self) -> &mut O {
self.output
}
pub fn resources(&self) -> &Resources<TS> {
&self.resources
}
pub fn resources_mut(&mut self) -> &mut Resources<TS> {
&mut self.resources
}
}
impl<'ctx, E, O, TS> From<CmdContextFields<'ctx, E, O, TS>> for CmdContext<'ctx, E, O, TS> {
fn from(
#[cfg(not(feature = "output_progress"))]
(workspace, item_spec_graph, output, resources, states_type_regs): CmdContextFields<
'ctx,
E,
O,
TS,
>,
#[cfg(feature = "output_progress")]
(
workspace,
item_spec_graph,
output,
resources,
states_type_regs,
cmd_progress_tracker,
): CmdContextFields<
'ctx,
E,
O,
TS,
>,
) -> Self {
Self {
workspace,
item_spec_graph,
output,
resources,
states_type_regs,
#[cfg(feature = "output_progress")]
cmd_progress_tracker,
marker: PhantomData,
}
}
}
impl<'ctx, E, O, TS0, TS1, F> From<(CmdContext<'ctx, E, O, TS0>, F)> for CmdContext<'ctx, E, O, TS1>
where
E: std::error::Error,
F: FnOnce(Resources<TS0>) -> Resources<TS1>,
{
fn from((cmd_context_ts0, f): (CmdContext<'ctx, E, O, TS0>, F)) -> Self {
#[cfg(not(feature = "output_progress"))]
let (workspace, item_spec_graph, output, resources, states_type_regs) =
cmd_context_ts0.into_inner();
#[cfg(feature = "output_progress")]
let (workspace, item_spec_graph, output, resources, states_type_regs, cmd_progress_tracker) =
cmd_context_ts0.into_inner();
let resources: Resources<TS1> = f(resources);
Self {
workspace,
item_spec_graph,
output,
resources,
states_type_regs,
#[cfg(feature = "output_progress")]
cmd_progress_tracker,
marker: PhantomData,
}
}
}