aboutsummaryrefslogtreecommitdiff
path: root/src/gen/field/repeated.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/gen/field/repeated.rs')
-rw-r--r--src/gen/field/repeated.rs46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/gen/field/repeated.rs b/src/gen/field/repeated.rs
new file mode 100644
index 0000000..56e0d0b
--- /dev/null
+++ b/src/gen/field/repeated.rs
@@ -0,0 +1,46 @@
+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()
+ }
+}