use crate::gen::field::elem::FieldElem; use crate::gen::file_and_mod::FileAndMod; use crate::gen::rust::snippets::EXPR_VEC_NEW; use crate::gen::rust_types_values::RustType; /// Repeated field can be `Vec` or `RepeatedField`. #[derive(Eq, PartialEq, Copy, Clone)] pub enum RepeatedFieldKind { Vec, } impl RepeatedFieldKind { fn wrap_element(&self, element_type: RustType) -> RustType { let element_type = Box::new(element_type); match self { RepeatedFieldKind::Vec => RustType::Vec(element_type), } } fn default(&self) -> String { match self { RepeatedFieldKind::Vec => EXPR_VEC_NEW.to_owned(), } } } #[derive(Clone)] pub(crate) struct RepeatedField<'a> { pub elem: FieldElem<'a>, pub packed: bool, } impl<'a> RepeatedField<'a> { pub(crate) fn kind(&self) -> RepeatedFieldKind { RepeatedFieldKind::Vec } pub(crate) fn rust_type(&self, reference: &FileAndMod) -> RustType { self.kind() .wrap_element(self.elem.rust_storage_elem_type(reference)) } pub(crate) fn default(&self) -> String { self.kind().default() } }