codama_korok_visitors/
compose_visitor.rs

1use codama_errors::{CodamaResult, IteratorCombineErrors};
2
3use crate::KorokVisitor;
4
5/// Compose multiple visitors into one.
6#[derive(Default)]
7pub struct ComposeVisitor<'a> {
8    pub visitors: Vec<Box<dyn KorokVisitor + 'a>>,
9}
10
11impl<'a> ComposeVisitor<'a> {
12    pub fn new() -> Self {
13        Self::default()
14    }
15
16    /// Adds a new visitor to the composition.
17    pub fn with<T: KorokVisitor + 'a>(mut self, visitor: T) -> Self {
18        self.visitors.push(Box::new(visitor));
19        self
20    }
21}
22
23impl KorokVisitor for ComposeVisitor<'_> {
24    fn visit_root(&mut self, korok: &mut codama_koroks::RootKorok) -> CodamaResult<()> {
25        self.visitors
26            .iter_mut()
27            .map(|v| v.visit_root(korok))
28            .collect_and_combine_errors()?;
29        Ok(())
30    }
31
32    fn visit_crate(&mut self, korok: &mut codama_koroks::CrateKorok) -> CodamaResult<()> {
33        self.visitors
34            .iter_mut()
35            .map(|v| v.visit_crate(korok))
36            .collect_and_combine_errors()?;
37        Ok(())
38    }
39
40    fn visit_item(&mut self, korok: &mut codama_koroks::ItemKorok) -> CodamaResult<()> {
41        self.visitors
42            .iter_mut()
43            .map(|v| v.visit_item(korok))
44            .collect_and_combine_errors()?;
45        Ok(())
46    }
47
48    fn visit_file_module(
49        &mut self,
50        korok: &mut codama_koroks::FileModuleKorok,
51    ) -> CodamaResult<()> {
52        self.visitors
53            .iter_mut()
54            .map(|v| v.visit_file_module(korok))
55            .collect_and_combine_errors()?;
56        Ok(())
57    }
58
59    fn visit_module(&mut self, korok: &mut codama_koroks::ModuleKorok) -> CodamaResult<()> {
60        self.visitors
61            .iter_mut()
62            .map(|v| v.visit_module(korok))
63            .collect_and_combine_errors()?;
64        Ok(())
65    }
66
67    fn visit_struct(&mut self, korok: &mut codama_koroks::StructKorok) -> CodamaResult<()> {
68        self.visitors
69            .iter_mut()
70            .map(|v| v.visit_struct(korok))
71            .collect_and_combine_errors()?;
72        Ok(())
73    }
74
75    fn visit_enum(&mut self, korok: &mut codama_koroks::EnumKorok) -> CodamaResult<()> {
76        self.visitors
77            .iter_mut()
78            .map(|v| v.visit_enum(korok))
79            .collect_and_combine_errors()?;
80        Ok(())
81    }
82
83    fn visit_enum_variant(
84        &mut self,
85        korok: &mut codama_koroks::EnumVariantKorok,
86    ) -> CodamaResult<()> {
87        self.visitors
88            .iter_mut()
89            .map(|v| v.visit_enum_variant(korok))
90            .collect_and_combine_errors()?;
91        Ok(())
92    }
93
94    fn visit_unsupported_item(
95        &mut self,
96        korok: &mut codama_koroks::UnsupportedItemKorok,
97    ) -> CodamaResult<()> {
98        self.visitors
99            .iter_mut()
100            .map(|v| v.visit_unsupported_item(korok))
101            .collect_and_combine_errors()?;
102        Ok(())
103    }
104
105    fn visit_fields(&mut self, korok: &mut codama_koroks::FieldsKorok) -> CodamaResult<()> {
106        self.visitors
107            .iter_mut()
108            .map(|v| v.visit_fields(korok))
109            .collect_and_combine_errors()?;
110        Ok(())
111    }
112
113    fn visit_field(&mut self, korok: &mut codama_koroks::FieldKorok) -> CodamaResult<()> {
114        self.visitors
115            .iter_mut()
116            .map(|v| v.visit_field(korok))
117            .collect_and_combine_errors()?;
118        Ok(())
119    }
120}