in avro/src/schema_equality.rs [57:212]
fn compare(&self, schema_one: &Schema, schema_two: &Schema) -> bool {
macro_rules! compare_primitive {
($primitive:ident) => {
if let Schema::$primitive = schema_one {
if let Schema::$primitive = schema_two {
return true;
}
return false;
}
};
}
if schema_one.name() != schema_two.name() {
return false;
}
compare_primitive!(Null);
compare_primitive!(Boolean);
compare_primitive!(Int);
compare_primitive!(Int);
compare_primitive!(Long);
compare_primitive!(Float);
compare_primitive!(Double);
compare_primitive!(Bytes);
compare_primitive!(String);
compare_primitive!(Uuid);
compare_primitive!(BigDecimal);
compare_primitive!(Date);
compare_primitive!(Duration);
compare_primitive!(TimeMicros);
compare_primitive!(TimeMillis);
compare_primitive!(TimestampMicros);
compare_primitive!(TimestampMillis);
compare_primitive!(TimestampNanos);
compare_primitive!(LocalTimestampMicros);
compare_primitive!(LocalTimestampMillis);
compare_primitive!(LocalTimestampNanos);
if self.include_attributes
&& schema_one.custom_attributes() != schema_two.custom_attributes()
{
return false;
}
if let Schema::Record(RecordSchema {
fields: fields_one, ..
}) = schema_one
{
if let Schema::Record(RecordSchema {
fields: fields_two, ..
}) = schema_two
{
return self.compare_fields(fields_one, fields_two);
}
return false;
}
if let Schema::Enum(EnumSchema {
symbols: symbols_one,
..
}) = schema_one
{
if let Schema::Enum(EnumSchema {
symbols: symbols_two,
..
}) = schema_two
{
return symbols_one == symbols_two;
}
return false;
}
if let Schema::Fixed(FixedSchema { size: size_one, .. }) = schema_one {
if let Schema::Fixed(FixedSchema { size: size_two, .. }) = schema_two {
return size_one == size_two;
}
return false;
}
if let Schema::Union(UnionSchema {
schemas: schemas_one,
..
}) = schema_one
{
if let Schema::Union(UnionSchema {
schemas: schemas_two,
..
}) = schema_two
{
return schemas_one.len() == schemas_two.len()
&& schemas_one
.iter()
.zip(schemas_two.iter())
.all(|(s1, s2)| self.compare(s1, s2));
}
return false;
}
if let Schema::Decimal(DecimalSchema {
precision: precision_one,
scale: scale_one,
..
}) = schema_one
{
if let Schema::Decimal(DecimalSchema {
precision: precision_two,
scale: scale_two,
..
}) = schema_two
{
return precision_one == precision_two && scale_one == scale_two;
}
return false;
}
if let Schema::Array(ArraySchema {
items: items_one, ..
}) = schema_one
{
if let Schema::Array(ArraySchema {
items: items_two, ..
}) = schema_two
{
return items_one == items_two;
}
return false;
}
if let Schema::Map(MapSchema {
types: types_one, ..
}) = schema_one
{
if let Schema::Map(MapSchema {
types: types_two, ..
}) = schema_two
{
return self.compare(types_one, types_two);
}
return false;
}
if let Schema::Ref { name: name_one } = schema_one {
if let Schema::Ref { name: name_two } = schema_two {
return name_one == name_two;
}
return false;
}
error!(
"This is a bug in schema_equality.rs! The following schemata types are not checked! \
Please report it to the Avro library maintainers! \
\n{:?}\n\n{:?}",
schema_one, schema_two
);
false
}