use rudb_common::Value;
#[derive(Debug, Clone, Default, PartialEq)]
pub struct Parameters {
values: Vec<(String, Value)>,
}
impl Parameters {
#[must_use]
pub const fn new() -> Self {
Self { values: Vec::new() }
}
#[must_use]
pub fn positional(values: Vec<Value>) -> Self {
let values = values
.into_iter()
.enumerate()
.map(|(at, value)| ((at + 1).to_string(), value))
.collect();
Self { values }
}
pub fn set(&mut self, name: impl Into<String>, value: Value) {
let name = name.into();
match self.values.iter_mut().find(|(held, _)| same(held, &name)) {
Some(slot) => slot.1 = value,
None => self.values.push((name, value)),
}
}
#[must_use]
pub fn get(&self, name: &str) -> Option<&Value> {
self.values.iter().find(|(held, _)| same(held, name)).map(|(_, value)| value)
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.values.is_empty()
}
#[must_use]
pub fn len(&self) -> usize {
self.values.len()
}
pub fn names(&self) -> impl Iterator<Item = &str> {
self.values.iter().map(|(name, _)| name.as_str())
}
}
fn same(left: &str, right: &str) -> bool {
left.eq_ignore_ascii_case(right)
}