Skip to content

Commit d674db9

Browse files
committed
AVRO-3631: Add support for ser_de Value::Fixed
It is based on serde-rs/bytes#28 which is not yet merged. Signed-off-by: Martin Tzvetanov Grigorov <[email protected]>
1 parent 7b2e210 commit d674db9

File tree

3 files changed

+24
-17
lines changed

3 files changed

+24
-17
lines changed

lang/rust/avro/src/de.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ impl<'a, 'de> de::Deserializer<'de> for &'a Deserializer<'de> {
329329
Value::String(ref s) => visitor.visit_bytes(s.as_bytes()),
330330
Value::Bytes(ref bytes) | Value::Fixed(_, ref bytes) => visitor.visit_bytes(bytes),
331331
Value::Uuid(ref u) => visitor.visit_bytes(u.as_bytes()),
332-
_ => Err(de::Error::custom("not a string|bytes|fixed")),
332+
_ => Err(de::Error::custom("not a string|bytes|fixed|uuid")),
333333
}
334334
}
335335

@@ -600,6 +600,7 @@ pub fn from_value<'de, D: Deserialize<'de>>(value: &'de Value) -> Result<D, Erro
600600
mod tests {
601601
use pretty_assertions::assert_eq;
602602
use serde::Serialize;
603+
use serde_bytes::ByteArray;
603604
use uuid::Uuid;
604605

605606
use super::*;
@@ -1127,16 +1128,16 @@ mod tests {
11271128
}
11281129

11291130
#[test]
1130-
fn test_struct_fixed_field_avro_3631() {
1131+
fn avro_3631_test_struct_fixed_field() {
11311132
#[derive(Debug, Serialize, Deserialize)]
11321133
struct TestStructFixedField {
1133-
field: [u8; 6],
1134+
field: ByteArray<6>,
11341135
}
11351136

11361137
let value = Value::Record(vec![(
11371138
"field".to_string(),
11381139
Value::Fixed(6, vec![0, 0, 0, 0, 0, 0]),
11391140
)]);
1140-
let _deserialized: TestStructFixedField = crate::from_value(&value).unwrap();
1141+
let _deserialized: TestStructFixedField = from_value(&value).unwrap();
11411142
}
11421143
}

lang/rust/avro/src/ser.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ impl<'b> ser::Serializer for &'b mut Serializer {
174174
}
175175

176176
fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
177-
Ok(Value::Bytes(v.to_owned()))
177+
Ok(Value::Fixed(v.len(), v.to_owned()))
178178
}
179179

180180
fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
@@ -487,6 +487,7 @@ mod tests {
487487
use super::*;
488488
use pretty_assertions::assert_eq;
489489
use serde::{Deserialize, Serialize};
490+
use serde_bytes::ByteArray;
490491

491492
#[derive(Debug, Deserialize, Serialize, Clone)]
492493
struct Test {
@@ -679,7 +680,7 @@ mod tests {
679680

680681
#[derive(Debug, Serialize, Deserialize)]
681682
struct TestStructFixedField {
682-
field: [u8; 6],
683+
field: ByteArray<6>,
683684
}
684685

685686
#[test]
@@ -1005,15 +1006,17 @@ mod tests {
10051006
}
10061007

10071008
#[test]
1008-
fn test_to_value_fixed_field_avro_3631() {
1009-
let test = TestStructFixedField { field: [1; 6] };
1009+
fn avro_3631_test_to_value_fixed_field() {
1010+
let test = TestStructFixedField {
1011+
field: ByteArray::new([1; 6]),
1012+
};
10101013
let expected = Value::Record(vec![(
10111014
"field".to_owned(),
1012-
Value::Fixed(6, Vec::from(test.field.clone())),
1015+
Value::Fixed(6, Vec::from(test.field.clone().into_array())),
10131016
)]);
10141017
assert_eq!(
1015-
to_value(test).unwrap(),
10161018
expected,
1019+
to_value(test).unwrap(),
10171020
"error serializing fixed array"
10181021
);
10191022
}

lang/rust/avro/src/types.rs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,6 +1013,7 @@ mod tests {
10131013
use apache_avro_test_helper::logger::{assert_logged, assert_not_logged};
10141014
use pretty_assertions::assert_eq;
10151015
use serde::{Deserialize, Serialize};
1016+
use serde_bytes::ByteArray;
10161017
use uuid::Uuid;
10171018

10181019
#[test]
@@ -2634,14 +2635,16 @@ Field with name '"b"' is not a member of the map items"#,
26342635
avro_3688_schema_resolution_panic(true);
26352636
}
26362637

2637-
#[derive(Debug, Serialize, Deserialize)]
2638-
struct TestStructFixedField {
2639-
field: [u8; 6],
2640-
}
2641-
26422638
#[test]
2643-
fn test_avro_3631_serialize_fixed_fields() {
2644-
let test = TestStructFixedField { field: [1; 6] };
2639+
fn avro_3631_test_serialize_fixed_fields() {
2640+
#[derive(Debug, Serialize, Deserialize)]
2641+
struct TestStructFixedField {
2642+
field: ByteArray<6>,
2643+
}
2644+
2645+
let test = TestStructFixedField {
2646+
field: ByteArray::new([1; 6]),
2647+
};
26452648
let value: Value = to_value(test).unwrap();
26462649
let schema = Schema::parse_str(
26472650
r#"

0 commit comments

Comments
 (0)