promkit 0.9.1

A toolkit for building your own interactive command-line tools
Documentation
use std::collections::HashMap;

#[derive(Clone)]
pub struct ActiveKeySwitcher<S> {
    mapping: HashMap<String, S>,
    active_key: String,
}

impl<S> ActiveKeySwitcher<S> {
    pub fn new<K: AsRef<str>>(key: K, handler: S) -> Self {
        let key = key.as_ref().to_string();
        Self {
            mapping: HashMap::new(),
            active_key: key.clone(),
        }
        .register(key, handler)
    }

    pub fn register<K: AsRef<str>>(mut self, key: K, handler: S) -> Self {
        self.mapping.insert(key.as_ref().to_string(), handler);
        self
    }

    pub fn switch<K: AsRef<str>>(&mut self, key: K) {
        let key = key.as_ref().to_string();
        if self.mapping.contains_key(&key) {
            self.active_key = key;
        }
    }

    pub fn active_key(&self) -> &str {
        &self.active_key
    }

    pub fn get(&self) -> &S {
        self.mapping.get(&self.active_key).unwrap()
    }
}