use std::collections::BTreeMap;
pub mod format;
pub use format::{DataFormat, format_data_value};
#[derive(Debug, Clone, Default)]
pub struct DataContext {
pub fields: BTreeMap<String, String>,
pub arrays: BTreeMap<String, Vec<String>>,
}
impl DataContext {
pub fn get(&self, path: &str) -> Option<&str> {
self.fields.get(path).map(String::as_str)
}
pub fn get_array(&self, key: &str) -> Option<&[String]> {
self.arrays.get(key).map(Vec::as_slice)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn get_array_returns_slice_for_present_key() {
let mut ctx = DataContext::default();
ctx.arrays.insert(
"sales".to_owned(),
vec!["12".to_owned(), "18".to_owned(), "15".to_owned()],
);
let got: Vec<&str> = ctx
.get_array("sales")
.unwrap()
.iter()
.map(String::as_str)
.collect();
assert_eq!(got, ["12", "18", "15"]);
}
#[test]
fn get_array_returns_none_for_missing_key() {
let ctx = DataContext::default();
assert!(ctx.get_array("missing").is_none());
}
#[test]
fn get_scalar_unaffected_by_arrays() {
let mut ctx = DataContext::default();
ctx.fields.insert("x".to_owned(), "hello".to_owned());
ctx.arrays
.insert("x".to_owned(), vec!["a".to_owned(), "b".to_owned()]);
assert_eq!(ctx.get("x"), Some("hello"));
let got: Vec<&str> = ctx
.get_array("x")
.unwrap()
.iter()
.map(String::as_str)
.collect();
assert_eq!(got, ["a", "b"]);
}
#[test]
fn default_has_empty_arrays() {
let ctx = DataContext::default();
assert!(ctx.arrays.is_empty());
}
}