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
use std::fs; use std::io::prelude::*; use std::path::PathBuf; pub struct Shelf { dir: String } impl Shelf { pub fn new(path: &str) -> Shelf { fs::DirBuilder::new() .recursive(true) .create(path) .unwrap(); Shelf { dir: path.to_string() } } pub fn set(&self, key: &str, value: &str) -> () { let mut path = PathBuf::from(&self.dir); path.push(key); let mut entry = fs::File::create(path).unwrap(); entry.write(value.as_bytes()).unwrap(); } pub fn get(&self, key: &str) -> Option<String> { let mut value = String::new(); let mut path = PathBuf::from(&self.dir); path.push(key); match fs::File::open(path) { Err(_) => None, Ok(mut entry) => { entry.read_to_string(&mut value).unwrap(); Some(value) } } } pub fn delete(&self, key: &str) -> () { let mut path = PathBuf::from(&self.dir); path.push(key); match fs::remove_file(path) { Err(why) => println!("{}", why), Ok(_) => () } } pub fn keys(&self) -> Vec<String> { let mut keys = Vec::new(); for entry in fs::read_dir(&self.dir).unwrap() { let key = entry.unwrap().file_name().into_string().unwrap(); keys.push(key); } keys } pub fn values(&self) -> Vec<String> { let mut values = Vec::new(); for entry in fs::read_dir(&self.dir).unwrap() { match self.get(&entry.unwrap().file_name().into_string().unwrap()) { Some(value) => values.push(value), None => () } } values } } #[cfg(test)] mod test { use super::*; #[test] fn basic() { let shelf = Shelf::new("/tmp/nested/folders"); shelf.set("test", "Some data"); shelf.set("other", "Some more"); assert_eq!("Some data", shelf.get("test").unwrap()); assert_eq!("Some more", shelf.get("other").unwrap()); assert_eq!(2, shelf.keys().len()); assert_eq!(2, shelf.values().len()); shelf.delete("other"); assert_eq!("Some data", shelf.get("test").unwrap()); assert_eq!(None, shelf.get("other")); assert_eq!(1, shelf.keys().len()); assert_eq!(1, shelf.values().len()); } }