microcad_lang/value/
parameter_value_list.rs1use crate::value::*;
7use compact_str::CompactStringExt;
8use derive_more::Deref;
9
10#[derive(Clone, Debug, 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<I, P> FromIterator<(I, P)> for ParameterValueList
45where
46 I: Into<Identifier>,
47 P: Into<ParameterValue>,
48{
49 fn from_iter<T: IntoIterator<Item = (I, P)>>(iter: T) -> Self {
50 Self(
51 iter.into_iter()
52 .map(|(i, p)| (i.into(), p.into()))
53 .collect(),
54 )
55 }
56}