use core::slice::Iter;
use std::fmt;
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct MultiElement {
pub key: String,
pub value: String,
}
impl fmt::Display for MultiElement {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, r#"MultiElement < "{}":"{}" >"#, self.key, self.value)
}
}
impl MultiElement {
pub fn new(new_element: [String; 2]) -> Self {
MultiElement {
key: new_element[0].clone(),
value: new_element[1].clone(),
}
}
}
#[derive(Default, Debug, Clone)]
pub struct MultiDict {
pub elements: Vec<MultiElement>,
}
impl fmt::Display for MultiDict {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"MultiDict < {} >",
self.elements
.iter()
.map(|item| format!(r#""{}":"{}""#, item.key, item.value))
.collect::<Vec<_>>()
.join(", ")
)
}
}
impl MultiDict {
pub fn new() -> Self {
MultiDict {
elements: Vec::new(),
}
}
pub fn new_capacity(capacity: &usize) -> Self {
MultiDict {
elements: Vec::with_capacity(*capacity),
}
}
pub fn len(&self) -> usize {
self.elements.len()
}
pub fn iter(&self) -> Iter<MultiElement> {
self.elements.iter()
}
pub fn is_empty(&self) -> bool {
self.elements.is_empty()
}
pub fn add(&mut self, new_item: MultiElement) {
self.elements.push(new_item);
}
pub fn get(&self, key: &str) -> Result<&MultiElement, &str> {
for item in &self.elements {
if item.key.eq(key) {
return Ok(item);
}
}
Err("No matching key found")
}
pub fn popone(&mut self, key: &str) -> Result<MultiElement, &str> {
for (idx, item) in self.elements.iter().enumerate() {
if item.key.eq(key) {
return Ok(self.elements.remove(idx));
}
}
Err("No matching key found")
}
pub fn getall(&self, key: &str) -> Result<MultiDict, &str> {
let mut results = MultiDict::new();
for item in &self.elements {
if item.key.eq(key) {
results.add(item.clone());
}
}
if !results.is_empty() {
Ok(results)
} else {
Err("No matching key found")
}
}
pub fn contains(&self, key: &str) -> bool {
for item in &self.elements {
if item.key.eq(key) {
return true;
}
}
false
}
pub fn keys(&self) -> Vec<&String> {
let mut results: Vec<&String> = Vec::with_capacity(self.elements.len());
for item in &self.elements {
results.push(&item.key);
}
results
}
pub fn values(&self) -> Vec<&String> {
let mut results: Vec<&String> = Vec::with_capacity(self.elements.len());
for item in &self.elements {
results.push(&item.value);
}
results
}
pub fn update(&mut self, new_item: MultiElement) {
let new_item_key = &new_item.key;
let mut ids_for_replace = Vec::new();
for (idx, item) in self.elements.iter().enumerate() {
if item.key.eq(new_item_key) {
ids_for_replace.push(idx);
}
}
for idx in ids_for_replace {
self.elements.remove(idx);
self.elements.insert(idx, new_item.clone());
}
}
}