use std::fmt::Debug;
use std::borrow::ToOwned;
use rustyphoenixdatastream::{datastream_read, datastream_write};
use crate::abstract_mock_backend::AbstractMockBackend;
#[derive(Debug, Default, Clone)]
pub struct GenericVecMock<T>
where T: Default + rustyphoenixdatastream::DataStream + std::cmp::PartialEq<T> + Debug, T: ToOwned<Owned = T>
{
filename: String,
vec_value: Vec<T>,
current_index: usize,
is_mock_record: bool,
}
impl<T: Default + ToOwned<Owned = T> + rustyphoenixdatastream::DataStream + std::cmp::PartialEq<T> + Debug> AbstractMockBackend<T> for GenericVecMock<T>
{
fn new() -> Self{
GenericVecMock::<T>{
filename: String::from(""),
vec_value: vec![],
current_index: 0,
is_mock_record: false
}
}
fn get_current_index(&self) -> usize{
return self.current_index;
}
fn get_is_mock_record(&self) -> bool{
return self.is_mock_record;
}
fn get_current_value(&mut self, value: &mut T){
if self.is_mock_record {
panic!("GenericVecMock<T>::get_current_value cannot be call in mock record mode !")
}
if self.vec_value.len() == 0 {
match datastream_read(&self.filename, &mut self.vec_value) {
Ok(file) => file,
Err(error) => panic!("GenericVecMock<T>::get_current_value : Problem reading the file '{}': error: {:?}", self.filename, error),
}
}
*value = self.vec_value[self.current_index].to_owned();
self.current_index += 1;
if self.current_index >= self.vec_value.len() {
self.current_index = 0;
}
}
fn check_current_value(&mut self, value: &T) -> bool{
let mut reference_value: T = Default::default();
self.get_current_value(&mut reference_value);
let is_equal: bool = reference_value == *value;
if ! is_equal {
println!("GenericVecMock<T>::check_current_value : different values");
println!("\t value = '{:?}'", value);
println!("\treference_value = '{:?}'", reference_value);
}
return is_equal;
}
fn append(&mut self, value: &T){
if !self.is_mock_record {
panic!("GenericVecMock<T>::append cannot be call when record mode is disable !")
}
self.vec_value.push(value.to_owned());
}
fn set_is_record(&mut self, is_mock_record: bool){
self.is_mock_record = is_mock_record;
}
fn set_filename(&mut self, filename: &String){
self.filename = filename.to_string();
}
fn close(&mut self){
if self.is_mock_record {
match datastream_write(&self.filename, &self.vec_value) {
Ok(is_ok) => is_ok,
Err(error) => panic!("GenericVecMock<T>::close : Problem writing the file '{}': error: {:?}", self.filename, error),
}
self.is_mock_record = false;
self.current_index = 0;
}
}
}
impl<T: Default + ToOwned<Owned = T> + rustyphoenixdatastream::DataStream + std::cmp::PartialEq<T> + Debug> Drop for GenericVecMock<T> {
fn drop(&mut self){
self.close();
}
}