forked from rethab/magnolia-bson
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
ebf325e
commit c22eb9f
Showing
10 changed files
with
249 additions
and
76 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
package magnolia.bson | ||
|
||
import magnolia._ | ||
import reactivemongo.bson | ||
import reactivemongo.bson._ | ||
|
||
import scala.util.{Failure, Success} | ||
|
||
//case class Exported[T](instance: T) extends AnyVal | ||
//object Exported { | ||
// implicit final def a[A](implicit reader: BSONReader[_ <: BSONValue, A]): Exported[BSONReader[_ <: BSONValue, A]] = Exported(reader) | ||
// implicit final def b[A](implicit reader: BSONWriter[A, _ <: BSONValue]): Exported[BSONWriter[A, _ <: BSONValue]] = Exported(reader) | ||
//} | ||
|
||
object BSONReadDerivation { | ||
|
||
type Typeclass[T] = BSONReader[_ <: BSONValue, T] | ||
|
||
def combine[T](caseClass: CaseClass[Typeclass, T]): Typeclass[T] = { | ||
new BSONReader[BSONValue, T] { | ||
override def read(bson: BSONValue): T = bson match { | ||
case doc: BSONDocument => | ||
caseClass.construct { p => | ||
doc.getAsUnflattenedTry(p.label)(p.typeclass) match { | ||
case Success(Some(v)) => v | ||
case Success(None) => p.default.get // TODO better ex | ||
case Failure(ex) => throw ex | ||
} | ||
} | ||
case _ => throw new IllegalStateException("we only handle-case classes") | ||
} | ||
} | ||
} | ||
|
||
def dispatch[T](sealedTrait: SealedTrait[Typeclass, T]): Typeclass[T] = { | ||
new BSONReader[BSONValue, T] { | ||
override def read(bson: BSONValue): T = { | ||
bson match { | ||
case doc: BSONDocument => | ||
val className = doc.getAs[String]("className").getOrElse(throw new IllegalStateException("'className' is required for sealed traits")) | ||
val subtype = sealedTrait.subtypes.find(_.typeName.full == className).get | ||
subtype.typeclass.asInstanceOf[BSONReader[BSONValue, T]].read(doc) | ||
case _ => throw new IllegalStateException("we only handle-case classes") | ||
} | ||
} | ||
} | ||
} | ||
|
||
} | ||
|
||
object BSONWriteDerivation { | ||
|
||
type Typeclass[T] = BSONWriter[T, _ <: BSONValue] | ||
|
||
def combine[T](caseClass: CaseClass[Typeclass, T]): Typeclass[T] = { | ||
new BSONWriter[T, BSONValue]() { | ||
override def write(t: T): BSONDocument = BSONDocument(caseClass.parameters.map(p => (p.label, p.typeclass.write(p.dereference(t))))) | ||
} | ||
} | ||
|
||
def dispatch[T](sealedTrait: SealedTrait[Typeclass, T]): Typeclass[T] = { | ||
new BSONWriter[T, BSONValue]() { | ||
override def write(t: T): BSONValue = sealedTrait.dispatch(t) { subType => | ||
subType.typeclass.writeTry(subType.cast(t)) match { | ||
case Success(doc@BSONDocument(_)) => (doc ++ ("className" -> subType.typeName.full)) | ||
case Success(v) => v | ||
case Failure(ex) => throw ex | ||
} | ||
} | ||
} | ||
} | ||
} | ||
|
||
object test { | ||
import reactivemongo.bson.DefaultBSONHandlers._ | ||
val a0: BSONReader[BSONString, String] = DefaultBSONHandlers.BSONStringHandler | ||
val a1: BSONReader[_, String] = a0 | ||
|
||
// val b: BSONReadDerivation.Typeclass[Seq[String]] = DefaultBSONHandlers.bsonArrayToCollectionReader[Seq, String] | ||
|
||
} |
16 changes: 16 additions & 0 deletions
16
src/main/scala/magnolia/bson/derivation/handler/auto.scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
package magnolia.bson.derivation.handler | ||
|
||
import scala.language.experimental.macros | ||
|
||
object auto { | ||
|
||
// type Typeclass[T] = BSONReader[_ <: BSONValue, T] | ||
// | ||
// def combine[T](caseClass: CaseClass[Typeclass, T]): Typeclass[T] = | ||
// BSONReadDerivation.combine(caseClass) | ||
// | ||
// def dispatch[T](sealedTrait: SealedTrait[Typeclass, T]): Typeclass[T] = | ||
// BSONReadDerivation.dispatch(sealedTrait) | ||
// | ||
// implicit def magnoliaReader[T]: Typeclass[T] = macro Magnolia.gen[T] | ||
} |
29 changes: 29 additions & 0 deletions
29
src/main/scala/magnolia/bson/derivation/handler/semiauto.scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
package magnolia.bson.derivation.handler | ||
|
||
import magnolia.bson.{BSONReadDerivation, BSONWriteDerivation} | ||
import magnolia.{CaseClass, Magnolia, SealedTrait} | ||
import reactivemongo.bson.{BSONDocumentHandler, BSONHandler, BSONReader, BSONValue, BSONWriter} | ||
|
||
import scala.language.experimental.macros | ||
|
||
object semiauto { | ||
|
||
type Typeclass[T] = BSONHandler[_ <: BSONValue, T] | ||
|
||
val readDerivation = BSONReadDerivation | ||
val writeDerivation = BSONWriteDerivation | ||
|
||
def combine[T](caseClass: CaseClass[Typeclass, T]): Typeclass[T] = BSONHandler.provided[BSONValue, T]( | ||
writeDerivation.combine(caseClass.asInstanceOf[CaseClass[writeDerivation.Typeclass,T]]).asInstanceOf[BSONWriter[T, BSONValue]], | ||
readDerivation.combine(caseClass.asInstanceOf[CaseClass[readDerivation.Typeclass,T]]).asInstanceOf[BSONReader[BSONValue, T]] | ||
) | ||
|
||
def dispatch[T](sealedTrait: SealedTrait[Typeclass, T]): Typeclass[T] = BSONHandler.provided[BSONValue, T]( | ||
writeDerivation.dispatch(sealedTrait.asInstanceOf[SealedTrait[writeDerivation.Typeclass,T]]).asInstanceOf[BSONWriter[T, BSONValue]], | ||
readDerivation.dispatch(sealedTrait.asInstanceOf[SealedTrait[readDerivation.Typeclass,T]]).asInstanceOf[BSONReader[BSONValue, T]] | ||
) | ||
|
||
def deriveMagnoliaHandler[T]: BSONDocumentHandler[T] = macro Magnolia.gen[T] | ||
} | ||
|
||
//object semiauto extends semiauto |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
package magnolia.bson.derivation.reader | ||
|
||
import magnolia.bson.BSONReadDerivation | ||
import magnolia.{CaseClass, Magnolia, SealedTrait} | ||
import reactivemongo.bson.{BSONReader, BSONValue} | ||
|
||
import scala.language.experimental.macros | ||
|
||
object auto { | ||
|
||
// type Typeclass[T] = BSONReader[_ <: BSONValue, T] | ||
// | ||
// def combine[T](caseClass: CaseClass[Typeclass, T]): Typeclass[T] = | ||
// BSONReadDerivation.combine(caseClass) | ||
// | ||
// def dispatch[T](sealedTrait: SealedTrait[Typeclass, T]): Typeclass[T] = | ||
// BSONReadDerivation.dispatch(sealedTrait) | ||
// | ||
// implicit def magnoliaReader[T]: Typeclass[T] = macro Magnolia.gen[T] | ||
} |
25 changes: 25 additions & 0 deletions
25
src/main/scala/magnolia/bson/derivation/reader/semiauto.scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
package magnolia.bson.derivation.reader | ||
|
||
import magnolia.bson.BSONReadDerivation | ||
import magnolia.{CaseClass, Magnolia, SealedTrait, debug} | ||
import reactivemongo.bson.{BSONDocument, BSONDocumentReader, BSONReader, BSONValue, VariantBSONReader} | ||
|
||
import scala.language.experimental.macros | ||
|
||
object semiauto { | ||
|
||
// type B <: BSONValue | ||
private type Typeclass[T] = BSONReadDerivation.Typeclass[T] | ||
// | ||
// val d = new BSONReadDerivation[B] {} | ||
|
||
def combine[T](caseClass: CaseClass[Typeclass, T]): Typeclass[T] = | ||
BSONReadDerivation.combine(caseClass) | ||
|
||
def dispatch[T](sealedTrait: SealedTrait[Typeclass, T]): Typeclass[T] = | ||
BSONReadDerivation.dispatch(sealedTrait) | ||
|
||
def deriveMagnoliaReader[T]: Typeclass[T] = macro Magnolia.gen[T] | ||
} | ||
|
||
//object semiauto extends semiauto |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
package magnolia.bson.derivation.writer | ||
|
||
import magnolia.bson.BSONWriteDerivation | ||
import magnolia.{CaseClass, Magnolia, SealedTrait} | ||
import reactivemongo.bson.{BSONValue, BSONWriter} | ||
|
||
import scala.language.experimental.macros | ||
|
||
object auto { | ||
// | ||
// type Typeclass[T] = BSONWriter[T, _ <: BSONValue] | ||
// | ||
// def combine[T](caseClass: CaseClass[Typeclass, T]): Typeclass[T] = | ||
// BSONWriteDerivation.combine(caseClass) | ||
// | ||
// def dispatch[T](sealedTrait: SealedTrait[Typeclass, T]): Typeclass[T] = | ||
// BSONWriteDerivation.dispatch(sealedTrait) | ||
// | ||
// implicit def magnoliaWriter[T]: Typeclass[T] = macro Magnolia.gen[T] | ||
} |
23 changes: 23 additions & 0 deletions
23
src/main/scala/magnolia/bson/derivation/writer/semiauto.scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
package magnolia.bson.derivation.writer | ||
|
||
import magnolia.bson.BSONWriteDerivation | ||
import magnolia.{CaseClass, Magnolia, SealedTrait} | ||
import reactivemongo.bson.{BSONDocument, BSONValue, BSONWriter} | ||
|
||
import scala.language.experimental.macros | ||
|
||
object semiauto { | ||
|
||
// type B <: BSONValue | ||
private type Typeclass[T] = BSONWriteDerivation.Typeclass[T] | ||
// | ||
// val d = new BSONWriteDerivation[B] {} | ||
|
||
def combine[T](caseClass: CaseClass[Typeclass, T]): Typeclass[T] = | ||
BSONWriteDerivation.combine(caseClass) | ||
|
||
def dispatch[T](sealedTrait: SealedTrait[Typeclass, T]): Typeclass[T] = | ||
BSONWriteDerivation.dispatch(sealedTrait) | ||
|
||
def deriveMagnoliaWriter[T]: Typeclass[T] = macro Magnolia.gen[T] | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters