#[derive(Debug, Clone)]
pub struct Options {
pub scale: u32,
pub bar_height: u32,
pub quiet_zone: u32,
pub include_text: bool,
pub foreground: [u8; 3],
pub background: [u8; 3],
pub extras: Vec<(String, String)>,
}
impl Default for Options {
fn default() -> Self {
Self {
scale: 4,
bar_height: 50,
quiet_zone: 4,
include_text: false,
foreground: [0, 0, 0],
background: [255, 255, 255],
extras: Vec::new(),
}
}
}
impl Options {
pub fn get(&self, key: &str) -> Option<&str> {
self.extras
.iter()
.find(|(k, _)| k == key)
.map(|(_, v)| v.as_str())
}
#[must_use]
pub fn with(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
self.extras.push((key.into(), value.into()));
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_field_values() {
let opts = Options::default();
assert_eq!(opts.scale, 4);
assert_eq!(opts.bar_height, 50);
assert_eq!(opts.quiet_zone, 4);
assert!(!opts.include_text);
assert_eq!(opts.foreground, [0, 0, 0]);
assert_eq!(opts.background, [255, 255, 255]);
assert!(opts.extras.is_empty());
}
#[test]
fn get_lookup_semantics() {
let opts = Options::default().with("eclevel", "H").with("version", "5");
assert_eq!(opts.get("eclevel"), Some("H"));
assert_eq!(opts.get("version"), Some("5"));
assert_eq!(opts.get("missing"), None);
assert_eq!(opts.get("ECLEVEL"), None);
assert_eq!(opts.get("Eclevel"), None);
assert_eq!(opts.get(""), None);
}
#[test]
fn with_builder_appends_and_returns() {
let opts = Options::default().with("a", "1").with("b", "2");
assert_eq!(opts.extras.len(), 2);
assert_eq!(opts.extras[0], ("a".to_string(), "1".to_string()));
assert_eq!(opts.extras[1], ("b".to_string(), "2".to_string()));
let opts = Options::default().with("k", "first").with("k", "second");
assert_eq!(opts.extras.len(), 2);
assert_eq!(opts.get("k"), Some("first"));
}
}