use std::collections::BTreeMap;
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct Session {
values: BTreeMap<String, String>,
}
impl Session {
#[must_use]
pub fn new() -> Self {
Self::default()
}
pub fn set(&mut self, name: &str, value: impl Into<String>) {
self.values.insert(name.to_string(), value.into());
}
#[must_use]
pub fn get(&self, name: &str) -> Option<&str> {
self.values.get(name).map(String::as_str)
}
pub fn iter(&self) -> impl Iterator<Item = (&str, &str)> {
self.values.iter().map(|(name, value)| (name.as_str(), value.as_str()))
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.values.is_empty()
}
}
#[cfg(test)]
mod tests {
use super::Session;
#[test]
fn a_session_hands_back_what_was_put_in_and_says_nothing_about_a_name_it_has_not_got() {
let mut session = Session::new();
assert!(session.is_empty());
session.set("threads", "8");
session.set("memory_limit", "1.0 GiB");
assert_eq!(session.get("threads"), Some("8"));
assert_eq!(session.get("nothing_called_this"), None);
let pairs: Vec<(&str, &str)> = session.iter().collect();
assert_eq!(pairs, [("memory_limit", "1.0 GiB"), ("threads", "8")]);
}
}