Hi community !
This is my code:
#[derive(Debug, Clone, PartialEq)]
pub enum FieldValue {
Integer(i32),
IntegerArray(Vec<i32>),
Long(u64),
LongArray(Vec<u64>),
Float(f32),
FloatArray(Vec<f32>),
Bytes(u32),
BytesArray(Vec<u32>),
TwoShorts((i16, i16)),
TwoShortsArray(Vec<(i16, i16)>),
Custom(Vec<FieldValue>),
CustomArray(Vec<Vec<FieldValue>>),
None,
}
impl Serialize for FieldValue {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer {
match self {
FieldValue::Integer(value) => serializer.serialize_i32(*value),
FieldValue::IntegerArray(array) => {
let mut seq = serializer.serialize_seq(Some(array.len()))?;
for item in array {
seq.serialize_element(&item)?;
}
seq.end()
}
FieldValue::Long(value) => serializer.serialize_u64(*value),
FieldValue::LongArray(array) => {
let mut seq = serializer.serialize_seq(Some(array.len()))?;
for item in array {
seq.serialize_element(&item)?;
}
seq.end()
},
FieldValue::Float(value) => serializer.serialize_f32((value * 100.0).round() / 100.0),
FieldValue::FloatArray(array) => {
let mut seq = serializer.serialize_seq(Some(array.len()))?;
for item in array {
let item = (item * 100.0).round() / 100.0;
seq.serialize_element(&item)?;
}
seq.end()
},
FieldValue::Bytes(value) => serializer.serialize_u32(*value),
FieldValue::BytesArray(array) => {
let mut seq = serializer.serialize_seq(Some(array.len()))?;
for item in array {
seq.serialize_element(&item)?;
}
seq.end()
},
FieldValue::TwoShorts((value1, value2)) => {
let mut tuple = serializer.serialize_tuple(2)?;
tuple.serialize_element(&value1)?;
tuple.serialize_element(&value2)?;
tuple.end()
},
FieldValue::TwoShortsArray(array) => {
let mut seq = serializer.serialize_seq(Some(array.len()))?;
for item in array {
seq.serialize_element(&item)?;
}
seq.end()
},
FieldValue::Custom(array) => {
let mut seq = serializer.serialize_seq(Some(array.len()))?;
for item in array {
seq.serialize_element(&item)?;
}
seq.end()
},
FieldValue::CustomArray(array) => {
let mut seq = serializer.serialize_seq(Some(array.len()))?;
for item in array {
let mut inner_seq = serializer.serialize_seq(Some(item.len()))?;
for inner_item in item {
inner_seq.serialize_element(&inner_item)?;
}
inner_seq.end()?;
}
seq.end()
},
FieldValue::None => serializer.serialize_none(),
}
}
}
on compile I have an error:
error[E0382]: use of moved value: `serializer`
--> src/primary/traits/src/types/update_fields.rs:529:41
|
471 | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer {
| ---------- move occurs because `serializer` has type `S`, which does not implement the `Copy` trait
...
527 | let mut seq = serializer.serialize_seq(Some(array.len()))?;
| ---------- value moved here
528 | for item in array {
529 | let mut inner_seq = serializer.serialize_seq(Some(item.len()))?;
| ^^^^^^^^^^ value used here after move
|
help: if `S` implemented `Clone`, you could clone the value
--> src/primary/traits/src/types/update_fields.rs:471:18
|
471 | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer {
| ^ consider constraining this type parameter with `Clone`
...
527 | let mut seq = serializer.serialize_seq(Some(array.len()))?;
| ---------- you could clone this value
help: consider further restricting this bound
|
471 | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer + std::marker::Copy {
but when I try to add + Copy
I got another error:
error[E0276]: impl has stricter requirements than trait
This is a sandbox to reproduce: Rust Playground
Could somebody explain me how to fix this issue ?