microcad_lang/value/
parameter_value_list.rs

1// Copyright © 2024-2025 The µcad authors <info@ucad.xyz>
2// SPDX-License-Identifier: AGPL-3.0-or-later
3
4//! Parameter value list evaluation entity
5
6use crate::value::*;
7use compact_str::CompactStringExt;
8use derive_more::Deref;
9
10/// List of parameter values
11#[derive(Clone, Default, Deref)]
12pub struct ParameterValueList(std::collections::HashMap<Identifier, ParameterValue>);
13
14impl ParameterValueList {
15    /// Push parameter value
16    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}