codama_koroks/
module_korok.rs1use crate::{ItemKorok, KorokTrait};
2use codama_attributes::Attributes;
3use codama_errors::{combine_errors, CodamaError, CodamaResult};
4use codama_nodes::Node;
5use codama_stores::FileModuleStore;
6use codama_syn_helpers::extensions::*;
7
8#[derive(Debug, PartialEq)]
9pub struct ModuleKorok<'a> {
10 pub ast: &'a syn::ItemMod,
11 pub attributes: Attributes<'a>,
12 pub items: Vec<ItemKorok<'a>>,
13 pub node: Option<Node>,
14}
15
16impl<'a> ModuleKorok<'a> {
17 pub fn parse(
18 item: &'a syn::Item,
19 file_modules: &'a [FileModuleStore],
20 file_module_index: &mut usize,
21 ) -> CodamaResult<Self> {
22 let syn::Item::Mod(ast) = item else {
23 return Err(item.error("Expected an module").into());
24 };
25 let Some(content) = &ast.content else {
26 return Err(ast
27 .error("Module has no content, it should be parsed with FileModuleKorok")
28 .into());
29 };
30
31 let (attributes, items) = combine_errors!(
32 Attributes::parse(&ast.attrs, item.into()).map_err(CodamaError::from),
33 ItemKorok::parse_all(&content.1, file_modules, file_module_index),
34 )?;
35 Ok(Self {
36 ast,
37 attributes,
38 items,
39 node: None,
40 })
41 }
42}
43
44impl KorokTrait for ModuleKorok<'_> {
45 fn node(&self) -> &Option<Node> {
46 &self.node
47 }
48
49 fn set_node(&mut self, node: Option<Node>) {
50 self.node = node;
51 }
52
53 fn attributes(&self) -> Option<&Attributes<'_>> {
54 Some(&self.attributes)
55 }
56}