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
use crate::external::{Error, Vcs}; use glob::Pattern; use std::{collections::BTreeMap, string::String}; pub struct InMemory<'a> { store: &'a mut BTreeMap<String, String>, } impl InMemory<'_> { #[must_use] pub fn new(store: &mut BTreeMap<String, String>) -> InMemory { InMemory { store } } } impl Vcs for InMemory<'_> { fn entries(&self, glob: Option<&str>) -> Result<Vec<String>, Error> { let mut keys: Vec<String> = self.store.keys().map(String::from).collect(); if let Some(pattern) = glob { let compiled_glob = glob::Pattern::new(pattern)?; keys = keys .into_iter() .filter(|value| Pattern::matches(&compiled_glob, value)) .collect() } Ok(keys) } fn get_bool(&self, name: &str) -> Result<Option<bool>, Error> { match self.store.get(name) { None => Ok(None), Some(raw_value) => Ok(Some(raw_value.parse().map_err(Error::from)?)), } } fn get_str(&self, name: &str) -> Result<Option<&str>, Error> { Ok(self.store.get(name).map(String::as_str)) } fn get_i64(&self, name: &str) -> Result<Option<i64>, Error> { match self.store.get(name) { None => Ok(None), Some(raw_value) => Ok(Some(raw_value.parse().map_err(Error::from)?)), } } fn set_str(&mut self, name: &str, value: &str) -> Result<(), Error> { self.store.insert(name.into(), value.into()); Ok(()) } fn set_i64(&mut self, name: &str, value: i64) -> Result<(), Error> { self.store.insert(name.into(), format!("{}", value)); Ok(()) } fn remove(&mut self, name: &str) -> Result<(), Error> { self.store.remove(name); Ok(()) } }