mockforge_http/handlers/
failure_designer.rs1use 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;
14pub type ValidateRuleRequest = handlers::ValidateRuleRequest<FailureDesignRule>;
16pub type GenerateScenarioRequest = handlers::GenerateScenarioRequest<FailureDesignRule>;
18pub type GenerateScenarioResponse = handlers::GenerateScenarioResponse<ChaosScenario>;
20
21#[derive(Clone)]
23pub struct FailureDesignerState {
24 pub designer: Arc<FailureDesigner>,
26}
27
28impl FailureDesignerState {
29 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}
63pub async fn validate_rule(
65 state: State<FailureDesignerState>,
66 request: Json<ValidateRuleRequest>,
67) -> Json<Value> {
68 handlers::validate_rule(state, request).await
69}
70pub 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}
77pub 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}