Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
@@ -1,26 +1,35 @@
package com.avsystem.commons
package mongo.typed

import com.avsystem.commons.annotation.explicitGenerics
import com.avsystem.commons.annotation.{bincompat, explicitGenerics}
import com.avsystem.commons.meta.MacroInstances
import com.avsystem.commons.mongo.BsonGenCodecs
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]]
def mkFormat[T: MongoFormat : GenCodec]: MongoAdtFormat[D[T]]

@bincompat
private[typed] final def format[T: MongoFormat]: MongoAdtFormat[D[T]] =
mkFormat[T](MongoFormat[T], MongoFormat[T].codec)

@bincompat
protected[typed] final def codecFromFormat[T: MongoFormat]: GenCodec[T] =
MongoFormat[T].codec
}

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).mkFormat[T]
}

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

Expand Down Expand Up @@ -49,5 +58,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)
object PolyDataWithCustomImplicits extends CustomPolyDataCompanion[PolyDataWithCustomImplicits]