diff options
Diffstat (limited to 'src/main/scala/main.scala')
-rw-r--r-- | src/main/scala/main.scala | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/main/scala/main.scala b/src/main/scala/main.scala new file mode 100644 index 0000000..223ac1c --- /dev/null +++ b/src/main/scala/main.scala @@ -0,0 +1,58 @@ +import spray.json._ + +// product type +case class Foo(x: Int) +case class Bar(foo: Foo, str: String) + +// coproduct +sealed trait T +case object A extends T +case class B(a: String) extends T +case class C(x: T) extends T // inception! + +object Main extends App with DefaultJsonProtocol with DerivedFormats { + + println("//////////\nProducts:") + + { + val product = Bar(Foo(42), "hello world") + val js = product.toJson + println(js.prettyPrint) + println(js.convertTo[Bar]) + } + + println("//////////\nCoproducts:") + + { + val coproduct: T = B("hello wordld") //Seq(C(B("What's up?")), B("a"), A) + val js = coproduct.toJson + println(js.prettyPrint) + println(js.convertTo[T]) + } + +} + +/* +A potentital danger: + +Overriding generated formats is possible (see CustomFormats), however it can be +easy to forget to include the custom formats. +=> In that case, the program will still compile, however it won't use the + correct format! + +Possible workarounds? + + - Require explicit format declarations, i.e. remove implicit from `implicit def + gen[T] = macro Magnolia.gen[T]` and add `def myFormat = gen[Foo]` to every + format trait. + => requires manual code, thereby mostly defeats the advantages of automatic derivation + => (advantage, no more code duplication since macro is expanded only once) + + - Avoid custom formats. + => entities become "API objects", which will be hard to upgrade in a backwards-compatible, yet idiomatic way + (E.g. new fields could be made optional so that they won't be required in json, however the business logic + may not require them to be optional. We lose some typesafety.) + => we'd likely have an additional layer of indirection, that will convert "api objects" to "business objects" + implemented by services + => Is that a good or bad thing? +*/ |