1use std::fs;
2use std::io::prelude::*;
3use std::path::PathBuf;
4
5pub struct Shelf {
6 dir: String
7}
8
9impl Shelf {
10 pub fn new(path: &str) -> Shelf {
11 fs::DirBuilder::new()
12 .recursive(true)
13 .create(path)
14 .unwrap();
15
16 Shelf {
17 dir: path.to_string()
18 }
19 }
20
21 pub fn set(&self, key: &str, value: &str) -> () {
22 let mut path = PathBuf::from(&self.dir);
23 path.push(key);
24
25 let mut entry = fs::File::create(path).unwrap();
26 entry.write(value.as_bytes()).unwrap();
27 }
28
29 pub fn get(&self, key: &str) -> Option<String> {
30 let mut value = String::new();
31 let mut path = PathBuf::from(&self.dir);
32 path.push(key);
33
34 match fs::File::open(path) {
35 Err(_) => None,
36 Ok(mut entry) => {
37 entry.read_to_string(&mut value).unwrap();
38 Some(value)
39 }
40 }
41 }
42
43 pub fn delete(&self, key: &str) -> () {
44 let mut path = PathBuf::from(&self.dir);
45 path.push(key);
46
47 match fs::remove_file(path) {
48 Err(why) => println!("{}", why),
49 Ok(_) => ()
50 }
51 }
52
53 pub fn keys(&self) -> Vec<String> {
54 let mut keys = Vec::new();
55
56 for entry in fs::read_dir(&self.dir).unwrap() {
57 let key = entry.unwrap().file_name().into_string().unwrap();
58 keys.push(key);
59 }
60 keys
61 }
62
63 pub fn values(&self) -> Vec<String> {
64 let mut values = Vec::new();
65
66 for entry in fs::read_dir(&self.dir).unwrap() {
67 match self.get(&entry.unwrap().file_name().into_string().unwrap()) {
68 Some(value) => values.push(value),
69 None => ()
70 }
71 }
72 values
73 }
74}
75
76#[cfg(test)]
77mod test {
78 use super::*;
79
80 #[test]
81 fn basic() {
82 let shelf = Shelf::new("/tmp/nested/folders");
83 shelf.set("test", "Some data");
84 shelf.set("other", "Some more");
85
86 assert_eq!("Some data", shelf.get("test").unwrap());
87 assert_eq!("Some more", shelf.get("other").unwrap());
88 assert_eq!(2, shelf.keys().len());
89 assert_eq!(2, shelf.values().len());
90
91 shelf.delete("other");
92
93 assert_eq!("Some data", shelf.get("test").unwrap());
94 assert_eq!(None, shelf.get("other"));
95 assert_eq!(1, shelf.keys().len());
96 assert_eq!(1, shelf.values().len());
97 }
98}