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