blob: 56e0d0b18e39fafb027f93a984ca8bbbe53e24f0 [file] [log] [blame]
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<T>` or `RepeatedField<T>`.
#[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()
}
}