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
use core::str::FromStr; use crate::{hash_str, SpoolData, String}; #[derive(Debug, PartialEq)] pub enum SpoolError { TooManyStrings, LongString, } #[derive(Debug, Default)] pub struct Spool { data: SpoolData, } impl Spool { pub fn new() -> Spool { Spool { data: SpoolData::new(), } } pub fn clear(&mut self) { self.data.clear(); } pub fn load(&self, key: u32) -> Option<&String> { self.data.get(&key) } pub fn store(&mut self, string: &str) -> Result<u32, SpoolError> { let key = hash_str(string); if self.data.get(&key).is_none() { let string = String::from_str(&string).map_err(|_| SpoolError::LongString)?; self.data .insert(key, string) .map_err(|_| SpoolError::TooManyStrings)?; } Ok(key) } }