codama_koroks/
item_korok.rs

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