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 Const(&'b mut crate::ConstKorok<'a>),
42 UnsupportedItem(&'b mut crate::UnsupportedItemKorok<'a>),
43 ImplItem(&'b mut crate::ImplItemKorok<'a>),
44 UnsupportedImplItem(&'b mut crate::UnsupportedImplItemKorok<'a>),
45}
46
47impl KorokTrait for KorokMut<'_, '_> {
48 fn node(&self) -> &Option<Node> {
49 match self {
50 Self::Crate(k) => k.node(),
51 Self::Enum(k) => k.node(),
52 Self::EnumVariant(k) => k.node(),
53 Self::Field(k) => k.node(),
54 Self::Fields(k) => k.node(),
55 Self::FileModule(k) => k.node(),
56 Self::Item(k) => k.node(),
57 Self::Module(k) => k.node(),
58 Self::Root(k) => k.node(),
59 Self::Struct(k) => k.node(),
60 Self::Const(k) => k.node(),
61 Self::UnsupportedItem(k) => k.node(),
62 Self::ImplItem(k) => k.node(),
63 Self::UnsupportedImplItem(k) => k.node(),
64 }
65 }
66
67 fn set_node(&mut self, node: Option<Node>) {
68 match self {
69 Self::Crate(k) => k.set_node(node),
70 Self::Enum(k) => k.set_node(node),
71 Self::EnumVariant(k) => k.set_node(node),
72 Self::Field(k) => k.set_node(node),
73 Self::Fields(k) => k.set_node(node),
74 Self::FileModule(k) => k.set_node(node),
75 Self::Item(k) => k.set_node(node),
76 Self::Module(k) => k.set_node(node),
77 Self::Root(k) => k.set_node(node),
78 Self::Struct(k) => k.set_node(node),
79 Self::Const(k) => k.set_node(node),
80 Self::UnsupportedItem(k) => k.set_node(node),
81 Self::ImplItem(k) => k.set_node(node),
82 Self::UnsupportedImplItem(k) => k.set_node(node),
83 }
84 }
85
86 fn attributes(&self) -> Option<&Attributes> {
87 match self {
88 Self::Crate(k) => k.attributes(),
89 Self::Enum(k) => k.attributes(),
90 Self::EnumVariant(k) => k.attributes(),
91 Self::Field(k) => k.attributes(),
92 Self::Fields(k) => k.attributes(),
93 Self::FileModule(k) => k.attributes(),
94 Self::Item(k) => k.attributes(),
95 Self::Module(k) => k.attributes(),
96 Self::Root(k) => k.attributes(),
97 Self::Struct(k) => k.attributes(),
98 Self::Const(k) => k.attributes(),
99 Self::UnsupportedItem(k) => k.attributes(),
100 Self::ImplItem(k) => k.attributes(),
101 Self::UnsupportedImplItem(k) => k.attributes(),
102 }
103 }
104}