use std::net::SocketAddr;
use std::str::FromStr;
use std::sync::Arc;
use std::time::Duration;
use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use crate::common::data::{ActiveMock, ClosestMatch, MockDefinition, MockRef, RequestRequirements};
use crate::server::web::handlers::{
add_new_mock, delete_all_mocks, delete_history, delete_one_mock, read_one_mock, verify,
};
pub mod local;
#[cfg(feature = "remote")]
pub mod standalone;
pub type Regex = regex::Regex;
#[derive(Serialize, Deserialize, Debug)]
pub enum Method {
GET,
HEAD,
POST,
PUT,
DELETE,
CONNECT,
OPTIONS,
TRACE,
PATCH,
}
impl FromStr for Method {
type Err = String;
fn from_str(input: &str) -> Result<Self, Self::Err> {
match input {
"GET" => Ok(Method::GET),
"HEAD" => Ok(Method::HEAD),
"POST" => Ok(Method::POST),
"PUT" => Ok(Method::PUT),
"DELETE" => Ok(Method::DELETE),
"CONNECT" => Ok(Method::CONNECT),
"OPTIONS" => Ok(Method::OPTIONS),
"TRACE" => Ok(Method::TRACE),
"PATCH" => Ok(Method::PATCH),
_ => Err(format!("Invalid HTTP method {}", input)),
}
}
}
impl From<&str> for Method {
fn from(value: &str) -> Self {
value.parse().expect("Cannot parse HTTP method")
}
}
impl std::fmt::Display for Method {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
std::fmt::Debug::fmt(self, f)
}
}
#[async_trait]
pub trait MockServerAdapter {
fn host(&self) -> String;
fn port(&self) -> u16;
fn address(&self) -> &SocketAddr;
async fn create_mock(&self, mock: &MockDefinition) -> Result<MockRef, String>;
async fn fetch_mock(&self, mock_id: usize) -> Result<ActiveMock, String>;
async fn delete_mock(&self, mock_id: usize) -> Result<(), String>;
async fn delete_all_mocks(&self) -> Result<(), String>;
async fn verify(&self, rr: &RequestRequirements) -> Result<Option<ClosestMatch>, String>;
async fn delete_history(&self) -> Result<(), String>;
async fn ping(&self) -> Result<(), String>;
}