Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,26 @@ import com.avsystem.commons.serialization.{GenCodec, GenObjectCodec}
import scala.annotation.compileTimeOnly

trait MongoPolyAdtInstances[D[_]] {
// needed by MongoAdtFormat.materialize for generic type
protected final implicit def codecFromFormat[T: MongoFormat]: GenCodec[T] = MongoFormat[T].codec

def codec[T: GenCodec]: GenObjectCodec[D[T]]
def format[T: MongoFormat]: MongoAdtFormat[D[T]]

/**
* We need to accept an implicit `GenCodec[T]` because materialization of
* [[MongoAdtFormat]] requires a [[GenObjectCodec]] ([[MongoAdtFormat.codec]]). In practice, it can be derived
* from the `MongoFormat[T]` that is already accepted by this method but we have to be careful about priority of
* implicits. Because of that, this implicit is actually provided by [[AbstractMongoPolyDataCompanion.format]].
*/
def format[T: MongoFormat : GenCodec]: MongoAdtFormat[D[T]]
}

abstract class AbstractMongoPolyDataCompanion[Implicits, D[_]](implicits: Implicits)(
implicit instances: MacroInstances[Implicits, MongoPolyAdtInstances[D]]
implicit instances: MacroInstances[Implicits, MongoPolyAdtInstances[D]],
) {
implicit def codec[T: GenCodec]: GenObjectCodec[D[T]] = instances(implicits, this).codec[T]
implicit def format[T: MongoFormat]: MongoAdtFormat[D[T]] = instances(implicits, this).format[T]

implicit def format[T: MongoFormat]: MongoAdtFormat[D[T]] = {
implicit def tCodec: GenCodec[T] = MongoFormat[T].codec
instances(implicits, this).format[T]
}

implicit def isMongoAdtOrSubtype[C <: D[_]]: IsMongoAdtOrSubtype[C] = null

Expand Down Expand Up @@ -49,5 +57,5 @@ abstract class AbstractMongoPolyDataCompanion[Implicits, D[_]](implicits: Implic
* }}}
*/
abstract class MongoPolyDataCompanion[D[_]](
implicit instances: MacroInstances[BsonGenCodecs.type, MongoPolyAdtInstances[D]]
implicit instances: MacroInstances[BsonGenCodecs.type, MongoPolyAdtInstances[D]],
) extends AbstractMongoPolyDataCompanion[BsonGenCodecs.type, D](BsonGenCodecs)
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.avsystem.commons
package mongo.typed

import com.avsystem.commons.meta.MacroInstances
import com.avsystem.commons.serialization.GenCodec

case class CustomWrappy(value: String)

object CustomImplicits {
implicit val customWrappyCodec: GenCodec[CustomWrappy] =
GenCodec.transformed[CustomWrappy, String](_.value, CustomWrappy)
}

abstract class CustomPolyDataCompanion[D[_]](
implicit instances: MacroInstances[CustomImplicits.type, MongoPolyAdtInstances[D]],
) extends AbstractMongoPolyDataCompanion[CustomImplicits.type, D](CustomImplicits)

/**
* This class tests (through its compilation) if implicit resolution conflicts that were
* previously present in [[MongoPolyAdtInstances]] are fixed.
*/
case class PolyDataWithCustomImplicits[+T](wrappy: CustomWrappy, value: List[T])
object PolyDataWithCustomImplicits extends CustomPolyDataCompanion[PolyDataWithCustomImplicits]