tinc_build/codegen/
config.rs1use std::collections::BTreeMap;
2
3use crate::types::ProtoPath;
4
5#[derive(Default)]
6pub(crate) struct AttributeConfig {
7 enum_configs: BTreeMap<ProtoPath, EnumConfig>,
8 message_configs: BTreeMap<ProtoPath, MessageConfig>,
9}
10
11impl AttributeConfig {
12 pub(crate) fn enum_configs(&self) -> impl Iterator<Item = (&ProtoPath, &EnumConfig)> {
13 self.enum_configs.iter()
14 }
15
16 pub(crate) fn message_configs(&self) -> impl Iterator<Item = (&ProtoPath, &MessageConfig)> {
17 self.message_configs.iter()
18 }
19
20 pub(crate) fn enum_config(&mut self, name: &ProtoPath) -> &mut EnumConfig {
21 self.enum_configs.entry(name.clone()).or_default()
22 }
23
24 pub(crate) fn message_config(&mut self, name: &ProtoPath) -> &mut MessageConfig {
25 self.message_configs.entry(name.clone()).or_default()
26 }
27}
28
29#[derive(Default)]
30pub(crate) struct EnumConfig {
31 container_attributes: Vec<syn::Attribute>,
32 variant_attributes: BTreeMap<String, Vec<syn::Attribute>>,
33}
34
35impl EnumConfig {
36 pub(crate) fn attributes(&self) -> impl Iterator<Item = &syn::Attribute> {
37 self.container_attributes.iter()
38 }
39
40 pub(crate) fn variant_attributes(&self, variant: &str) -> impl Iterator<Item = &syn::Attribute> {
41 self.variant_attributes.get(variant).into_iter().flatten()
42 }
43
44 pub(crate) fn variants(&self) -> impl Iterator<Item = &str> {
45 self.variant_attributes.keys().map(String::as_str)
46 }
47
48 pub(crate) fn attribute(&mut self, attr: syn::Attribute) {
49 self.container_attributes.push(attr);
50 }
51
52 pub(crate) fn variant_attribute(&mut self, variant: &str, attr: syn::Attribute) {
53 self.variant_attributes.entry(variant.to_owned()).or_default().push(attr);
54 }
55}
56
57#[derive(Default)]
58pub(crate) struct MessageConfig {
59 pub container_attributes: Vec<syn::Attribute>,
60 pub field_attributes: BTreeMap<String, Vec<syn::Attribute>>,
61 pub oneof_attributes: BTreeMap<String, OneofConfig>,
62}
63
64impl MessageConfig {
65 pub(crate) fn attributes(&self) -> impl Iterator<Item = &syn::Attribute> {
66 self.container_attributes.iter()
67 }
68
69 pub(crate) fn field_attributes(&self, field: &str) -> impl Iterator<Item = &syn::Attribute> {
70 self.field_attributes.get(field).into_iter().flatten()
71 }
72
73 pub(crate) fn fields(&self) -> impl Iterator<Item = &str> {
74 self.field_attributes.keys().map(String::as_str)
75 }
76
77 pub(crate) fn oneof_configs(&self) -> impl Iterator<Item = (&str, &OneofConfig)> {
78 self.oneof_attributes.iter().map(|(name, config)| (name.as_str(), config))
79 }
80
81 pub(crate) fn attribute(&mut self, attr: syn::Attribute) {
82 self.container_attributes.push(attr);
83 }
84
85 pub(crate) fn field_attribute(&mut self, field: &str, attr: syn::Attribute) {
86 self.field_attributes.entry(field.to_owned()).or_default().push(attr);
87 }
88
89 pub(crate) fn oneof_config(&mut self, oneof: &str) -> &mut OneofConfig {
90 self.oneof_attributes.entry(oneof.to_owned()).or_default()
91 }
92}
93
94#[derive(Default)]
95pub(crate) struct OneofConfig {
96 pub container_attributes: Vec<syn::Attribute>,
97 pub field_attributes: BTreeMap<String, Vec<syn::Attribute>>,
98}
99
100impl OneofConfig {
101 pub(crate) fn attributes(&self) -> impl Iterator<Item = &syn::Attribute> {
102 self.container_attributes.iter()
103 }
104
105 pub(crate) fn field_attributes(&self, field: &str) -> impl Iterator<Item = &syn::Attribute> {
106 self.field_attributes.get(field).into_iter().flatten()
107 }
108
109 pub(crate) fn fields(&self) -> impl Iterator<Item = &str> {
110 self.field_attributes.keys().map(String::as_str)
111 }
112
113 pub(crate) fn attribute(&mut self, attr: syn::Attribute) {
114 self.container_attributes.push(attr);
115 }
116
117 pub(crate) fn field_attribute(&mut self, field: &str, attr: syn::Attribute) {
118 self.field_attributes.entry(field.to_owned()).or_default().push(attr);
119 }
120}