codama_koroks/
korok.rs

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}