mockforge_http/management/
import_export.rs1use axum::{
2 extract::{Query, State},
3 http::StatusCode,
4 response::{IntoResponse, Json},
5};
6use serde::{Deserialize, Serialize};
7
8use super::{ManagementState, MockConfig};
9
10#[derive(Debug, Clone, Serialize, Deserialize)]
12#[serde(rename_all = "lowercase")]
13pub enum ExportFormat {
14 Json,
16 Yaml,
18}
19
20pub(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
45pub(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}