use super::cursor::AvroCursor;
use super::schema::{FieldSchema, WriterSchema};
pub(crate) fn extract_record_schema(schema: &FieldSchema) -> Option<&WriterSchema> {
match schema {
FieldSchema::Record(ws) => Some(ws),
_ => None,
}
}
pub(crate) fn read_int_field(cursor: &mut AvroCursor, nullable: bool) -> crate::Result<i32> {
if nullable {
let idx = cursor.read_union_index()?;
if idx == 0 {
return Ok(0);
}
}
cursor.read_int()
}
pub(crate) fn read_long_field(cursor: &mut AvroCursor, nullable: bool) -> crate::Result<i64> {
if nullable {
let idx = cursor.read_union_index()?;
if idx == 0 {
return Ok(0);
}
}
cursor.read_long()
}
pub(crate) fn read_bytes_field(cursor: &mut AvroCursor, nullable: bool) -> crate::Result<Vec<u8>> {
if nullable {
let idx = cursor.read_union_index()?;
if idx == 0 {
return Ok(vec![]);
}
}
Ok(cursor.read_bytes()?.to_vec())
}
pub(crate) fn read_string_field(cursor: &mut AvroCursor, nullable: bool) -> crate::Result<String> {
if nullable {
let idx = cursor.read_union_index()?;
if idx == 0 {
return Ok(String::new());
}
}
Ok(cursor.read_string()?.to_string())
}
const EMPTY_PARTITION: [u8; 4] = [0, 0, 0, 0];
pub(crate) fn normalize_partition(partition: Option<Vec<u8>>) -> Vec<u8> {
match partition {
Some(p) if p.len() >= 4 => p,
_ => EMPTY_PARTITION.to_vec(),
}
}