use crate::gen::field::elem::FieldElem; use crate::gen::field::option_kind::OptionKind; use crate::gen::file_and_mod::FileAndMod; use crate::gen::rust_types_values::RustType; use crate::Customize; #[derive(Clone, PartialEq, Eq, Copy)] pub enum SingularFieldFlag { // proto2 or proto3 message WithFlag { required: bool, option_kind: OptionKind, }, // proto3 WithoutFlag, } impl SingularFieldFlag { pub fn is_required(&self) -> bool { match *self { SingularFieldFlag::WithFlag { required, .. } => required, SingularFieldFlag::WithoutFlag => false, } } } #[derive(Clone)] pub(crate) struct SingularField<'a> { pub flag: SingularFieldFlag, pub elem: FieldElem<'a>, } impl<'a> SingularField<'a> { pub(crate) fn rust_storage_type(&self, reference: &FileAndMod) -> RustType { match self.flag { SingularFieldFlag::WithFlag { option_kind, .. } => { option_kind.wrap_element(self.elem.rust_storage_elem_type(reference)) } SingularFieldFlag::WithoutFlag => self.elem.rust_storage_elem_type(reference), } } pub(crate) fn default_value( &self, customize: &Customize, reference: &FileAndMod, const_expr: bool, ) -> String { self.rust_storage_type(reference) .default_value(customize, const_expr) } }