diff options
Diffstat (limited to 'src/gen/field/singular.rs')
-rw-r--r-- | src/gen/field/singular.rs | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/gen/field/singular.rs b/src/gen/field/singular.rs new file mode 100644 index 0000000..3bd223f --- /dev/null +++ b/src/gen/field/singular.rs @@ -0,0 +1,52 @@ +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) + } +} |