gesha_rust_types/
definitions.rs1use 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 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}