use std::sync::Arc;
use async_trait::async_trait;
use reqwest::Request;
use reqwest_middleware::{RequestBuilder, RequestInitialiser};
use serde_json::Value;
#[async_trait]
pub trait JsonResponder: 'static + Send + Sync {
async fn handle(&self, req: Request) -> anyhow::Result<Value>;
}
#[async_trait]
impl<F> JsonResponder for F
where
F: 'static + Send + Sync,
F: Fn(Request) -> anyhow::Result<Value>,
{
async fn handle(&self, req: Request) -> anyhow::Result<Value> {
self(req)
}
}
#[derive(Clone)]
pub struct MockServer {
inner: Arc<dyn JsonResponder>,
}
impl MockServer {
pub fn new(reply: impl JsonResponder) -> Self {
Self {
inner: Arc::new(reply),
}
}
}
#[async_trait]
impl JsonResponder for MockServer {
async fn handle(&self, req: Request) -> anyhow::Result<Value> {
self.inner.handle(req).await
}
}
#[async_trait]
impl RequestInitialiser for MockServer {
fn init(&self, req: RequestBuilder) -> RequestBuilder {
req.with_extension(self.clone())
}
}