Kriskras99 opened a new issue, #517:
URL: https://github.com/apache/avro-rs/issues/517

   Original issues #449 and #458 by @PookieBuns 
   
   Currently the `SchemaAware(De)Serializer` implementations only support one 
representation of `Option<T>`: `["null", T::get_schema()]` (order of `null` and 
`T` does not matter). This means that the following schema:
   ```json
   [
       "null",
       "int",
       "string"
   ]
   ```
   can only map to the following enum:
   ```rust
   enum Example {
       Null,
       Int(i32),
       String(String),
   }
   ```
   
   It is requested that the following `Option` would also match this schema:
   ```rust
   enum Example {
       Int(i32),
       String(String),
   }
   Option<Example>
   ```
   
   This would require the following changes to the serializer:
   1. In `serialize_some` and `serialize_none`: Only require that the current 
schema is a `Schema::Union` with a `Schema::Null` variant
   2. In `serialize_some` there are two cases to keep in mind:
     - If there are only two variants, serialize using the current 
implementation. 
     - If there are more variants, serialize `T` using the current union schema 
but provide a flag to the serializer that the `null` variant cannot be used. It 
would be preferable to modify the union schema/create a new union schema so 
that the `null` variant does not exist, but as we need a reference to the 
schema that would mean using a `Cow<Schema>` everywhere.
   3. In `get_resolved_union_variant` the logic needs to be modified to correct 
the index:
     - If the index is before the `null` variant, it can be used as is
     - If the index is at or after the `null` variant, the index needs to be 
incremented by one
   4. `UnionSerializer` would also need to be changed to ignore the null 
variant when the flag is set
   
   This would require the following changes to the deserializer:
   1. In `deserialize_option`:
     - Only require that the current schema is a `Schema::Union` with a 
`Schema::Null` variant
     - If a `null` is read, then the current logic can be used
     - Otherwise, store the index that was read and `visit_some` with the 
current deserializer
   2. In `with_union` reading the index must be skipped if the index is already 
set.
   3. In `deserialize_enum` the `UnionEnumDeserializer` must be provided with 
the stored index
   4. In `UnionEnumDeserializer::variant_seed` the stored index must be used if 
available 
   
   This would require the `AvroSchemaComponent` implementation for `Option<T>` 
to only panic if `T::get_schema` is a union with a `Schema::Null` variant, 
otherwise modify that schema to include `Schema::Null`.
   
   There is probably more changes needed, but this is what I can think of right 
now.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to