use async_trait::async_trait;
use super::error::{DecisionError, DecisionResult, DecisionState};
use super::types::{Decision, DecisionCriteria, DecisionInput, DecisionOutcome, DecisionStats};
#[async_trait]
pub trait DecisionEngine: Send + Sync {
fn name(&self) -> &str;
fn state(&self) -> DecisionState;
async fn start(&mut self) -> DecisionResult<()>;
async fn stop(&mut self) -> DecisionResult<()>;
async fn make_decisions(
&mut self,
input: DecisionInput,
criteria: &DecisionCriteria,
) -> DecisionResult<Vec<Decision>>;
async fn record_outcome(&mut self, outcome: DecisionOutcome) -> DecisionResult<()>;
fn get_stats(&self) -> DecisionStats;
async fn health_check(&self) -> DecisionResult<()>;
async fn reset(&mut self) -> DecisionResult<()>;
}
#[async_trait]
pub trait OptimizationStrategy: Send + Sync {
fn name(&self) -> &str;
fn priority(&self) -> u32;
fn is_applicable(&self, input: &DecisionInput) -> bool;
async fn evaluate(
&self,
input: &DecisionInput,
criteria: &DecisionCriteria,
) -> DecisionResult<Vec<Decision>>;
async fn validate(
&self,
decision: &Decision,
criteria: &DecisionCriteria,
) -> DecisionResult<()>;
async fn learn(&mut self, decision: &Decision, outcome: &DecisionOutcome)
-> DecisionResult<()>;
fn get_stats(&self) -> serde_json::Value;
}
#[async_trait]
pub trait DecisionValidator: Send + Sync {
async fn validate(
&self,
decision: &Decision,
criteria: &DecisionCriteria,
) -> DecisionResult<()>;
}
#[async_trait]
pub trait DecisionExecutor: Send + Sync {
async fn execute(&self, decision: &Decision) -> DecisionResult<DecisionOutcome>;
async fn rollback(&self, decision: &Decision) -> DecisionResult<()>;
}