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 FileModule(&'b crate::FileModuleKorok<'a>),
21 Item(&'b crate::ItemKorok<'a>),
22 Module(&'b crate::ModuleKorok<'a>),
23 Root(&'b crate::RootKorok<'a>),
24 Struct(&'b crate::StructKorok<'a>),
25 UnsupportedItem(&'b crate::UnsupportedItemKorok<'a>),
26}
27
28#[derive(From, Debug, PartialEq)]
29pub enum KorokMut<'a, 'b> {
30 Crate(&'b mut crate::CrateKorok<'a>),
31 Enum(&'b mut crate::EnumKorok<'a>),
32 EnumVariant(&'b mut crate::EnumVariantKorok<'a>),
33 Field(&'b mut crate::FieldKorok<'a>),
34 FileModule(&'b mut crate::FileModuleKorok<'a>),
35 Item(&'b mut crate::ItemKorok<'a>),
36 Module(&'b mut crate::ModuleKorok<'a>),
37 Root(&'b mut crate::RootKorok<'a>),
38 Struct(&'b mut crate::StructKorok<'a>),
39 Const(&'b mut crate::ConstKorok<'a>),
40 UnsupportedItem(&'b mut crate::UnsupportedItemKorok<'a>),
41 ImplItem(&'b mut crate::ImplItemKorok<'a>),
42 UnsupportedImplItem(&'b mut crate::UnsupportedImplItemKorok<'a>),
43}
44
45impl KorokTrait for KorokMut<'_, '_> {
46 fn node(&self) -> &Option<Node> {
47 match self {
48 Self::Crate(k) => k.node(),
49 Self::Enum(k) => k.node(),
50 Self::EnumVariant(k) => k.node(),
51 Self::Field(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::Const(k) => k.node(),
58 Self::UnsupportedItem(k) => k.node(),
59 Self::ImplItem(k) => k.node(),
60 Self::UnsupportedImplItem(k) => k.node(),
61 }
62 }
63
64 fn set_node(&mut self, node: Option<Node>) {
65 match self {
66 Self::Crate(k) => k.set_node(node),
67 Self::Enum(k) => k.set_node(node),
68 Self::EnumVariant(k) => k.set_node(node),
69 Self::Field(k) => k.set_node(node),
70 Self::FileModule(k) => k.set_node(node),
71 Self::Item(k) => k.set_node(node),
72 Self::Module(k) => k.set_node(node),
73 Self::Root(k) => k.set_node(node),
74 Self::Struct(k) => k.set_node(node),
75 Self::Const(k) => k.set_node(node),
76 Self::UnsupportedItem(k) => k.set_node(node),
77 Self::ImplItem(k) => k.set_node(node),
78 Self::UnsupportedImplItem(k) => k.set_node(node),
79 }
80 }
81
82 fn attributes(&self) -> Option<&Attributes<'_>> {
83 match self {
84 Self::Crate(k) => k.attributes(),
85 Self::Enum(k) => k.attributes(),
86 Self::EnumVariant(k) => k.attributes(),
87 Self::Field(k) => k.attributes(),
88 Self::FileModule(k) => k.attributes(),
89 Self::Item(k) => k.attributes(),
90 Self::Module(k) => k.attributes(),
91 Self::Root(k) => k.attributes(),
92 Self::Struct(k) => k.attributes(),
93 Self::Const(k) => k.attributes(),
94 Self::UnsupportedItem(k) => k.attributes(),
95 Self::ImplItem(k) => k.attributes(),
96 Self::UnsupportedImplItem(k) => k.attributes(),
97 }
98 }
99}