use super::DBError; use std::{collections::HashMap, fmt, str}; #[derive(Clone)] pub struct Databases; impl Databases { fn new() -> Self { Self {} } } #[derive(Clone)] pub enum CacheType { Raw(String), DBMap(Databases), } impl CacheType { fn entry_type(&self) -> String { match self { CacheType::Raw(_) => "Raw".to_string(), CacheType::DBMap(_) => "DBMap".to_string(), } } pub fn to_bytes(&self) -> Vec { let mut output = self.entry_type().into_bytes(); output.push(0); match self { CacheType::Raw(s) => output.append(&mut s.as_bytes().to_vec()), CacheType::DBMap(_) => todo!(), } return output; } pub fn from_bytes(data: Vec) -> Result { let mut data_iter = data.iter(); let mut letter: u8 = *data_iter.next().unwrap(); let mut header: Vec = Vec::new(); while letter != 0 { header.push(letter.clone()); letter = *data_iter.next().unwrap(); } let header = str::from_utf8(&header).unwrap().to_string(); match header.as_str() { "Raw" => { let mut output: Vec = Vec::new(); for letter in data_iter { output.push(letter.clone()); } Ok(CacheType::Raw(str::from_utf8(&output).unwrap().to_string())) } _ => Err(DBError::new("fred")), } } } impl fmt::Display for CacheType { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { CacheType::Raw(s) => write!(f, "{}", s), CacheType::DBMap(_) => todo!(), } } } #[cfg(test)] mod databases { use super::*; #[test] fn get_databases() { Databases::new(); } } #[cfg(test)] mod raw { use super::*; #[test] fn get_bytes() { let data = "addams"; let holder = CacheType::Raw(data.to_string()); let mut expected = holder.entry_type().into_bytes(); expected.push(0); expected.append(&mut data.as_bytes().to_vec()); let output = holder.to_bytes(); assert_eq!(output, expected); } #[test] fn from_bytes() { let holder = CacheType::Raw("stored item".to_string()); let data = holder.to_bytes(); let output = CacheType::from_bytes(data).unwrap(); assert_eq!(output.to_string(), holder.to_string()); } } #[cfg(test)] mod enum_ctype { use super::*; #[test] fn get_raw_type() { let holder = CacheType::Raw("nothing important".to_string()); assert_eq!(holder.entry_type(), "Raw"); } #[test] fn get_dbmap_type() { let holder = CacheType::DBMap(Databases::new()); assert_eq!(holder.entry_type(), "DBMap"); } #[test] fn bad_file() { let mut data: Vec = Vec::new(); let mut ctype = "jlksdfg".as_bytes().to_vec(); let mut cdata = "ghjk".as_bytes().to_vec(); data.append(&mut ctype); data.push(0); data.append(&mut cdata); match CacheType::from_bytes(data) { Ok(_) => assert!(false, "This should fail."), Err(_) => (), } } }