rustgym 0.2.0

rustgym solutions
Documentation
use std::collections::BTreeMap;
use std::collections::HashMap;

#[derive(Default)]
struct LogSystem {
    min: String,
    max: String,
    map: HashMap<String, usize>,
    logs: BTreeMap<String, i32>,
}

impl LogSystem {
    fn new() -> Self {
        let min = "2000:01:01:00:00:00".to_string();
        let max = "2017:12:31:23:59:59".to_string();
        let map: HashMap<String, usize> = [
            ("Year", 4),
            ("Month", 7),
            ("Day", 10),
            ("Hour", 13),
            ("Minute", 16),
            ("Second", 19),
        ]
        .iter()
        .map(|(s, i)| ((*s).to_string(), *i))
        .collect();
        let logs: BTreeMap<String, i32> = BTreeMap::new();
        LogSystem {
            min,
            max,
            map,
            logs,
        }
    }

    fn put(&mut self, id: i32, timestamp: String) {
        *self.logs.entry(timestamp).or_default() = id;
    }

    fn retrieve(&self, s: String, e: String, gra: String) -> Vec<i32> {
        let i = self.map[&gra];
        let s = "".to_string() + &s[0..i] + &self.min[i..];
        let e = "".to_string() + &e[0..i] + &self.max[i..];
        self.logs.range(s..=e).map(|(_, &i)| i).collect()
    }
}

#[test]
fn test() {
    let mut obj = LogSystem::new();
    obj.put(1, "2017:01:01:23:59:59".to_string());
    obj.put(2, "2017:01:01:22:59:59".to_string());
    obj.put(3, "2016:01:01:00:00:00".to_string());
    let s = "2016:01:01:01:01:01".to_string();
    let e = "2017:01:01:23:00:00".to_string();
    let gra = "Year".to_string();
    let ans = vec![1, 2, 3];
    let mut res = obj.retrieve(s, e, gra);
    res.sort_unstable();
    assert_eq!(ans, res);
    let s = "2016:01:01:01:01:01".to_string();
    let e = "2017:01:01:23:00:00".to_string();
    let gra = "Hour".to_string();
    let ans = vec![1, 2];
    let mut res = obj.retrieve(s, e, gra);
    res.sort_unstable();
    assert_eq!(ans, res);
}