1 use crate::gen::field::elem::FieldElem; 2 use crate::gen::file_and_mod::FileAndMod; 3 use crate::gen::rust::snippets::EXPR_VEC_NEW; 4 use crate::gen::rust_types_values::RustType; 5 6 /// Repeated field can be `Vec<T>` or `RepeatedField<T>`. 7 #[derive(Eq, PartialEq, Copy, Clone)] 8 pub enum RepeatedFieldKind { 9 Vec, 10 } 11 12 impl RepeatedFieldKind { wrap_element(&self, element_type: RustType) -> RustType13 fn wrap_element(&self, element_type: RustType) -> RustType { 14 let element_type = Box::new(element_type); 15 match self { 16 RepeatedFieldKind::Vec => RustType::Vec(element_type), 17 } 18 } 19 default(&self) -> String20 fn default(&self) -> String { 21 match self { 22 RepeatedFieldKind::Vec => EXPR_VEC_NEW.to_owned(), 23 } 24 } 25 } 26 27 #[derive(Clone)] 28 pub(crate) struct RepeatedField<'a> { 29 pub elem: FieldElem<'a>, 30 pub packed: bool, 31 } 32 33 impl<'a> RepeatedField<'a> { kind(&self) -> RepeatedFieldKind34 pub(crate) fn kind(&self) -> RepeatedFieldKind { 35 RepeatedFieldKind::Vec 36 } 37 rust_type(&self, reference: &FileAndMod) -> RustType38 pub(crate) fn rust_type(&self, reference: &FileAndMod) -> RustType { 39 self.kind() 40 .wrap_element(self.elem.rust_storage_elem_type(reference)) 41 } 42 default(&self) -> String43 pub(crate) fn default(&self) -> String { 44 self.kind().default() 45 } 46 } 47