codama_korok_plugins/
default_plugin.rs

1use crate::KorokPlugin;
2use codama_errors::CodamaResult;
3use codama_korok_visitors::{
4    ApplyCodamaTypeAttributesVisitor, CombineModulesVisitor, ComposeVisitor, FilterItemsVisitor,
5    KorokVisitable, SetAccountsVisitor, SetBorshTypesVisitor, SetDefinedTypesVisitor,
6    SetErrorsVisitor, SetInstructionsVisitor, SetLinkTypesVisitor, SetProgramMetadataVisitor,
7};
8use codama_koroks::KorokTrait;
9
10pub struct DefaultPlugin;
11impl KorokPlugin for DefaultPlugin {
12    fn run(
13        &self,
14        visitable: &mut dyn KorokVisitable,
15        next: &dyn Fn(&mut dyn KorokVisitable) -> CodamaResult<()>,
16    ) -> CodamaResult<()> {
17        next(visitable)?;
18        visitable.accept(&mut get_default_visitor())?;
19        Ok(())
20    }
21}
22
23pub fn get_default_visitor<'a>() -> ComposeVisitor<'a> {
24    ComposeVisitor::new()
25        .with(FilterItemsVisitor::new(
26            |item| item.attributes().unwrap().has_any_codama_derive(),
27            ComposeVisitor::new()
28                .with(SetBorshTypesVisitor::new())
29                .with(SetLinkTypesVisitor::new()),
30        ))
31        .with(SetProgramMetadataVisitor::new())
32        .with(ApplyCodamaTypeAttributesVisitor::new())
33        .with(SetDefinedTypesVisitor::new())
34        .with(SetAccountsVisitor::new())
35        .with(SetInstructionsVisitor::new())
36        .with(SetErrorsVisitor::new())
37        .with(CombineModulesVisitor::new())
38}