From e6f7650984b1ee84ef114cf08a125a8f04a6e7c9 Mon Sep 17 00:00:00 2001 From: creativcoder Date: Sun, 25 Oct 2020 00:34:26 +0530 Subject: [PATCH] duplicated field names in records are invalid --- src/error.rs | 2 ++ src/schema/parser.rs | 4 ++++ src/schema/tests.rs | 18 ++++++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/src/error.rs b/src/error.rs index ce76d61..7a0a615 100644 --- a/src/error.rs +++ b/src/error.rs @@ -113,6 +113,8 @@ pub enum AvrowErr { ParsingCanonicalForm, #[error("Duplicate definition of named schema")] DuplicateSchema, + #[error("Duplicate field name in record schema")] + DuplicateField, #[error("Invalid default value for union. Must be the first entry from union definition")] FailedDefaultUnion, #[error("Invalid default value for given schema")] diff --git a/src/schema/parser.rs b/src/schema/parser.rs index 95b58dc..824c2be 100644 --- a/src/schema/parser.rs +++ b/src/schema/parser.rs @@ -152,6 +152,10 @@ impl Registry { let aliases = parse_aliases(o.get("aliases")); + if fields_parsed.contains_key(name) { + return Err(AvrowErr::DuplicateField); + } + fields_parsed.insert( name.to_string(), Field::new(name, ty, default, order, aliases)?, diff --git a/src/schema/tests.rs b/src/schema/tests.rs index a75484e..f6de8bc 100644 --- a/src/schema/tests.rs +++ b/src/schema/tests.rs @@ -435,3 +435,21 @@ fn test_two_instance_schema_equality() { let schema2 = Schema::from_str(raw_schema).unwrap(); assert_eq!(schema, schema2); } + +#[test] +#[should_panic(expected = "DuplicateField")] +fn duplicate_field_name_in_record_fails() { + let raw_schema = r#" + { + "type": "record", + "name": "Person", + "doc": "Hi there.", + "fields": [ + {"name": "id", "type": "string", "default": "dsf8e8"}, + {"name": "id", "type": "int", "default": 56} + ] + } + "#; + + Schema::from_str(raw_schema).unwrap(); +}