use crate::gen::inside::protobuf_crate_path; use crate::gen::rust_types_values::RustType; use crate::Customize; /// Optional fields can be stored are `Option` or `SingularPtrField`. #[derive(Copy, Clone, Eq, PartialEq)] pub enum OptionKind { /// Field is `Option` Option, /// Field is `SingularPtrField` MessageField, } impl OptionKind { pub(crate) fn wrap_element(&self, element_type: RustType) -> RustType { let element_type = Box::new(element_type); match self { OptionKind::Option => RustType::Option(element_type), OptionKind::MessageField => RustType::MessageField(element_type), } } // Type of `as_ref()` operation pub(crate) fn as_ref_type(&self, element_type: RustType) -> RustType { match self { OptionKind::Option => RustType::Option(Box::new(element_type.ref_type())), OptionKind::MessageField => RustType::MessageField(Box::new(element_type.ref_type())), } } fn _as_option_ref(&self, v: &str) -> String { match self { OptionKind::Option | OptionKind::MessageField => format!("{}.as_ref()", v), } } pub(crate) fn unwrap_or_else(&self, what: &str, default_value: &str) -> String { match self { _ => format!("{}.unwrap_or_else(|| {})", what, default_value), } } pub(crate) fn unwrap_ref_or_else(&self, what: &str, default_value: &str) -> String { match self { _ => format!("{}.unwrap_or_else(|| {})", what, default_value), } } pub(crate) fn wrap_value(&self, value: &str, customize: &Customize) -> String { match self { OptionKind::Option => format!("::std::option::Option::Some({})", value), OptionKind::MessageField => format!( "{}::MessageField::some({})", protobuf_crate_path(customize), value ), } } }