shelf/
shelf.rs

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}