use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
use clap::ValueEnum;
#[derive(ValueEnum, Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Method {
#[serde(alias = "Get", alias = "GET")]
Get,
#[serde(alias = "Post", alias = "POST")]
Post,
#[serde(alias = "Put", alias = "PUT")]
Put,
#[serde(alias = "Delete", alias = "DELETE")]
Delete,
#[serde(alias = "Patch", alias = "PATCH")]
Patch,
}
#[derive(ValueEnum, Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Scheme {
#[serde(alias = "Http", alias = "HTTP")]
Http,
#[serde(alias = "Https", alias = "HTTPS")]
Https,
}
impl std::fmt::Display for Scheme {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Scheme::Http => write!(f, "http"),
Scheme::Https => write!(f, "https"),
}
}
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Config {
pub capture: Option<Capture>,
pub run: Vec<Run>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Capture {
pub env_file: Option<std::path::PathBuf>,
pub environment_variables: Option<HashMap<String, String>>,
pub request: Option<Vec<CaptureRequest>>,
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(rename = "request")]
pub struct CaptureRequest {
pub name: Option<String>,
pub headers: Option<HashMap<String, String>>,
pub method: Method,
pub scheme: Scheme,
pub host: String,
pub port: Option<u16>,
pub path: Option<String>,
pub body: Option<String>,
pub capture: Option<HashMap<String, String>>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Run {
pub name: String,
pub headers: Option<HashMap<String, String>>,
pub method: Option<Method>,
pub scheme: Option<Scheme>,
pub host: Option<String>,
pub port: Option<u16>,
pub path: Option<String>,
pub body: Option<String>,
pub request: Vec<Request>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Request {
pub name: String,
pub headers: Option<HashMap<String, String>>,
pub method: Option<Method>,
pub scheme: Option<Scheme>,
pub host: Option<String>,
pub port: Option<u16>,
pub path: Option<String>,
pub body: Option<String>,
pub capture: Option<HashMap<String, String>>,
pub assert: Option<Assert>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Assert {
#[serde(default)]
pub breaking: bool,
pub status: Option<u16>,
pub body_matches: Option<HashMap<String, Value>>,
pub subset_matches: Option<HashMap<String, Value>>,
pub subset_includes: Option<Vec<String>>,
pub subset_regex: Option<HashMap<String, Value>>,
}