in avro/src/reader.rs [253:310]
fn read_codec(metadata: &HashMap<String, Value>) -> AvroResult<Codec> {
let result = metadata
.get("avro.codec")
.map(|codec| {
if let Value::Bytes(ref bytes) = *codec {
match std::str::from_utf8(bytes.as_ref()) {
Ok(utf8) => Ok(utf8),
Err(utf8_error) => Err(Error::ConvertToUtf8Error(utf8_error)),
}
} else {
Err(Error::BadCodecMetadata)
}
})
.map(|codec_res| match codec_res {
Ok(codec) => match Codec::from_str(codec) {
Ok(codec) => match codec {
#[cfg(feature = "bzip")]
Codec::Bzip2(_) => {
use crate::Bzip2Settings;
if let Some(Value::Bytes(bytes)) =
metadata.get("avro.codec.compression_level")
{
Ok(Codec::Bzip2(Bzip2Settings::new(bytes[0])))
} else {
Ok(codec)
}
}
#[cfg(feature = "xz")]
Codec::Xz(_) => {
use crate::XzSettings;
if let Some(Value::Bytes(bytes)) =
metadata.get("avro.codec.compression_level")
{
Ok(Codec::Xz(XzSettings::new(bytes[0])))
} else {
Ok(codec)
}
}
#[cfg(feature = "zstandard")]
Codec::Zstandard(_) => {
use crate::ZstandardSettings;
if let Some(Value::Bytes(bytes)) =
metadata.get("avro.codec.compression_level")
{
Ok(Codec::Zstandard(ZstandardSettings::new(bytes[0])))
} else {
Ok(codec)
}
}
_ => Ok(codec),
},
Err(_) => Err(Error::CodecNotSupported(codec.to_owned())),
},
Err(err) => Err(err),
});
result.unwrap_or(Ok(Codec::Null))
}