Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
18 changes: 1 addition & 17 deletions docs/src/main/tut/04_library_scala.md
Original file line number Diff line number Diff line change
Expand Up @@ -153,9 +153,6 @@ import org.apache.spark.SparkContext
case class Foo(a: Int, b: String)

object ComplexRootArgFn extends MistFn {

implicit val fooExt: RootExtractor[Foo] = encoding.generic.extractor[Foo]

// expected input is json:
// {
// "a": 42,
Expand Down Expand Up @@ -296,6 +293,7 @@ It supports:
- Unit
- primitives: Short, Int, Long, Float, String, Double, Boolean
- collections: Array, Seq, Map
- Case classes
- experimental: DataFrame, DataSet - *Warning* - return them only if you sure that they are small, otherwise it will lead to `OutOfMemory`
```scala
import mist.api.encoding.spark._
Expand Down Expand Up @@ -331,20 +329,6 @@ class Foo(val a: Int, val b: String)
val fooEnc: JsEncoder[Foo] = JsEncoder(foo => JsMap("a" -> foo.a.js, "b" -> foo.b.js))
```

Also it's possible to automatically derive an encoder for case classes:
```tut:silent
import mist.api._
import mist.api.encoding
import mist.api.encoding._
import mist.api.encoding.defaults._

case class Bar(a: Int, b: String)
case class Foo(x: Int, foos: Seq[Bar])

implicit val barEnc: JsEncoder[Bar] = encoding.generic.encoder[Bar]
implicit val fooEnc: JsEncoder[Foo] = encoding.generic.encoder[Foo]
```

#### Validation

For example for calculating pi using dartboard method n should be at least positive number.
Expand Down
3 changes: 3 additions & 0 deletions mist-lib/src/main/scala/mist/api/encoding/JsEncoder.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package mist.api.encoding

import mist.api.data._
import shadedshapeless.Lazy

import scala.annotation.implicitNotFound

Expand Down Expand Up @@ -36,6 +37,8 @@ trait defaultEncoders {
case None => JsNull
}
implicit def mapEnc[A](implicit enc: JsEncoder[A]): JsEncoder[Map[String, A]] = JsEncoder(m => JsMap(m.mapValues(enc.apply)))

implicit def productEnc[A <: Product](implicit enc: Lazy[ObjectEncoder[A]]): JsEncoder[A] = JsEncoder(enc.value.apply)
}

object defaultEncoders extends defaultEncoders
7 changes: 7 additions & 0 deletions mist-lib/src/main/scala/mist/api/encoding/JsExtractor.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package mist.api.encoding

import mist.api._
import mist.api.data._
import shadedshapeless.Lazy

import scala.annotation.implicitNotFound
import scala.reflect.ClassTag
Expand Down Expand Up @@ -134,6 +135,12 @@ trait defaultExtractors {

case value => Failed.invalidType(s"Map[String, ${ext.`type`}]", value.toString)
}

implicit def productExtWithDefaults[A <: Product](implicit
ext: Lazy[ObjectExtractor[A]],
patcher: Lazy[DefaultsPatcher[A]]
): RootExtractor[A] =
RootExtractor[A](ext.value.`type`)(js => ext.value.apply(patcher.value.apply(js)))
}


Expand Down