1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
use crate::flume_log::*; use std::iter::IntoIterator; pub struct MemLog { log: Vec<Vec<u8>>, } impl MemLog { pub fn new() -> MemLog { let log = Vec::new(); MemLog { log } } } impl FlumeLog for MemLog { fn get(&self, seq_num: u64) -> Result<Vec<u8>, Error> { self.log .get(seq_num as usize) .map(|slice| slice.clone()) .ok_or(FlumeLogError::SequenceNotFound { sequence: seq_num }.into()) } fn clear(&mut self, seq: u64) { self.log[seq as usize] = Vec::new(); } fn latest(&self) -> Option<u64> { if self.log.len() == 0 { None } else { Some(self.log.len() as u64 - 1) } } fn append(&mut self, buff: &[u8]) -> Result<u64, Error> { let seq = self.log.len(); let mut vec = Vec::new(); vec.extend_from_slice(buff); self.log.push(vec); Ok(seq as u64) } } impl<'a> IntoIterator for &'a MemLog { type Item = &'a Vec<u8>; type IntoIter = std::slice::Iter<'a, Vec<u8>>; fn into_iter(self) -> Self::IntoIter { self.log.iter() } } #[cfg(test)] mod tests { use crate::flume_log::*; use crate::mem_log::MemLog; #[test] fn get() { let mut log = MemLog::new(); let seq0 = log.append("Hello".as_bytes()).unwrap(); match log.get(seq0) { Ok(result) => assert_eq!(String::from_utf8_lossy(&result), "Hello"), _ => assert!(false), } } #[test] fn clear() { let mut log = MemLog::new(); let seq0 = log.append("Hello".as_bytes()).unwrap(); log.clear(seq0); match log.get(seq0) { Ok(result) => { assert_eq!(result.len(), 0); } _ => assert!(false), } } #[test] fn iter() { let mut log = MemLog::new(); let seq0 = log.append("Hello".as_bytes()).unwrap(); log.append(" ".as_bytes()).unwrap(); log.append("World".as_bytes()).unwrap(); let result = log .into_iter() .map(|bytes| String::from_utf8_lossy(bytes)) .fold(String::new(), |mut acc: String, elem| { acc.push_str(&elem); acc }); assert_eq!( result, "Hello World", "Expected Hello World, got {}", result ); match log.get(seq0) { Ok(result) => assert_eq!(String::from_utf8_lossy(&result), "Hello"), _ => assert!(false), } } }