propmaster 0.1.0

Properties and configurations for rust
Documentation
use std::collections::HashMap;

use crate::property::Property;
pub struct PropertyMap {
    stored_num: usize,
    properties: HashMap<String, Property>,
}

impl PropertyMap {
    pub fn new() -> Self {
        PropertyMap {
            stored_num: 0,
            properties: HashMap::new(),
        }
    }

    pub fn stored_num(&self) -> usize {
        self.stored_num
    }

    pub fn get(&self, name: &str) -> Option<&Property> {
        self.properties.get(name)
    }

    pub fn set(&mut self, name: &str, property: Property) -> bool {
        if self.properties.contains_key(name) {
            false
        } else {
            self.stored_num += 1;
            self.properties.insert(name.to_string(), property);
            true
        }
    }

    /**
     * Returns the old property if it existed, and a boolean indicating whether it existed.
     * and was upserted.
     */
    pub fn set_or_upsert(
        &mut self,
        name: &str,
        property: Property,
    ) -> (Option<Property>, bool) {
        if self.properties.contains_key(name) {
            (self.properties.insert(name.to_string(), property), true)
        } else {
            self.stored_num += 1;
            (self.properties.insert(name.to_string(), property), false)
        }
    }

    pub fn remove(&mut self, name: &str) -> bool {
        if self.properties.contains_key(name) {
            self.stored_num -= 1;
            self.properties.remove(name);
            true
        } else {
            false
        }
    }

    pub fn clear(&mut self) {
        self.properties.clear();
        self.stored_num = 0;
    }

    pub fn iter(&self) -> std::collections::hash_map::Iter<String, Property> {
        self.properties.iter()
    }

    pub fn iter_mut(&mut self) -> std::collections::hash_map::IterMut<String, Property> {
        self.properties.iter_mut()
    }
}

impl<'a> Default for PropertyMap {
    fn default() -> Self {
        Self::new()
    }
}

#[cfg(test)]
mod test {
    use crate::property::PropertyValue;

    use super::*;

    #[test]
    fn propmap_insert() {
        let mut propmap = PropertyMap::new();
        let prop = Property::new(PropertyValue::Integer(1));
        assert!(propmap.set("test", Property::new(PropertyValue::Integer(1))));
        assert_eq!(propmap.stored_num(), 1);
        assert!(!propmap.set("test", Property::new(PropertyValue::Integer(1))));
        assert_eq!(propmap.stored_num(), 1);
    }

    #[test]
    fn propmap_upsert() {
        let mut propmap = PropertyMap::new();
        let prop = Property::new(PropertyValue::Integer(1));
        assert!(!propmap.set_or_upsert("test", Property::new(PropertyValue::Integer(1))).1);
        assert_eq!(propmap.stored_num(), 1);
        assert!(propmap.set_or_upsert("test", Property::new(PropertyValue::Integer(1))).1);
        assert_eq!(propmap.stored_num(), 1);
    }

    #[test]
    fn propmap_remove() {
        let mut propmap = PropertyMap::new();
        let prop = Property::new(PropertyValue::Integer(1));
        assert!(propmap.set("test", prop));
        assert_eq!(propmap.stored_num(), 1);
        assert!(propmap.remove("test"));
        assert_eq!(propmap.stored_num(), 0);
        assert!(!propmap.remove("test"));
        assert_eq!(propmap.stored_num(), 0);
    }

    #[test]
    fn propmap_clear() {
        let mut propmap = PropertyMap::new();
        let prop = Property::new(PropertyValue::Integer(1));
        assert!(propmap.set("test", prop));
        assert_eq!(propmap.stored_num(), 1);
        propmap.clear();
        assert_eq!(propmap.stored_num(), 0);
    }
}