codama_koroks/
item_korok.rs1use 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}