gesha_rust_types/
definitions.rs

1use crate::Definition;
2use gesha_collections::seq::TryMapOps;
3use gesha_core::conversions::Result;
4use gesha_core::{broken_defs, conversions};
5
6#[derive(Clone, Debug, PartialEq, Default)]
7pub struct Definitions(Vec<Definition>);
8
9impl Definitions {
10    pub fn new() -> Self {
11        Self(vec![])
12    }
13
14    pub fn is_empty(&self) -> bool {
15        self.0.is_empty()
16    }
17
18    /// Return `gesha_core::conversions::Error::TransformBroken`
19    /// if a definition with the same name has already been pushed.
20    pub fn set<A: Into<Definition>>(&mut self, def: A) -> Result<()> {
21        let def = def.into();
22        let name = def.symbol_name();
23
24        if self.already_pushed(def.symbol_name()) {
25            return Err(broken_defs!(name.to_string()));
26        }
27        self.0.push(def);
28        Ok(())
29    }
30
31    pub fn iter(&self) -> impl Iterator<Item = &Definition> {
32        self.0.iter()
33    }
34
35    pub fn from<A>(xs: Vec<A>) -> Result<Self>
36    where
37        A: TryInto<Definition, Error = conversions::Error>,
38    {
39        xs.try_map(|x| x.try_into()).map(Self)
40    }
41
42    fn already_pushed(&self, name: &str) -> bool {
43        self.0.iter().any(|x| x.symbol_name() == name)
44    }
45}
46
47impl FromIterator<Definition> for Definitions {
48    fn from_iter<T: IntoIterator<Item = Definition>>(iter: T) -> Self {
49        let set = iter.into_iter().collect();
50        Self(set)
51    }
52}
53
54impl IntoIterator for Definitions {
55    type Item = <Vec<Definition> as IntoIterator>::Item;
56    type IntoIter = <Vec<Definition> as IntoIterator>::IntoIter;
57
58    fn into_iter(self) -> Self::IntoIter {
59        IntoIterator::into_iter(self.0)
60    }
61}