protobuf_codegen3/
customize.rs1use protobuf::descriptor::EnumOptions;
2use protobuf::descriptor::FieldOptions;
3use protobuf::descriptor::FileOptions;
4use protobuf::descriptor::MessageOptions;
5use protobuf::rustproto;
6
7#[derive(Default, Debug, Clone)]
9pub struct Customize {
10 pub expose_oneof: Option<bool>,
12 pub expose_fields: Option<bool>,
14 pub generate_accessors: Option<bool>,
16 pub carllerche_bytes_for_bytes: Option<bool>,
18 pub carllerche_bytes_for_string: Option<bool>,
20 pub serde_derive: Option<bool>,
22 pub serde_derive_cfg: Option<String>,
24 pub serde_rename_all: Option<String>,
26 pub lite_runtime: Option<bool>,
28 pub gen_mod_rs: Option<bool>,
34 pub inside_protobuf: Option<bool>,
37
38 pub _future_options: (),
42
43 pub optional_serde_rename: Option<bool>,
45 pub optional_serde_skip_none: Option<bool>,
47 pub optional_serde_enum_attr: Option<String>,
49}
50
51#[derive(Debug)]
52pub enum CustomizeParseParameterError {
53 EqNotFound,
54 CannotParseBool,
55 UnknownOptionName(String),
56}
57
58pub type CustomizeParseParameterResult<T> = Result<T, CustomizeParseParameterError>;
59
60impl Customize {
61 pub fn update_with(&mut self, that: &Customize) {
63 if let Some(v) = that.expose_oneof {
64 self.expose_oneof = Some(v);
65 }
66 if let Some(v) = that.expose_fields {
67 self.expose_fields = Some(v);
68 }
69 if let Some(v) = that.generate_accessors {
70 self.generate_accessors = Some(v);
71 }
72 if let Some(v) = that.carllerche_bytes_for_bytes {
73 self.carllerche_bytes_for_bytes = Some(v);
74 }
75 if let Some(v) = that.carllerche_bytes_for_string {
76 self.carllerche_bytes_for_string = Some(v);
77 }
78 if let Some(v) = that.serde_derive {
79 self.serde_derive = Some(v);
80 }
81 if let Some(ref v) = that.serde_derive_cfg {
82 self.serde_derive_cfg = Some(v.clone());
83 }
84 if let Some(ref v) = that.serde_rename_all {
85 self.serde_rename_all = Some(v.clone());
86 }
87 if let Some(v) = that.lite_runtime {
88 self.lite_runtime = Some(v);
89 }
90 if let Some(v) = that.gen_mod_rs {
91 self.gen_mod_rs = Some(v);
92 }
93 if let Some(v) = that.inside_protobuf {
94 self.inside_protobuf = Some(v);
95 }
96 }
97
98 pub fn set_defaults_from(&mut self, other: &Customize) {
100 let mut tmp = other.clone();
101 tmp.update_with(self);
102 *self = tmp;
103 }
104
105 pub fn parse_from_parameter(parameter: &str) -> CustomizeParseParameterResult<Customize> {
107 fn parse_bool(v: &str) -> CustomizeParseParameterResult<bool> {
108 v.parse()
109 .map_err(|_| CustomizeParseParameterError::CannotParseBool)
110 }
111
112 let mut r = Customize::default();
113 for nv in parameter.split_whitespace() {
114 let eq = match nv.find('=') {
115 Some(eq) => eq,
116 None => return Err(CustomizeParseParameterError::EqNotFound),
117 };
118
119 let n = &nv[..eq];
120 let v = &nv[eq + 1..];
121
122 if n == "expose_oneof" {
123 r.expose_oneof = Some(parse_bool(v)?);
124 } else if n == "expose_fields" {
125 r.expose_fields = Some(parse_bool(v)?);
126 } else if n == "generate_accessors" {
127 r.generate_accessors = Some(parse_bool(v)?);
128 } else if n == "carllerche_bytes_for_bytes" {
129 r.carllerche_bytes_for_bytes = Some(parse_bool(v)?);
130 } else if n == "carllerche_bytes_for_string" {
131 r.carllerche_bytes_for_string = Some(parse_bool(v)?);
132 } else if n == "serde_derive" {
133 r.serde_derive = Some(parse_bool(v)?);
134 } else if n == "serde_derive_cfg" {
135 r.serde_derive_cfg = Some(v.to_owned());
136 } else if n == "serde_rename_all" {
137 r.serde_rename_all = Some(v.to_owned());
138 } else if n == "lite_runtime" {
139 r.lite_runtime = Some(parse_bool(v)?);
140 } else if n == "gen_mod_rs" {
141 r.gen_mod_rs = Some(parse_bool(v)?);
142 } else if n == "inside_protobuf" {
143 r.inside_protobuf = Some(parse_bool(v)?);
144 } else {
145 return Err(CustomizeParseParameterError::UnknownOptionName(
146 n.to_owned(),
147 ));
148 }
149 }
150 Ok(r)
151 }
152}
153
154pub fn customize_from_rustproto_for_message(source: &MessageOptions) -> Customize {
155 let expose_oneof = rustproto::exts::expose_oneof.get(source);
156 let expose_fields = rustproto::exts::expose_fields.get(source);
157 let generate_accessors = rustproto::exts::generate_accessors.get(source);
158 let carllerche_bytes_for_bytes = rustproto::exts::carllerche_bytes_for_bytes.get(source);
159 let carllerche_bytes_for_string = rustproto::exts::carllerche_bytes_for_string.get(source);
160 let serde_derive = rustproto::exts::serde_derive.get(source);
161 let serde_derive_cfg = rustproto::exts::serde_derive_cfg.get(source);
162 let lite_runtime = None;
163 let gen_mod_rs = None;
164 let inside_protobuf = None;
165 let serde_rename_all = None;
166 Customize {
167 expose_oneof,
168 expose_fields,
169 generate_accessors,
170 carllerche_bytes_for_bytes,
171 carllerche_bytes_for_string,
172 serde_derive,
173 serde_derive_cfg,
174 serde_rename_all,
175 lite_runtime,
176 gen_mod_rs,
177 inside_protobuf,
178 _future_options: (),
179 ..Default::default()
180 }
181}
182
183pub fn customize_from_rustproto_for_enum(source: &EnumOptions) -> Customize {
184 let serde_rename_all = rustproto::exts::serde_rename_all.get(source);
185 let mut r = Customize::default();
186 r.serde_rename_all = serde_rename_all;
187 return r;
188}
189
190pub fn customize_from_rustproto_for_field(source: &FieldOptions) -> Customize {
191 let expose_oneof = None;
192 let expose_fields = rustproto::exts::expose_fields_field.get(source);
193 let generate_accessors = rustproto::exts::generate_accessors_field.get(source);
194 let carllerche_bytes_for_bytes = rustproto::exts::carllerche_bytes_for_bytes_field.get(source);
195 let carllerche_bytes_for_string =
196 rustproto::exts::carllerche_bytes_for_string_field.get(source);
197 let serde_rename_all = None;
198 let serde_derive = None;
199 let serde_derive_cfg = None;
200 let lite_runtime = None;
201 let gen_mod_rs = None;
202 let inside_protobuf = None;
203 Customize {
204 expose_oneof,
205 expose_fields,
206 generate_accessors,
207 carllerche_bytes_for_bytes,
208 carllerche_bytes_for_string,
209 serde_derive,
210 serde_derive_cfg,
211 serde_rename_all,
212 lite_runtime,
213 gen_mod_rs,
214 inside_protobuf,
215 _future_options: (),
216 ..Default::default()
217 }
218}
219
220pub fn customize_from_rustproto_for_file(source: &FileOptions) -> Customize {
221 let expose_oneof = rustproto::exts::expose_oneof_all.get(source);
222 let expose_fields = rustproto::exts::expose_fields_all.get(source);
223 let generate_accessors = rustproto::exts::generate_accessors_all.get(source);
224 let carllerche_bytes_for_bytes = rustproto::exts::carllerche_bytes_for_bytes_all.get(source);
225 let carllerche_bytes_for_string = rustproto::exts::carllerche_bytes_for_string_all.get(source);
226 let serde_derive = rustproto::exts::serde_derive_all.get(source);
227 let serde_derive_cfg = rustproto::exts::serde_derive_cfg_all.get(source);
228 let lite_runtime = rustproto::exts::lite_runtime_all.get(source);
229 let gen_mod_rs = None;
230 let inside_protobuf = None;
231 let serde_rename_all = None;
232 Customize {
233 expose_oneof,
234 expose_fields,
235 generate_accessors,
236 carllerche_bytes_for_bytes,
237 carllerche_bytes_for_string,
238 serde_derive,
239 serde_derive_cfg,
240 serde_rename_all,
241 lite_runtime,
242 inside_protobuf,
243 gen_mod_rs,
244 _future_options: (),
245 ..Default::default()
246 }
247}