use crate::bootstrap::{BootstrapStep, StepOutcome};
use crate::event::{Drift, ForgeEvent};
use crate::model::{RepoSpec, RepoState, RoleAssignment};
use crate::resource::Resource;
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum HookDecision<P> {
Continue,
Modify(P),
Abort(String),
}
pub trait ForgeHooks: Send + Sync {
fn before_create(&self, _spec: &RepoSpec) -> HookDecision<RepoSpec> {
HookDecision::Continue
}
fn after_create(&self, _state: &RepoState) -> HookDecision<Vec<BootstrapStep>> {
HookDecision::Continue
}
fn before_apply_roles(
&self,
_repo: &Resource,
_desired: &[RoleAssignment],
) -> HookDecision<Vec<RoleAssignment>> {
HookDecision::Continue
}
fn after_bootstrap(
&self,
_repo: &Resource,
_outcomes: &[(String, StepOutcome)],
) -> HookDecision<Vec<BootstrapStep>> {
HookDecision::Continue
}
fn on_event(&self, _event: &ForgeEvent) -> HookDecision<ForgeEvent> {
HookDecision::Continue
}
fn on_drift(&self, _repo: &Resource, _drift: &[Drift]) -> HookDecision<Vec<Drift>> {
HookDecision::Continue
}
}
#[derive(Debug, Clone, Copy, Default)]
pub struct NoHooks;
impl ForgeHooks for NoHooks {}