Skip to main content

mockforge_http/handlers/
failure_designer.rs

1//! Compatibility state and typed Chaos adapter for Intelligence handlers.
2use axum::{extract::State, response::Json};
3use mockforge_chaos::{
4    failure_designer::{FailureDesignRule, FailureDesigner, FailureType},
5    ChaosScenario,
6};
7use mockforge_intelligence::handlers::failure_designer::{
8    self as handlers, FailureDesignerProvider,
9};
10use serde_json::Value;
11use std::sync::Arc;
12
13pub use handlers::ValidateRuleResponse;
14/// Original rule validation request type.
15pub type ValidateRuleRequest = handlers::ValidateRuleRequest<FailureDesignRule>;
16/// Original scenario generation request type.
17pub type GenerateScenarioRequest = handlers::GenerateScenarioRequest<FailureDesignRule>;
18/// Original typed scenario generation response.
19pub type GenerateScenarioResponse = handlers::GenerateScenarioResponse<ChaosScenario>;
20
21/// Failure designer API state
22#[derive(Clone)]
23pub struct FailureDesignerState {
24    /// Failure designer instance
25    pub designer: Arc<FailureDesigner>,
26}
27
28impl FailureDesignerState {
29    /// Create new failure designer state
30    pub fn new() -> Self {
31        Self {
32            designer: Arc::new(FailureDesigner::new()),
33        }
34    }
35}
36
37impl Default for FailureDesignerState {
38    fn default() -> Self {
39        Self::new()
40    }
41}
42
43impl FailureDesignerProvider for FailureDesignerState {
44    type Rule = FailureDesignRule;
45    type Scenario = ChaosScenario;
46    fn validate_rule(&self, rule: &Self::Rule) -> Result<(), String> {
47        self.designer.validate_rule(rule)
48    }
49    fn rule_to_scenario(&self, rule: &Self::Rule) -> Result<Self::Scenario, String> {
50        self.designer.rule_to_scenario(rule)
51    }
52    fn generate_route_chaos_config(&self, rule: &Self::Rule) -> Result<Value, String> {
53        self.designer.generate_route_chaos_config(rule)
54    }
55    fn webhook_hook(&self, rule: &Self::Rule) -> Result<Option<Value>, String> {
56        if matches!(rule.failure_type, FailureType::WebhookFailure { .. }) {
57            self.designer.generate_webhook_hook(rule).map(Some)
58        } else {
59            Ok(None)
60        }
61    }
62}
63/// Validate through the original state and request paths.
64pub async fn validate_rule(
65    state: State<FailureDesignerState>,
66    request: Json<ValidateRuleRequest>,
67) -> Json<Value> {
68    handlers::validate_rule(state, request).await
69}
70/// Generate through the original state and request paths.
71pub async fn generate_scenario(
72    state: State<FailureDesignerState>,
73    request: Json<GenerateScenarioRequest>,
74) -> Result<Json<Value>, String> {
75    handlers::generate_scenario(state, request).await
76}
77/// Preview through the original state and request paths.
78pub async fn preview_config(
79    state: State<FailureDesignerState>,
80    request: Json<GenerateScenarioRequest>,
81) -> Result<Json<Value>, String> {
82    handlers::preview_config(state, request).await
83}