You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by mg...@apache.org on 2022/01/20 07:23:33 UTC

[avro] branch master updated: AVRO-3302: Add support for parsing recursive schemas for Enum

This is an automated email from the ASF dual-hosted git repository.

mgrigorov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/avro.git


The following commit(s) were added to refs/heads/master by this push:
     new 064cc6b  AVRO-3302: Add support for parsing recursive schemas for Enum
064cc6b is described below

commit 064cc6b4bd1c6dcf59da989e712a27f0a955f70d
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
AuthorDate: Thu Jan 20 09:22:57 2022 +0200

    AVRO-3302: Add support for parsing recursive schemas for Enum
    
    Signed-off-by: Martin Tzvetanov Grigorov <mg...@apache.org>
---
 lang/rust/src/schema.rs | 65 +++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 60 insertions(+), 5 deletions(-)

diff --git a/lang/rust/src/schema.rs b/lang/rust/src/schema.rs
index 73b64c7..5415d35 100644
--- a/lang/rust/src/schema.rs
+++ b/lang/rust/src/schema.rs
@@ -786,7 +786,7 @@ impl Parser {
         match complex.get("type") {
             Some(&Value::String(ref t)) => match t.as_str() {
                 "record" => self.parse_record(complex),
-                "enum" => Self::parse_enum(complex),
+                "enum" => self.parse_enum(complex),
                 "array" => self.parse_array(complex),
                 "map" => self.parse_map(complex),
                 "fixed" => Self::parse_fixed(complex),
@@ -842,7 +842,7 @@ impl Parser {
 
     /// Parse a `serde_json::Value` representing a Avro enum type into a
     /// `Schema`.
-    fn parse_enum(complex: &Map<String, Value>) -> AvroResult<Schema> {
+    fn parse_enum(&mut self, complex: &Map<String, Value>) -> AvroResult<Schema> {
         let name = Name::parse(complex)?;
 
         let symbols: Vec<String> = complex
@@ -872,11 +872,14 @@ impl Parser {
             existing_symbols.insert(symbol);
         }
 
-        Ok(Schema::Enum {
-            name,
+        let schema = Schema::Enum {
+            name: name.clone(),
             doc: complex.doc(),
             symbols,
-        })
+        };
+        self.parsed_schemas
+            .insert(name.fullname(None), schema.clone());
+        Ok(schema)
     }
 
     /// Parse a `serde_json::Value` representing a Avro array type into a
@@ -1514,6 +1517,58 @@ mod tests {
         assert_eq!(canonical_form, &expected);
     }
 
+    // https://github.com/flavray/avro-rs/pull/99#issuecomment-1016948451
+    #[test]
+    fn test_parsing_of_recursive_type_enum() {
+        let schema = r#"
+    {
+        "type": "record",
+        "name": "User",
+        "namespace": "office",
+        "fields": [
+            {
+              "name": "details",
+              "type": [
+                {
+                  "type": "record",
+                  "name": "Employee",
+                  "fields": [
+                    {
+                      "name": "gender",
+                      "type": {
+                        "type": "enum",
+                        "name": "Gender",
+                        "symbols": [
+                          "male",
+                          "female"
+                        ]
+                      },
+                      "default": "female"
+                    }
+                  ]
+                },
+                {
+                  "type": "record",
+                  "name": "Manager",
+                  "fields": [
+                    {
+                      "name": "gender",
+                      "type": "Gender"
+                    }
+                  ]
+                }
+              ]
+            }
+          ]
+}
+"#;
+
+        let schema = Schema::parse_str(schema).unwrap();
+        let schema_str = schema.canonical_form();
+        let expected = r#"{"name":"office.User","type":"record","fields":[{"name":"details","type":[{"name":"Employee","type":"record","fields":[{"name":"gender","type":{"name":"Gender","type":"enum","symbols":["male","female"]}}]},{"name":"Manager","type":"record","fields":[{"name":"gender","type":{"name":"Gender","type":"enum","symbols":["male","female"]}}]}]}]}"#;
+        assert_eq!(schema_str, expected);
+    }
+
     #[test]
     fn test_enum_schema() {
         let schema = Schema::parse_str(