microcad_lang/value/
parameter_value_list.rs1use crate::value::*;
7use compact_str::CompactStringExt;
8use derive_more::Deref;
9
10#[derive(Clone, Default, Deref)]
12pub struct ParameterValueList(std::collections::HashMap<Identifier, ParameterValue>);
13
14impl ParameterValueList {
15 pub fn insert(
17 &mut self,
18 id: Identifier,
19 parameter: ParameterValue,
20 ) -> std::result::Result<(), ValueError> {
21 assert!(!id.is_empty(), "expecting valid id");
22 if self.0.contains_key(&id) {
23 return Err(ValueError::DuplicateParameter(id.clone()));
24 }
25 self.0.insert(id, parameter);
26 Ok(())
27 }
28}
29
30impl std::fmt::Display for ParameterValueList {
31 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
32 write!(f, "{}", {
33 let mut v = self
34 .0
35 .iter()
36 .map(|(id, p)| format!("{id}: {p}"))
37 .collect::<Vec<_>>();
38 v.sort();
39 v.join_compact(", ")
40 })
41 }
42}
43
44impl std::fmt::Debug for ParameterValueList {
45 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
46 write!(f, "{}", {
47 let mut v = self
48 .0
49 .iter()
50 .map(|(id, p)| format!("{id:?}: {p:?}"))
51 .collect::<Vec<_>>();
52 v.sort();
53 v.join_compact(", ")
54 })
55 }
56}
57
58impl<I, P> FromIterator<(I, P)> for ParameterValueList
59where
60 I: Into<Identifier>,
61 P: Into<ParameterValue>,
62{
63 fn from_iter<T: IntoIterator<Item = (I, P)>>(iter: T) -> Self {
64 Self(
65 iter.into_iter()
66 .map(|(i, p)| (i.into(), p.into()))
67 .collect(),
68 )
69 }
70}