microcad_lang/syntax/identifier/
identifier_list.rs1use crate::syntax::*;
5use derive_more::{Deref, DerefMut};
6use microcad_lang_base::{Refer, SrcRef, SrcReferrer};
7
8#[derive(Default, Clone, PartialEq, Deref, DerefMut)]
13pub struct IdentifierList(pub Refer<Vec<Identifier>>);
14
15impl IdentifierList {
16 pub fn new(identifiers: Vec<Identifier>, src_ref: SrcRef) -> Self {
18 Self(Refer::new(identifiers, src_ref))
19 }
20}
21
22impl SrcReferrer for IdentifierList {
23 fn src_ref(&self) -> SrcRef {
24 self.0.src_ref()
25 }
26}
27
28impl FromIterator<Identifier> for IdentifierList {
29 fn from_iter<T: IntoIterator<Item = Identifier>>(iter: T) -> Self {
30 let v: Vec<_> = iter.into_iter().collect();
31 let src_ref = SrcRef::merge_all(v.iter());
32 Self(Refer::new(v, src_ref))
33 }
34}
35
36impl std::fmt::Display for IdentifierList {
37 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
38 let mut sorted = self.0.clone();
39 sorted.sort();
40 write!(
41 f,
42 "{}",
43 sorted
44 .iter()
45 .map(|id| id.to_string())
46 .collect::<Vec<_>>()
47 .join(",")
48 )
49 }
50}
51
52impl std::fmt::Debug for IdentifierList {
53 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
54 let mut sorted = self.0.clone();
55 sorted.sort();
56 write!(
57 f,
58 "{}",
59 sorted
60 .iter()
61 .map(|id| format!("{id:?}"))
62 .collect::<Vec<_>>()
63 .join(",")
64 )
65 }
66}
67
68impl std::iter::IntoIterator for IdentifierList {
69 type Item = Identifier;
70 type IntoIter = std::vec::IntoIter<Self::Item>;
71
72 fn into_iter(self) -> Self::IntoIter {
73 self.0.into_iter()
74 }
75}