tinc_build/codegen/
config.rs

1use 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}