use crate::SuitError;
pub use crate::flat_seq::PairView;
use crate::suit_manifest::*;
pub trait SuitStartHandler {
fn on_envelope<'a>(&mut self, envelope: SuitEnvelope<'a>) -> Result<(), SuitError>;
fn on_manifest<'a>(&mut self, manifest: SuitManifest<'a>) -> Result<(), SuitError>;
}
pub trait SuitCommandHandler {
fn on_conditions<'a>(
&mut self,
conditions: impl Iterator<Item = PairView<'a, SuitCondition>>,
) -> Result<(), SuitError>;
fn on_directives<'a>(
&mut self,
directives: impl Iterator<Item = PairView<'a, SuitDirective<'a>>>,
) -> Result<(), SuitError>;
fn on_customs<'a>(
&mut self,
customs: impl Iterator<Item = PairView<'a, CommandCustomValue<'a>>>,
) -> Result<(), SuitError>;
}
pub trait SuitSharedSequenceHandler {
fn on_conditions<'a>(
&mut self,
conditions: impl Iterator<Item = PairView<'a, SuitCondition>>,
) -> Result<(), SuitError>;
fn on_commands<'a>(
&mut self,
commands: impl Iterator<Item = PairView<'a, SuitSharedCommand<'a>>>,
) -> Result<(), SuitError>;
}
pub struct GenericStartHandler<FEnv, FManif>
where
FEnv: Fn(&SuitEnvelope),
FManif: Fn(&SuitManifest),
{
pub on_envelope: FEnv,
pub on_manifest: FManif,
}
impl<FEnv, FManif> SuitStartHandler for GenericStartHandler<FEnv, FManif>
where
FEnv: Fn(&SuitEnvelope),
FManif: Fn(&SuitManifest),
{
fn on_envelope<'a>(&mut self, envelope: SuitEnvelope<'a>) -> Result<(), SuitError> {
(self.on_envelope)(&envelope);
Ok(())
}
fn on_manifest<'a>(&mut self, manifest: SuitManifest<'a>) -> Result<(), SuitError> {
(self.on_manifest)(&manifest);
Ok(())
}
}
pub struct GenericCommandHandler<FCond, FDir, FCustom>
where
FCond: Fn(&SuitCondition),
FDir: Fn(&SuitDirective),
FCustom: Fn(&CommandCustomValue),
{
on_cond: FCond,
on_dir: FDir,
on_custom: FCustom,
}
impl<FCond, FDir, FCustom> SuitCommandHandler for GenericCommandHandler<FCond, FDir, FCustom>
where
FCond: Fn(&SuitCondition),
FDir: Fn(&SuitDirective),
FCustom: Fn(&CommandCustomValue),
{
fn on_conditions<'a>(
&mut self,
conditions: impl Iterator<Item = PairView<'a, SuitCondition>>,
) -> Result<(), SuitError> {
for cond in conditions {
(self.on_cond)(&cond.get()?);
}
Ok(())
}
fn on_directives<'a>(
&mut self,
directives: impl Iterator<Item = PairView<'a, SuitDirective<'a>>>,
) -> Result<(), SuitError> {
for dir in directives {
(self.on_dir)(&dir.get()?);
}
Ok(())
}
fn on_customs<'a>(
&mut self,
customs: impl Iterator<Item = PairView<'a, CommandCustomValue<'a>>>,
) -> Result<(), SuitError> {
for c in customs {
(self.on_custom)(&c.get()?);
}
Ok(())
}
}
pub struct GenericSharedSequenceHandler<FCond, FCom>
where
FCond: Fn(&SuitCondition),
FCom: Fn(&SuitSharedCommand),
{
on_cond: FCond,
on_com: FCom,
}
impl<FCond, FCom> SuitSharedSequenceHandler for GenericSharedSequenceHandler<FCond, FCom>
where
FCond: Fn(&SuitCondition),
FCom: Fn(&SuitSharedCommand),
{
fn on_conditions<'a>(
&mut self,
conditions: impl Iterator<Item = PairView<'a, SuitCondition>>,
) -> Result<(), SuitError> {
for cond in conditions {
(self.on_cond)(&cond.get()?);
}
Ok(())
}
fn on_commands<'a>(
&mut self,
customs: impl Iterator<Item = PairView<'a, SuitSharedCommand<'a>>>,
) -> Result<(), SuitError> {
for c in customs {
(self.on_com)(&c.get()?);
}
Ok(())
}
}