#![doc = include_str!("../README.md")]
#![deny(missing_docs)]
use std::ops::{Deref, DerefMut};
use crate::{
config::EasyHttpMockConfig, errors::EasyHttpMockError, mock::MockState, server::ServerAdapter,
};
pub mod config;
pub mod errors;
pub mod matchers;
pub mod mock;
pub mod server;
#[cfg(test)]
mod tests;
pub type HttpMockResult<T> = Result<T, EasyHttpMockError>;
pub struct EasyHttpMock<S>
where
S: ServerAdapter,
{
config: EasyHttpMockConfig<S>,
server: S,
}
impl<S: ServerAdapter> Deref for EasyHttpMock<S> {
type Target = S;
fn deref(&self) -> &Self::Target {
&self.server
}
}
impl<S: ServerAdapter> DerefMut for EasyHttpMock<S> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.server
}
}
impl<S: ServerAdapter> EasyHttpMock<S> {
pub fn new(config: EasyHttpMockConfig<S>) -> Result<EasyHttpMock<S>, EasyHttpMockError> {
let server = S::new(
config
.server_config
.clone(),
)?;
Ok(EasyHttpMock { config, server })
}
pub fn url(&self, path: &str) -> String {
if let Some(base_url) = &self.config.base_url {
format!("{}{}", base_url, path)
} else {
format!(
"{}{}",
self.server
.base_url(),
path
)
}
}
pub fn base_url(&self) -> String {
self.server
.base_url()
}
pub async fn register_mock(&mut self, mock: &MockState) -> HttpMockResult<()> {
self.server
.register_mock(mock.inner());
self.start().await
}
pub async fn stop(&mut self) -> HttpMockResult<()> {
self.server
.stop()
.await
}
}