Skip to content

Commit

Permalink
Extract common code for annotation based information (zio#650)
Browse files Browse the repository at this point in the history
  • Loading branch information
987Nabil committed Jan 30, 2024
1 parent 130dcfe commit 9a2345d
Show file tree
Hide file tree
Showing 6 changed files with 108 additions and 610 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ import zio.schema.annotation.{
caseNameAliases,
directDynamicMapping,
discriminatorName,
fieldDefaultValue,
fieldNameAliases,
noDiscriminator,
rejectExtraFields,
Expand Down Expand Up @@ -605,12 +604,12 @@ object BsonSchemaCodec {
// if all cases are CaseClass0, encode as a String
if (cases.forall(_.schema.isInstanceOf[Schema.CaseClass0[_]])) {
val caseMap: Map[Z, String] = cases
.filterNot(_.annotations.exists(_.isInstanceOf[transientCase]))
.filterNot(_.transient)
.map { case_ =>
val manualBsonHint = case_.annotations.collectFirst { case bsonHint(name) => name }
val manualCaseName = case_.annotations.collectFirst { case caseName(name) => name }
val caseName = case_.caseName
case_.schema.asInstanceOf[Schema.CaseClass0[Z]].defaultConstruct() ->
manualBsonHint.orElse(manualCaseName).getOrElse(case_.id)
manualBsonHint.getOrElse(caseName)
}
.toMap
BsonEncoder.string.contramap(caseMap(_))
Expand All @@ -621,8 +620,8 @@ object BsonSchemaCodec {

def getCaseName(case_ : Schema.Case[Z, _]) = {
val manualBsonHint = case_.annotations.collectFirst { case bsonHint(name) => name }
val manualCaseName = case_.annotations.collectFirst { case caseName(name) => name }
manualBsonHint.orElse(manualCaseName).getOrElse(case_.id)
val caseName = case_.caseName
manualBsonHint.getOrElse(caseName)
}

val noDiscriminators = parentSchema.annotations.exists {
Expand Down Expand Up @@ -1208,7 +1207,7 @@ object BsonSchemaCodec {
case _: bsonNoExtraFields => ()
}.isDefined
lazy val tcs: Array[BsonDecoder[Any]] = schemas.map(s => schemaDecoder(s).asInstanceOf[BsonDecoder[Any]])
lazy val defaults: Array[Option[Any]] = fields.map(_.annotations.collectFirst { case a: fieldDefaultValue[_] => a.value }).toArray
lazy val defaults: Array[Option[Any]] = fields.map(_.defaultValue).toArray

new BsonDecoder[Z] {
def decodeUnsafe(reader: BsonReader, trace: List[BsonTrace], ctx: BsonDecoder.BsonDecoderContext): Z = unsafeCall(trace) {
Expand Down
Loading

0 comments on commit 9a2345d

Please sign in to comment.