protobuf_codegen/gen/field/
singular.rs

1use crate::gen::field::elem::FieldElem;
2use crate::gen::field::option_kind::OptionKind;
3use crate::gen::file_and_mod::FileAndMod;
4use crate::gen::rust_types_values::RustType;
5use crate::Customize;
6
7#[derive(Clone, PartialEq, Eq, Copy)]
8pub enum SingularFieldFlag {
9    // proto2 or proto3 message
10    WithFlag {
11        required: bool,
12        option_kind: OptionKind,
13    },
14    // proto3
15    WithoutFlag,
16}
17
18impl SingularFieldFlag {
19    pub fn is_required(&self) -> bool {
20        match *self {
21            SingularFieldFlag::WithFlag { required, .. } => required,
22            SingularFieldFlag::WithoutFlag => false,
23        }
24    }
25}
26
27#[derive(Clone)]
28pub(crate) struct SingularField<'a> {
29    pub flag: SingularFieldFlag,
30    pub elem: FieldElem<'a>,
31}
32
33impl<'a> SingularField<'a> {
34    pub(crate) fn rust_storage_type(&self, reference: &FileAndMod) -> RustType {
35        match self.flag {
36            SingularFieldFlag::WithFlag { option_kind, .. } => {
37                option_kind.wrap_element(self.elem.rust_storage_elem_type(reference))
38            }
39            SingularFieldFlag::WithoutFlag => self.elem.rust_storage_elem_type(reference),
40        }
41    }
42
43    pub(crate) fn default_value(
44        &self,
45        customize: &Customize,
46        reference: &FileAndMod,
47        const_expr: bool,
48    ) -> String {
49        self.rust_storage_type(reference)
50            .default_value(customize, const_expr)
51    }
52}