mod file;
use serde_json::Result;
use avro_schema::schema::{BytesLogical, Field, LongLogical, Schema};
fn cases() -> Vec<(&'static str, Schema)> {
use Schema::*;
vec![
(r#"null"#, Null),
(r#"{"type": "null"}"#, Null),
(r#"{"type": null}"#, Null),
(r#""null""#, Null),
(r#""boolean""#, Boolean),
(r#"{"type": "boolean"}"#, Boolean),
(r#""string""#, String(None)),
(r#"{"type": "string"}"#, String(None)),
(r#""bytes""#, Bytes(None)),
(r#"{"type": "bytes"}"#, Bytes(None)),
(
r#"{"type": "bytes", "logicalType": "decimal", "precision": 10}"#,
Bytes(Some(BytesLogical::Decimal(10, 0))),
),
(r#""int""#, Int(None)),
(r#"{"type": "int"}"#, Int(None)),
(r#""long""#, Long(None)),
(r#"{"type": "long"}"#, Long(None)),
(
r#"{"type": "long", "logicalType": "timestamp-millis"}"#,
Long(Some(LongLogical::TimestampMillis)),
),
(r#""float""#, Float),
(r#"{"type": "float"}"#, Float),
(r#""double""#, Double),
(r#"{"type": "double"}"#, Double),
(
r#"{"type": "enum", "name": "Test", "symbols": ["A", "B"]}"#,
Enum(avro_schema::schema::Enum::new(
"Test",
vec!["A".to_string(), "B".to_string()],
)),
),
(r#"["null", "string"]"#, Union(vec![Null, String(None)])),
(
r#"[{"type": "null"}, {"type": "string"}]"#,
Union(vec![Null, String(None)]),
),
(
r#"{"type": "map", "values": "long"}"#,
Map(Box::new(Long(None))),
),
(
r#"{
"type": "map",
"values": {"type": "enum", "name": "Test", "symbols": ["A", "B"]}
}"#,
Map(Box::new(Enum(avro_schema::schema::Enum::new(
"Test",
vec!["A".to_string(), "B".to_string()],
)))),
),
(
r#"{"type": "array", "items": "long"}"#,
Array(Box::new(Long(None))),
),
(
r#"{
"type": "array",
"items": {"type": "enum", "name": "Test", "symbols": ["A", "B"]}
}"#,
Array(Box::new(
avro_schema::schema::Enum::new("Test", vec!["A".to_string(), "B".to_string()])
.into(),
)),
),
(
r#"{
"type":"record",
"name":"HandshakeResponse",
"namespace":"org.apache.avro.ipc",
"fields":[
{
"name":"match",
"type":{
"type":"enum",
"name":"HandshakeMatch",
"symbols":["BOTH", "CLIENT", "NONE"]
}
},
{"name":"serverProtocol", "type":["null", "string"]},
{
"name":"serverHash",
"type":["null", {"name":"MD5", "size":16, "type":"fixed"}]
},
{
"name": "meta",
"type": ["null", {"type": "map", "values":"bytes"}]
},
{
"name": "duration",
"type": {
"logicalType": "duration",
"name": "duration",
"type": "fixed",
"size": 12
}
}
]
}"#,
Record(avro_schema::schema::Record {
name: "HandshakeResponse".to_string(),
namespace: Some("org.apache.avro.ipc".to_string()),
doc: None,
aliases: vec![],
fields: vec![
Field::new(
"match",
avro_schema::schema::Enum::new(
"HandshakeMatch",
vec!["BOTH".to_string(), "CLIENT".to_string(), "NONE".to_string()],
)
.into(),
),
Field::new("serverProtocol", Union(vec![Null, String(None)])),
Field::new(
"serverHash",
Union(vec![
Null,
avro_schema::schema::Fixed::new("MD5", 16).into(),
]),
),
Field::new("meta", Union(vec![Null, Map(Box::new(Bytes(None)))])),
Field::new(
"duration",
avro_schema::schema::Fixed {
name: "duration".to_string(),
size: 12,
namespace: None,
doc: None,
aliases: vec![],
logical: Some(avro_schema::schema::FixedLogical::Duration),
}
.into(),
),
],
}),
),
]
}
#[test]
fn test_deserialize() -> Result<()> {
for (data, expected) in cases() {
let v: avro_schema::schema::Schema = serde_json::from_str(data)?;
assert_eq!(v, expected);
}
Ok(())
}