1use codama_attributes::Attributes;
2use codama_nodes::Node;
3use derive_more::derive::From;
4use std::fmt::Debug;
5
6pub trait KorokTrait: Debug {
7 fn node(&self) -> &Option<Node>;
8 fn set_node(&mut self, node: Option<Node>);
9 fn attributes(&self) -> Option<&Attributes> {
10 None
11 }
12}
13
14#[derive(From, Debug, PartialEq)]
15pub enum Korok<'a, 'b> {
16 Crate(&'b crate::CrateKorok<'a>),
17 Enum(&'b crate::EnumKorok<'a>),
18 EnumVariant(&'b crate::EnumVariantKorok<'a>),
19 Field(&'b crate::FieldKorok<'a>),
20 Fields(&'b crate::FieldsKorok<'a>),
21 FileModule(&'b crate::FileModuleKorok<'a>),
22 Item(&'b crate::ItemKorok<'a>),
23 Module(&'b crate::ModuleKorok<'a>),
24 Root(&'b crate::RootKorok<'a>),
25 Struct(&'b crate::StructKorok<'a>),
26 UnsupportedItem(&'b crate::UnsupportedItemKorok<'a>),
27}
28
29#[derive(From, Debug, PartialEq)]
30pub enum KorokMut<'a, 'b> {
31 Crate(&'b mut crate::CrateKorok<'a>),
32 Enum(&'b mut crate::EnumKorok<'a>),
33 EnumVariant(&'b mut crate::EnumVariantKorok<'a>),
34 Field(&'b mut crate::FieldKorok<'a>),
35 Fields(&'b mut crate::FieldsKorok<'a>),
36 FileModule(&'b mut crate::FileModuleKorok<'a>),
37 Item(&'b mut crate::ItemKorok<'a>),
38 Module(&'b mut crate::ModuleKorok<'a>),
39 Root(&'b mut crate::RootKorok<'a>),
40 Struct(&'b mut crate::StructKorok<'a>),
41 UnsupportedItem(&'b mut crate::UnsupportedItemKorok<'a>),
42}
43
44impl KorokTrait for KorokMut<'_, '_> {
45 fn node(&self) -> &Option<Node> {
46 match self {
47 Self::Crate(k) => k.node(),
48 Self::Enum(k) => k.node(),
49 Self::EnumVariant(k) => k.node(),
50 Self::Field(k) => k.node(),
51 Self::Fields(k) => k.node(),
52 Self::FileModule(k) => k.node(),
53 Self::Item(k) => k.node(),
54 Self::Module(k) => k.node(),
55 Self::Root(k) => k.node(),
56 Self::Struct(k) => k.node(),
57 Self::UnsupportedItem(k) => k.node(),
58 }
59 }
60
61 fn set_node(&mut self, node: Option<Node>) {
62 match self {
63 Self::Crate(k) => k.set_node(node),
64 Self::Enum(k) => k.set_node(node),
65 Self::EnumVariant(k) => k.set_node(node),
66 Self::Field(k) => k.set_node(node),
67 Self::Fields(k) => k.set_node(node),
68 Self::FileModule(k) => k.set_node(node),
69 Self::Item(k) => k.set_node(node),
70 Self::Module(k) => k.set_node(node),
71 Self::Root(k) => k.set_node(node),
72 Self::Struct(k) => k.set_node(node),
73 Self::UnsupportedItem(k) => k.set_node(node),
74 }
75 }
76
77 fn attributes(&self) -> Option<&Attributes> {
78 match self {
79 Self::Crate(k) => k.attributes(),
80 Self::Enum(k) => k.attributes(),
81 Self::EnumVariant(k) => k.attributes(),
82 Self::Field(k) => k.attributes(),
83 Self::Fields(k) => k.attributes(),
84 Self::FileModule(k) => k.attributes(),
85 Self::Item(k) => k.attributes(),
86 Self::Module(k) => k.attributes(),
87 Self::Root(k) => k.attributes(),
88 Self::Struct(k) => k.attributes(),
89 Self::UnsupportedItem(k) => k.attributes(),
90 }
91 }
92}