codama_koroks/
item_korok.rs

1use crate::{
2    ConstKorok, EnumKorok, FileModuleKorok, ImplKorok, KorokTrait, ModuleKorok, StructKorok,
3    UnsupportedItemKorok,
4};
5use codama_attributes::Attributes;
6use codama_errors::{CodamaResult, IteratorCombineErrors};
7use codama_nodes::Node;
8use codama_stores::FileModuleStore;
9use std::ops::AddAssign;
10
11#[allow(clippy::large_enum_variant)]
12#[derive(Debug, PartialEq)]
13pub enum ItemKorok<'a> {
14    FileModule(FileModuleKorok<'a>),
15    Module(ModuleKorok<'a>),
16    Struct(StructKorok<'a>),
17    Enum(EnumKorok<'a>),
18    Impl(ImplKorok<'a>),
19    Const(ConstKorok<'a>),
20    Unsupported(UnsupportedItemKorok<'a>),
21}
22
23impl<'a> ItemKorok<'a> {
24    pub fn parse(
25        item: &'a syn::Item,
26        file_modules: &'a [FileModuleStore],
27        file_module_index: &mut usize,
28    ) -> CodamaResult<Self> {
29        match item {
30            syn::Item::Mod(ast) if ast.content.is_none() => {
31                match file_modules.get(*file_module_index) {
32                    Some(module) => {
33                        file_module_index.add_assign(1);
34                        Ok(ItemKorok::FileModule(FileModuleKorok::parse(item, module)?))
35                    }
36                    None => {
37                        Err(syn::Error::new_spanned(ast, "Associated ModuleStore not found").into())
38                    }
39                }
40            }
41            syn::Item::Mod(ast) if ast.content.is_some() => Ok(ItemKorok::Module(
42                ModuleKorok::parse(item, file_modules, file_module_index)?,
43            )),
44            syn::Item::Struct(_) => Ok(ItemKorok::Struct(StructKorok::parse(item)?)),
45            syn::Item::Enum(_) => Ok(ItemKorok::Enum(EnumKorok::parse(item)?)),
46            syn::Item::Impl(_) => Ok(ItemKorok::Impl(ImplKorok::parse(item)?)),
47            syn::Item::Const(_) => Ok(ItemKorok::Const(ConstKorok::parse(item)?)),
48            _ => Ok(ItemKorok::Unsupported(UnsupportedItemKorok::parse(item)?)),
49        }
50    }
51
52    pub fn parse_all(
53        items: &'a [syn::Item],
54        file_modules: &'a [FileModuleStore],
55        file_module_index: &mut usize,
56    ) -> CodamaResult<Vec<Self>> {
57        items
58            .iter()
59            .map(|item| Self::parse(item, file_modules, file_module_index))
60            .collect_and_combine_errors()
61    }
62}
63
64impl KorokTrait for ItemKorok<'_> {
65    fn node(&self) -> &Option<Node> {
66        match self {
67            ItemKorok::Struct(k) => k.node(),
68            ItemKorok::Enum(k) => k.node(),
69            ItemKorok::FileModule(k) => k.node(),
70            ItemKorok::Module(k) => k.node(),
71            ItemKorok::Impl(k) => k.node(),
72            ItemKorok::Const(k) => k.node(),
73            ItemKorok::Unsupported(k) => k.node(),
74        }
75    }
76
77    fn set_node(&mut self, node: Option<Node>) {
78        match self {
79            ItemKorok::Struct(k) => k.set_node(node),
80            ItemKorok::Enum(k) => k.set_node(node),
81            ItemKorok::FileModule(k) => k.set_node(node),
82            ItemKorok::Module(k) => k.set_node(node),
83            ItemKorok::Impl(k) => k.set_node(node),
84            ItemKorok::Const(k) => k.set_node(node),
85            ItemKorok::Unsupported(k) => k.set_node(node),
86        }
87    }
88
89    fn attributes(&self) -> Option<&Attributes<'_>> {
90        match self {
91            ItemKorok::Struct(k) => k.attributes(),
92            ItemKorok::Enum(k) => k.attributes(),
93            ItemKorok::FileModule(k) => k.attributes(),
94            ItemKorok::Module(k) => k.attributes(),
95            ItemKorok::Impl(k) => k.attributes(),
96            ItemKorok::Const(k) => k.attributes(),
97            ItemKorok::Unsupported(k) => k.attributes(),
98        }
99    }
100}