[ https://issues.apache.org/jira/browse/AVRO-3646?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17656560#comment-17656560 ]
Christophe Le Saec commented on AVRO-3646: ------------------------------------------ Hi Martin, As far as i understood, the issue is about how to translate rust enum in Avro while rust enum can contains structures (not only singleton value) Like in {code:java} enum MixedExternalEnum { Val1, Val2(f32), } {code} where Val2(f32) is not a singleton value but more a "class that inherit from MixedExternalEnum" (_A function that contains a MixedExternalEnum argument will accept an instance of Val2_). So, on avro side, you could view MixedExternalEnum as a Record with several children, first with all "singleton value" (here only Val1), and one child for each "rust subclass like", (Val2(f32) in the example). So, if the (de)serialize Avro is done for Record inheritance, it would solve the pb (_and store an enum that contains "sub-classes" as a Record_), no ? > Serialization / deserialization for enum with mixed variants (with and > without data) > ------------------------------------------------------------------------------------ > > Key: AVRO-3646 > URL: https://issues.apache.org/jira/browse/AVRO-3646 > Project: Apache Avro > Issue Type: Bug > Components: rust > Reporter: Lucas Javaudin > Assignee: Martin Tzvetanov Grigorov > Priority: Major > Labels: pull-request-available, rust > Time Spent: 5h > Remaining Estimate: 0h > > Consider the following example of what I call an "enum with mixed variants": > {code:java} > enum MixedExternalEnum { > Val1, > Val2(f32), > } {code} > For the two variants, this enum can be properly serialized to and > deserialized from a {{types::Value}} (using {{ser::to_value}} and > {{{}de::from_value{}}}). The problem is that the way they are represented as > a \{{types::Value}} cannot be represented using an Avro Schema. > The serialized version of {{MixedExternalEnum::Val1}} is > {code:java} > Value::Record(vec![("a".to_owned(), Value::Enum(0, "Val1".to_owned()))]) > {code} > while the serialized version of {{MixedExternalEnum::Val2(0.0)}} is > {code:java} > Value::Record(vec![( > "a".to_owned(), > Value::Record(vec![ > ("type".to_owned(), Value::Enum(1, "Val2".to_owned())), > ( > "value".to_owned(), > Value::Union(1, Box::new(Value::Float(0.0))), > ), > ]), > )]) > {code} > As far as I know, there is no Avro Schema compatible with both possible > values. > One solution I can think of is to change the serialization of > {{MixedExternalEnum::Val1}} to > {code:java} > Value::Record(vec![( > "a".to_owned(), > Value::Record(vec![ > ("type".to_owned(), Value::Enum(0, "Val1".to_owned())), > ( > "value".to_owned(), > Value::Union(0, Box::new(Value::Null)), > ), > ]), > )]) > {code} > > A workaround is to replace {{Val1}} by {{Val1(())}} in the enum definition > (see AVRO-3645) but this can have undesirable effects for other parts of the > code. > > Then, it's another story for adjacently tagged, internally tagged and > untagged enum... -- This message was sent by Atlassian Jira (v8.20.10#820010)