Skip to content

Commit

Permalink
Fix #351
Browse files Browse the repository at this point in the history
  • Loading branch information
bplommer committed May 18, 2021
1 parent 7c0b325 commit 6881711
Showing 1 changed file with 55 additions and 47 deletions.
102 changes: 55 additions & 47 deletions modules/core/src/main/scala/vulcan/Codec.scala
Expand Up @@ -1092,60 +1092,68 @@ object Codec extends CodecCompanionCompat {
},
(value, schema) => {
val schemaTypes =
schema.getType() match {
schema.getType match {
case UNION => schema.getTypes.asScala
case _ => Seq(schema)
}

def decodeNamedContainerType(container: GenericContainer) = {
val altName =
container.getSchema.getName

val altWriterSchema =
schemaTypes
.find(_.getName == altName)
.toRight(AvroError.decodeMissingUnionSchema(altName))

def altMatching =
alts
.find(_.codec.schema.exists { schema =>
schema.getType match {
case RECORD | FIXED | ENUM =>
schema.getName == altName || schema.getAliases.asScala
.exists(alias => alias == altName || alias.endsWith(s".$altName"))
case _ => false
}
})
.toRight(AvroError.decodeMissingUnionAlternative(altName))

altWriterSchema.flatMap { altSchema =>
altMatching.flatMap { alt =>
alt.codec
.decode(container, altSchema)
.map(alt.prism.reverseGet)
}
}
}

def decodeUnnamedType(other: Any) =
alts
.collectFirstSome { alt =>
alt.codec.schema
.traverse { altSchema =>
val altName = altSchema.getName
schemaTypes
.find(_.getName == altName)
.flatMap { schema =>
alt.codec
.decode(other, schema)
.map(alt.prism.reverseGet)
.toOption
}
}
}
.getOrElse {
Left(AvroError.decodeExhaustedAlternatives(other))
}

value match {
case container: GenericContainer =>
val altName =
container.getSchema.getName

val altWriterSchema =
schemaTypes
.find(_.getName == altName)
.toRight(AvroError.decodeMissingUnionSchema(altName))

def altMatching =
alts
.find(_.codec.schema.exists { schema =>
schema.getType match {
case RECORD | FIXED | ENUM =>
schema.getName == altName || schema.getAliases.asScala
.exists(alias => alias == altName || alias.endsWith(s".$altName"))
case _ => false
}
})
.toRight(AvroError.decodeMissingUnionAlternative(altName))

altWriterSchema.flatMap { altSchema =>
altMatching.flatMap { alt =>
alt.codec
.decode(container, altSchema)
.map(alt.prism.reverseGet)
}
container.getSchema.getType match {
case RECORD | FIXED | ENUM => decodeNamedContainerType(container)
case _ => decodeUnnamedType(container)
}

case other =>
alts
.collectFirstSome { alt =>
alt.codec.schema
.traverse { altSchema =>
val altName = altSchema.getName
schemaTypes
.find(_.getName == altName)
.flatMap { schema =>
alt.codec
.decode(other, schema)
.map(alt.prism.reverseGet)
.toOption
}
}
}
.getOrElse {
Left(AvroError.decodeExhaustedAlternatives(other))
}
case other => decodeUnnamedType(other)
}
}
)
Expand Down

0 comments on commit 6881711

Please sign in to comment.