1use serde::{Deserialize, Serialize};
17use std;
18
19#[derive(Clone, Default, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Serialize, Deserialize)]
21pub struct ArgminKV {
22 #[serde(borrow)]
24 pub kv: Vec<(&'static str, String)>,
25}
26
27impl std::fmt::Display for ArgminKV {
28 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
29 writeln!(f, "ArgminKV")?;
30 self.kv
31 .iter()
32 .map(|(key, val)| -> std::fmt::Result { writeln!(f, " {}: {}", key, val) })
33 .count();
34 Ok(())
35 }
36}
37
38impl ArgminKV {
39 pub fn new() -> Self {
41 ArgminKV { kv: vec![] }
42 }
43
44 pub fn push<T: std::fmt::Display>(&mut self, key: &'static str, val: T) -> &mut Self {
48 self.kv.push((key, format!("{}", val)));
49 self
50 }
51
52 pub fn merge(mut self, other: &mut ArgminKV) -> Self {
54 self.kv.append(&mut other.kv);
55 self
56 }
57}
58
59impl std::iter::FromIterator<(&'static str, String)> for ArgminKV {
60 fn from_iter<I: IntoIterator<Item = (&'static str, String)>>(iter: I) -> Self {
61 let mut c = ArgminKV::new();
62
63 for i in iter {
64 c.push(i.0, i.1);
65 }
66
67 c
68 }
69}
70
71impl std::iter::Extend<(&'static str, String)> for ArgminKV {
72 fn extend<I: IntoIterator<Item = (&'static str, String)>>(&mut self, iter: I) {
73 for i in iter {
74 self.push(i.0, i.1);
75 }
76 }
77}
78
79#[cfg(test)]
80mod tests {
81 use super::*;
82
83 send_sync_test!(argmin_kv, ArgminKV);
84}