use crate::phoenix_request::{
PRequestParam,
PResponseParam,
PhoenixRequestStream,
PhoenixRequestMockStream,
PhoenixRequestServer,
PhoenixRequestMockServer
};
#[derive(Debug, PartialEq, Copy, Clone)]
pub enum PRequestMode {
NoMock,
Mock,
MockRecord,
}
pub struct PGenericRequestStream<TBackend, TMockBackend> {
mode: PRequestMode,
backend: TBackend,
mock_backend: TMockBackend,
}
impl<TBackend: PhoenixRequestStream, TMockBackend: PhoenixRequestStream + PhoenixRequestMockStream> PGenericRequestStream<TBackend, TMockBackend> {
pub fn set_mode(&mut self, mode: PRequestMode){
self.mode = mode;
self.mock_backend.set_is_record(mode == PRequestMode::MockRecord);
}
pub fn get_mode(&self) -> PRequestMode{
return self.mode;
}
pub fn set_prefix(&mut self, prefix: &String){
self.mock_backend.set_prefix(prefix);
}
pub fn recv_request(&mut self, request: &mut PRequestParam) -> bool{
if self.mode == PRequestMode::NoMock {
return self.backend.recv_request(request);
}else if self.mode == PRequestMode::Mock {
return self.mock_backend.recv_request(request);
}else{
let status = self.backend.recv_request(request);
self.mock_backend.recv_request(request);
return status;
}
}
pub fn send_response(&mut self, response: &PResponseParam){
if self.mode == PRequestMode::NoMock {
self.backend.send_response(response);
}else if self.mode == PRequestMode::Mock {
self.mock_backend.send_response(response);
}else{
self.backend.send_response(response);
self.mock_backend.send_response(response);
}
}
}
pub struct PGenericRequestServer<TBackend, TMockBackend>
where TBackend: PhoenixRequestServer,
TMockBackend: PhoenixRequestServer + PhoenixRequestMockServer,
<TBackend as PhoenixRequestServer>::Stream: PhoenixRequestStream,
<TMockBackend>::Stream: PhoenixRequestStream + PhoenixRequestMockStream
{
mode: PRequestMode,
backend: TBackend,
mock_backend: TMockBackend,
mock_prefix: String,
nb_query: u64,
}
impl<TBackend: PhoenixRequestServer, TMockBackend: PhoenixRequestServer + PhoenixRequestMockServer> PGenericRequestServer<TBackend, TMockBackend>
where TBackend: PhoenixRequestServer,
TMockBackend: PhoenixRequestServer + PhoenixRequestMockServer,
<TBackend as PhoenixRequestServer>::Stream: PhoenixRequestStream,
<TMockBackend>::Stream: PhoenixRequestStream + PhoenixRequestMockStream
{
pub fn new(hostname: &String, port: u16, mode: PRequestMode) -> Self {
let mut other = PGenericRequestServer{
mode: mode,
backend: TBackend::new(hostname, port),
mock_backend: TMockBackend::new(hostname, port),
mock_prefix: String::from(""),
nb_query: 0
};
other.mock_backend.set_is_record(mode == PRequestMode::MockRecord);
return other;
}
pub fn set_mode(&mut self, mode: PRequestMode){
self.mode = mode;
self.mock_backend.set_is_record(mode == PRequestMode::MockRecord);
}
pub fn get_mode(&self) -> PRequestMode{
return self.mode;
}
pub fn set_prefix(&mut self, prefix: &String){
self.mock_backend.set_prefix(prefix);
}
pub fn accept(&mut self) -> PGenericRequestStream<TBackend::Stream, TMockBackend::Stream>{
let mut other = PGenericRequestStream{
mode: self.mode,
backend: self.backend.accept(),
mock_backend: self.mock_backend.accept(),
};
let full_prefix = format!("{}_{}", self.mock_prefix, self.nb_query);
other.set_prefix(&full_prefix);
self.nb_query += 1;
return other;
}
}