Skip to main content

mockforge_http/management/
import_export.rs

1use axum::{
2    extract::{Query, State},
3    http::StatusCode,
4    response::{IntoResponse, Json},
5};
6use serde::{Deserialize, Serialize};
7
8use super::{ManagementState, MockConfig};
9
10/// Export format for mock configurations
11#[derive(Debug, Clone, Serialize, Deserialize)]
12#[serde(rename_all = "lowercase")]
13pub enum ExportFormat {
14    /// JSON format
15    Json,
16    /// YAML format
17    Yaml,
18}
19
20/// Export mocks in specified format
21pub(crate) async fn export_mocks(
22    State(state): State<ManagementState>,
23    Query(params): Query<std::collections::HashMap<String, String>>,
24) -> Result<(StatusCode, String), StatusCode> {
25    let mocks = state.mocks.read().await;
26
27    let format = params
28        .get("format")
29        .map(|f| match f.as_str() {
30            "yaml" | "yml" => ExportFormat::Yaml,
31            _ => ExportFormat::Json,
32        })
33        .unwrap_or(ExportFormat::Json);
34
35    match format {
36        ExportFormat::Json => serde_json::to_string_pretty(&*mocks)
37            .map(|json| (StatusCode::OK, json))
38            .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR),
39        ExportFormat::Yaml => serde_yaml::to_string(&*mocks)
40            .map(|yaml| (StatusCode::OK, yaml))
41            .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR),
42    }
43}
44
45/// Import mocks from JSON/YAML
46pub(crate) async fn import_mocks(
47    State(state): State<ManagementState>,
48    Json(mocks): Json<Vec<MockConfig>>,
49) -> impl IntoResponse {
50    let mut current_mocks = state.mocks.write().await;
51    current_mocks.clear();
52    current_mocks.extend(mocks);
53    Json(serde_json::json!({ "status": "imported", "count": current_mocks.len() }))
54}