@@ -4,7 +4,7 @@ package mongo.typed
44import com .avsystem .commons .annotation .explicitGenerics
55import com .avsystem .commons .meta .MacroInstances
66import com .avsystem .commons .mongo .BsonGenCodecs
7- import com .avsystem .commons .serialization .GenObjectCodec
7+ import com .avsystem .commons .serialization .{ GenCodec , GenObjectCodec }
88
99import scala .annotation .{compileTimeOnly , implicitNotFound }
1010
@@ -13,6 +13,14 @@ trait MongoAdtInstances[T] {
1313 def format : MongoAdtFormat [T ]
1414}
1515
16+ trait MongoPolyAdtInstances [D [_]] {
17+ // needed by MongoAdtFormat.materialize for generic type
18+ protected final implicit def codecFromFormat [T : MongoFormat ]: GenCodec [T ] = MongoFormat [T ].codec
19+
20+ def codec [T : GenCodec ]: GenObjectCodec [D [T ]]
21+ def format [T : MongoFormat ]: MongoAdtFormat [D [T ]]
22+ }
23+
1624trait MongoEntityInstances [E <: BaseMongoEntity ] extends MongoAdtInstances [E ] {
1725 def meta : MongoEntityMeta [E ]
1826}
@@ -47,6 +55,25 @@ abstract class AbstractMongoDataCompanion[Implicits, E](implicits: Implicits)(
4755 implicit val format : MongoAdtFormat [E ] = instances(implicits, this ).format
4856}
4957
58+ abstract class AbstractMongoPolyDataCompanion [Implicits , D [_]](implicits : Implicits )(
59+ implicit instances : MacroInstances [Implicits , MongoPolyAdtInstances [D ]]
60+ ) {
61+ implicit def codec [T : GenCodec ]: GenObjectCodec [D [T ]] = instances(implicits, this ).codec[T ]
62+ implicit def format [T : MongoFormat ]: MongoAdtFormat [D [T ]] = instances(implicits, this ).format[T ]
63+
64+ implicit def isMongoAdtOrSubtype [C <: D [_]]: IsMongoAdtOrSubtype [C ] = null
65+
66+ implicit class macroDslExtensions [T ](value : D [T ]) {
67+ @ explicitGenerics
68+ @ compileTimeOnly(" the .as[Subtype] construct can only be used inside lambda passed to .ref(...) macro" )
69+ def as [C <: D [T ]]: C = sys.error(" stub" )
70+ }
71+
72+ def apply [T : MongoFormat ]: DataTypeDsl [D [T ]] = new DataTypeDsl [D [T ]] {
73+ def SelfRef : MongoRef [D [T ], D [T ]] = MongoRef .RootRef (format[T ])
74+ }
75+ }
76+
5077abstract class AbstractMongoEntityCompanion [Implicits , E <: BaseMongoEntity ](implicits : Implicits )(
5178 implicit instances : MacroInstances [Implicits , MongoEntityInstances [E ]]
5279) extends BaseMongoCompanion [E ] {
@@ -79,3 +106,19 @@ abstract class MongoDataCompanion[E](
79106abstract class MongoEntityCompanion [E <: BaseMongoEntity ](
80107 implicit instances : MacroInstances [BsonGenCodecs .type , MongoEntityInstances [E ]]
81108) extends AbstractMongoEntityCompanion [BsonGenCodecs .type , E ](BsonGenCodecs )
109+
110+ /**
111+ * Like [[MongoDataCompanion ]] buf for generic types (with exactly one unbounded type parameter).
112+ *
113+ * @example
114+ * {{{
115+ * case class Point[+T](x: T, y: T)
116+ * object Point extends MongoPolyDataCompanion[Point] {
117+ * def XRef[T: MongoFormat]: MongoPropertyRef[Point[T], T] =
118+ * Point[T].ref(_.x)
119+ * }
120+ * }}}
121+ */
122+ abstract class MongoPolyDataCompanion [D [_]](
123+ implicit instances : MacroInstances [BsonGenCodecs .type , MongoPolyAdtInstances [D ]]
124+ ) extends AbstractMongoPolyDataCompanion [BsonGenCodecs .type , D ](BsonGenCodecs )
0 commit comments