blob: eb830e1e3c85b44a5c1f40c0cebf08541cabdf34 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
use apache_avro::{
schema::Schema,
types::{Record, Value},
Codec, Writer,
};
use std::{
collections::HashMap,
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() -> anyhow::Result<()> {
let schema_str = std::fs::read_to_string("../../share/test/schemas/interop.avsc")
.expect("Unable to read the interop Avro schema");
let schema = Schema::parse_str(schema_str.as_str())?;
let data_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{}.avro", data_folder, suffix);
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>>) -> anyhow::Result<()> {
writer.add_user_metadata("user_metadata".to_string(), b"someByteArray")?;
Ok(())
}