use std::{net::SocketAddr, sync::Arc};
#[cfg(feature = "proxy")]
use crate::common::data::{ActiveForwardingRule, ActiveProxyRule, ForwardingRuleConfig, ProxyRuleConfig};
#[cfg(feature = "record")]
use crate::common::data::{ActiveRecording, RecordingRuleConfig};
#[cfg(feature = "record")]
use bytes::Bytes;
use crate::{
api::adapter::{
MockServerAdapter, ServerAdapterError,
ServerAdapterError::{MockNotFound, UpstreamError},
},
common::data::{ActiveMock, ClosestMatch, MockDefinition, RequestRequirements},
server::state,
};
pub(in crate::api) struct LocalMockServerAdapter {
pub(in crate::api) addr: SocketAddr,
state: Arc<state::HttpMockStateManager>,
}
impl LocalMockServerAdapter {
pub(in crate::api) fn new(addr: SocketAddr, local_state: Arc<state::HttpMockStateManager>) -> Self {
LocalMockServerAdapter {
addr,
state: local_state,
}
}
}
impl MockServerAdapter for LocalMockServerAdapter {
fn host(&self) -> String {
self.addr.ip().to_string()
}
fn port(&self) -> u16 {
self.addr.port()
}
fn address(&self) -> &SocketAddr {
&self.addr
}
async fn reset(&self) -> Result<(), ServerAdapterError> {
self.state.reset();
Ok(())
}
async fn create_mock(&self, mock: &MockDefinition) -> Result<ActiveMock, ServerAdapterError> {
let active_mock = self
.state
.add_mock(mock.clone(), false)
.map_err(|e| UpstreamError(e.to_string()))?;
Ok(active_mock)
}
async fn fetch_mock(&self, mock_id: usize) -> Result<ActiveMock, ServerAdapterError> {
let mock = self
.state
.read_mock(mock_id)
.map_err(|e| UpstreamError(e.to_string()))?
.ok_or(MockNotFound(mock_id))?;
Ok(mock)
}
async fn delete_mock(&self, mock_id: usize) -> Result<(), ServerAdapterError> {
self.state
.delete_mock(mock_id)
.map_err(|e| UpstreamError(format!("Cannot delete mock: {:?}", e)))?;
Ok(())
}
async fn set_up_to_n_times(&self, mock_id: usize, count: usize) -> Result<(), ServerAdapterError> {
let updated = self
.state
.set_up_to_n_times(mock_id, count)
.map_err(|e| UpstreamError(e.to_string()))?;
if !updated {
return Err(MockNotFound(mock_id));
}
Ok(())
}
async fn verify(&self, mock_rr: &RequestRequirements) -> Result<Option<ClosestMatch>, ServerAdapterError> {
let closest_match = self
.state
.verify(mock_rr)
.map_err(|e| UpstreamError(format!("Cannot verify mock: {:?}", e)))?;
Ok(closest_match)
}
#[cfg(feature = "proxy")]
async fn create_forwarding_rule(
&self,
config: ForwardingRuleConfig,
) -> Result<ActiveForwardingRule, ServerAdapterError> {
Ok(self.state.create_forwarding_rule(config))
}
#[cfg(feature = "proxy")]
async fn delete_forwarding_rule(&self, id: usize) -> Result<(), ServerAdapterError> {
self.state.delete_forwarding_rule(id);
Ok(())
}
#[cfg(feature = "proxy")]
async fn create_proxy_rule(&self, config: ProxyRuleConfig) -> Result<ActiveProxyRule, ServerAdapterError> {
Ok(self.state.create_proxy_rule(config))
}
#[cfg(feature = "proxy")]
async fn delete_proxy_rule(&self, id: usize) -> Result<(), ServerAdapterError> {
self.state.delete_proxy_rule(id);
Ok(())
}
#[cfg(feature = "record")]
async fn create_recording(&self, config: RecordingRuleConfig) -> Result<ActiveRecording, ServerAdapterError> {
Ok(self.state.create_recording(config))
}
#[cfg(feature = "record")]
async fn delete_recording(&self, id: usize) -> Result<(), ServerAdapterError> {
self.state.delete_recording(id);
Ok(())
}
#[cfg(feature = "record")]
async fn export_recording(&self, id: usize) -> Result<Option<Bytes>, ServerAdapterError> {
self.state
.export_recording(id)
.map_err(|err| UpstreamError(err.to_string()))
}
#[cfg(feature = "record")]
async fn create_mocks_from_recording(
&self,
recording_file_content: &str,
) -> Result<Vec<usize>, ServerAdapterError> {
self.state
.load_mocks_from_recording(recording_file_content)
.map_err(|err| UpstreamError(err.to_string()))
}
}