protobuf_codegen/gen/field/
repeated.rs

1use crate::gen::field::elem::FieldElem;
2use crate::gen::file_and_mod::FileAndMod;
3use crate::gen::rust::snippets::EXPR_VEC_NEW;
4use crate::gen::rust_types_values::RustType;
5
6/// Repeated field can be `Vec<T>` or `RepeatedField<T>`.
7#[derive(Eq, PartialEq, Copy, Clone)]
8pub enum RepeatedFieldKind {
9    Vec,
10}
11
12impl RepeatedFieldKind {
13    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
20    fn default(&self) -> String {
21        match self {
22            RepeatedFieldKind::Vec => EXPR_VEC_NEW.to_owned(),
23        }
24    }
25}
26
27#[derive(Clone)]
28pub(crate) struct RepeatedField<'a> {
29    pub elem: FieldElem<'a>,
30    pub packed: bool,
31}
32
33impl<'a> RepeatedField<'a> {
34    pub(crate) fn kind(&self) -> RepeatedFieldKind {
35        RepeatedFieldKind::Vec
36    }
37
38    pub(crate) fn rust_type(&self, reference: &FileAndMod) -> RustType {
39        self.kind()
40            .wrap_element(self.elem.rust_storage_elem_type(reference))
41    }
42
43    pub(crate) fn default(&self) -> String {
44        self.kind().default()
45    }
46}