aoaddons 0.2.0

Simple library for creating addons for albion online game in multiple programing languages.
Documentation
#![allow(dead_code)]
use std::collections::HashMap;

use super::player::{DynamicId, PlayerName, StaticId};

pub type DynIdToStaticId = HashMap<DynamicId, StaticId>;
pub type StaticIdToName = HashMap<StaticId, PlayerName>;

#[derive(Debug, PartialEq, Default)]
pub struct IdCache {
    dyn_id_to_static_id: DynIdToStaticId,
    static_id_to_name: StaticIdToName,
    last_id: u32,
}

impl IdCache {
    pub fn new() -> Self {
        Self {
            ..Default::default()
        }
    }

    pub fn save(&mut self, dynamic_id: DynamicId, name: &str) {
        let player_name: PlayerName = name.to_owned().into();
        if let Some(static_id) = self.find_static_id(&player_name) {
            if let Some(dyn_id) = self.find_dynamic_id(&static_id) {
                self.dyn_id_to_static_id.remove(&dyn_id);
            }
            self.dyn_id_to_static_id.insert(dynamic_id, static_id);
        } else {
            let static_id: StaticId = self.last_id.into();
            self.last_id += 1;

            self.dyn_id_to_static_id.insert(dynamic_id, static_id);
            self.static_id_to_name.insert(static_id, player_name);
        }
    }

    fn find_static_id(&self, name: &PlayerName) -> Option<StaticId> {
        self.static_id_to_name
            .iter()
            .find(|(_k, v)| v == &name)
            .map(|(k, _v)| *k)
    }

    fn find_dynamic_id(&self, static_id: &StaticId) -> Option<DynamicId> {
        self.dyn_id_to_static_id
            .iter()
            .find(|(_k, v)| v == &static_id)
            .map(|(k, _v)| *k)
    }

    pub fn get_dyn_id_to_static_id_map(&self) -> DynIdToStaticId {
        self.dyn_id_to_static_id.clone()
    }

    pub fn get_static_id_to_name_map(&self) -> StaticIdToName {
        self.static_id_to_name.clone()
    }

    pub fn get_static_id(&self, dynamic_id: DynamicId) -> Option<StaticId> {
        self.dyn_id_to_static_id.get(&dynamic_id).map(|i| *i)
    }

    pub fn get_name(&self, static_id: StaticId) -> Option<PlayerName> {
        self.static_id_to_name.get(&static_id).map(|i| i.clone())
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_id_cache() {
        let mut cache = IdCache::new();

        assert!(cache.get_static_id(DynamicId::from(1)).is_none());

        cache.save(DynamicId::from(1), "test");
        assert!(cache.get_static_id(DynamicId::from(1)).is_some());
        assert_eq!(
            cache.get_static_id(DynamicId::from(1)),
            Some(StaticId::from(0))
        );

        cache.save(DynamicId::from(2), "test");
        assert!(cache.get_static_id(DynamicId::from(1)).is_none());
        assert_eq!(
            cache.get_static_id(DynamicId::from(2)),
            Some(StaticId::from(0))
        );
    }

    #[test]
    fn test_if_id_is_unique_for_a_player() {
        let mut cache = IdCache::new();

        cache.save(DynamicId::from(1), "test");
        assert_eq!(
            cache.get_static_id(DynamicId::from(1)),
            Some(StaticId::from(0))
        );

        cache.save(DynamicId::from(2), "test2");
        assert_eq!(
            cache.get_static_id(DynamicId::from(2)),
            Some(StaticId::from(1))
        );

        cache.save(DynamicId::from(12345), "test3");
        assert_eq!(
            cache.get_static_id(DynamicId::from(12345)),
            Some(StaticId::from(2))
        );
    }

    #[test]
    fn test_finding_player_name() {
        let mut cache = IdCache::new();

        assert!(cache.get_name(StaticId::from(1)).is_none());

        cache.save(DynamicId::from(1), "test");
        assert_eq!(
            cache.get_static_id(DynamicId::from(1)),
            Some(StaticId::from(0))
        );
        assert_eq!(
            cache.get_name(StaticId::from(0)),
            Some(PlayerName::from("test".to_owned()))
        );

        cache.save(DynamicId::from(2), "test2");
        assert_eq!(
            cache.get_static_id(DynamicId::from(2)),
            Some(StaticId::from(1))
        );
        assert_eq!(
            cache.get_name(StaticId::from(1)),
            Some(PlayerName::from("test2".to_owned()))
        );
        assert_eq!(
            cache.get_name(StaticId::from(0)),
            Some(PlayerName::from("test".to_owned()))
        );
    }
}