use apache_avro::{
schema::Schema,
types::{Record, Value},
Codec, Writer,
};
use std::{
collections::HashMap,
error::Error,
io::{BufWriter, Write},
};
use strum::IntoEnumIterator;
fn create_datum(schema: &Schema) -> Record {
let mut datum = Record::new(schema).unwrap();
datum.put("intField", 12_i32);
datum.put("longField", 15234324_i64);
datum.put("stringField", "hey");
datum.put("boolField", true);
datum.put("floatField", 1234.0_f32);
datum.put("doubleField", -1234.0_f64);
datum.put("bytesField", b"12312adf".to_vec());
datum.put("nullField", Value::Null);
datum.put(
"arrayField",
Value::Array(vec![
Value::Double(5.0),
Value::Double(0.0),
Value::Double(12.0),
]),
);
let mut map = HashMap::new();
map.insert(
"a".into(),
Value::Record(vec![("label".into(), Value::String("a".into()))]),
);
map.insert(
"bee".into(),
Value::Record(vec![("label".into(), Value::String("cee".into()))]),
);
datum.put("mapField", Value::Map(map));
datum.put("unionField", Value::Union(1, Box::new(Value::Double(12.0))));
datum.put("enumField", Value::Enum(2, "C".to_owned()));
datum.put("fixedField", Value::Fixed(16, b"1019181716151413".to_vec()));
datum.put(
"recordField",
Value::Record(vec![
("label".into(), Value::String("outer".into())),
(
"children".into(),
Value::Array(vec![Value::Record(vec![
("label".into(), Value::String("inner".into())),
("children".into(), Value::Array(vec![])),
])]),
),
]),
);
datum
}
fn main() -> Result<(), Box<dyn Error>> {
let interop_root_folder: String = std::env::var("INTEROP_ROOT_FOLDER")?;
let schema_str = std::fs::read_to_string(format!(
"{}/share/test/schemas/interop.avsc",
&interop_root_folder
))
.expect("Unable to read the interop Avro schema");
let schema = Schema::parse_str(schema_str.as_str())?;
let data_folder = format!("{interop_root_folder}/build/interop/data");
std::fs::create_dir_all(&data_folder)?;
for codec in Codec::iter() {
let codec_name = <&str>::from(codec);
let suffix = if codec_name == "null" {
"".to_owned()
} else {
format!("_{codec_name}")
};
let file_name = format!("{}/rust{suffix}.avro", &data_folder);
let output_file = std::fs::File::create(&file_name)?;
let mut writer = Writer::with_codec(&schema, BufWriter::new(output_file), codec);
write_user_metadata(&mut writer)?;
let datum = create_datum(&schema);
writer.append(datum)?;
writer.flush()?;
println!("Wrote {file_name}");
}
Ok(())
}
fn write_user_metadata<W: Write>(writer: &mut Writer<BufWriter<W>>) -> Result<(), Box<dyn Error>> {
writer.add_user_metadata("user_metadata".to_string(), b"someByteArray")?;
Ok(())
}