protobuf_codegen3/
customize.rs

1use protobuf::descriptor::EnumOptions;
2use protobuf::descriptor::FieldOptions;
3use protobuf::descriptor::FileOptions;
4use protobuf::descriptor::MessageOptions;
5use protobuf::rustproto;
6
7/// Specifies style of generated code.
8#[derive(Default, Debug, Clone)]
9pub struct Customize {
10    /// Make oneof enum public.
11    pub expose_oneof: Option<bool>,
12    /// When true all fields are public, and accessors are not generated
13    pub expose_fields: Option<bool>,
14    /// When false, `get_`, `set_`, `mut_` etc. accessors are not generated
15    pub generate_accessors: Option<bool>,
16    /// Use `bytes::Bytes` for `bytes` fields
17    pub carllerche_bytes_for_bytes: Option<bool>,
18    /// Use `bytes::Bytes` for `string` fields
19    pub carllerche_bytes_for_string: Option<bool>,
20    /// Implement serde_derive for messages
21    pub serde_derive: Option<bool>,
22    /// When `serde_derive` is set, serde annotations will be guarded with `#[cfg(cfg, ...)]`.
23    pub serde_derive_cfg: Option<String>,
24    /// When `serde_derive` is set, use attribute rename_all
25    pub serde_rename_all: Option<String>,
26    /// Enable lite runtime
27    pub lite_runtime: Option<bool>,
28    /// Generate `mod.rs` in the output directory.
29    ///
30    /// This option allows inclusion of generated files from cargo output directory.
31    ///
32    /// This option will likely be on by default in rust-protobuf version 3.
33    pub gen_mod_rs: Option<bool>,
34    /// Used internally to generate protos bundled in protobuf crate
35    /// like `descriptor.proto`
36    pub inside_protobuf: Option<bool>,
37
38    // When adding more options please keep in sync with `parse_from_parameter` below.
39    /// Make sure `Customize` is always used with `..Default::default()`
40    /// for future compatibility.
41    pub _future_options: (),
42
43    /// [Serde] Remove the start '_' from the optional field
44    pub optional_serde_rename: Option<bool>,
45    /// [Serde] Skip Option::None for the optional field
46    pub optional_serde_skip_none: Option<bool>,
47    /// [Serde] Set enum serde attr for the middle enum var
48    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    /// Update fields of self with fields defined in other customize
62    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    /// Update unset fields of self with fields from other customize
99    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    /// Parse customize options from a string passed via protoc flag.
106    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}