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