use crate::client::replay::RecordMode;
use client::{Client, Response};
use client::{DirectClient, RecordingTarget, ReplayClient, StubClient};
use config::ClientConfig;
use error::Error;
use request::Request;
use std::path::PathBuf;
enum InnerClient {
Direct(DirectClient),
Replay(ReplayClient),
Stub(StubClient),
}
pub struct GenericClient {
inner: InnerClient,
}
impl GenericClient {
pub fn direct() -> Self {
DirectClient::new().into()
}
pub fn replay_file<P: Into<PathBuf>>(replay_file: P) -> Self {
ReplayClient::new(RecordingTarget::File(replay_file.into()), RecordMode::default()).into()
}
pub fn replay_dir<P: Into<PathBuf>>(replay_dir: P) -> Self {
ReplayClient::new(RecordingTarget::Dir(replay_dir.into()), RecordMode::default()).into()
}
pub fn stub(client: StubClient) -> Self {
client.into()
}
pub fn force_record_next(&self) {
match self.inner {
InnerClient::Direct(_) | InnerClient::Stub(_) => {}
InnerClient::Replay(ref replay) => replay.force_record_next(),
}
}
}
impl From<DirectClient> for GenericClient {
fn from(c: DirectClient) -> Self {
GenericClient {
inner: InnerClient::Direct(c),
}
}
}
impl From<ReplayClient> for GenericClient {
fn from(c: ReplayClient) -> Self {
GenericClient {
inner: InnerClient::Replay(c),
}
}
}
impl From<StubClient> for GenericClient {
fn from(c: StubClient) -> Self {
GenericClient {
inner: InnerClient::Stub(c),
}
}
}
impl Client for GenericClient {
fn execute(&self, config: Option<&ClientConfig>, request: Request) -> Result<Response, Error> {
match self.inner {
InnerClient::Direct(ref client) => client.execute(config, request),
InnerClient::Replay(ref client) => client.execute(config, request),
InnerClient::Stub(ref client) => client.execute(config, request),
}
}
fn config(&self) -> &ClientConfig {
match self.inner {
InnerClient::Direct(ref client) => client.config(),
InnerClient::Replay(ref client) => client.config(),
InnerClient::Stub(ref client) => client.config(),
}
}
fn config_mut(&mut self) -> &mut ClientConfig {
match self.inner {
InnerClient::Direct(ref mut client) => client.config_mut(),
InnerClient::Replay(ref mut client) => client.config_mut(),
InnerClient::Stub(ref mut client) => client.config_mut(),
}
}
}