Update codecs handout with TA feedback

This commit is contained in:
Timothée Floure 2019-11-27 18:00:28 +01:00
parent b22f0c4bfb
commit 715509a1b2
3 changed files with 13 additions and 10 deletions

View File

@ -12,3 +12,5 @@ libraryDependencies ++= Seq(
)
testOptions in Test += Tests.Argument(TestFrameworks.JUnit, "-a", "-v", "-s")
initialCommands in console := """import codecs.{_, given}"""

View File

@ -256,10 +256,10 @@ object Main {
val maybeJsonObj = parseJson(""" { "name": "Alice", "age": 42 } """)
val maybeJsonObj2 = parseJson(""" { "name": "Alice", "age": "42" } """)
// Uncomment the following lines as you progress in the assignment
// println(maybeJsonString.toOption.flatMap(_.decodeAs[Int]))
// println(maybeJsonString.toOption.flatMap(_.decodeAs[String]))
// println(maybeJsonObj.toOption.flatMap(_.decodeAs[Person]))
// println(maybeJsonObj2.toOption.flatMap(_.decodeAs[Person]))
// println(maybeJsonString.flatMap(_.decodeAs[Int]))
// println(maybeJsonString.flatMap(_.decodeAs[String]))
// println(maybeJsonObj.flatMap(_.decodeAs[Person]))
// println(maybeJsonObj2.flatMap(_.decodeAs[Person]))
// println(renderJson(Person("Bob", 66)))
}

View File

@ -8,20 +8,21 @@ import scala.util.Try
// render values to `String` JSON blobs
/**
* Parse a JSON document contained in a `String` value into a `Json` value
* Parse a JSON document contained in a `String` value into a `Json` value, returns
* `None` in case the supplied `s` value is not a valid JSON document.
*/
def parseJson(s: String): Try[Json] = Parser.parseFromString[Json](s)
def parseJson(s: String): Option[Json] = Parser.parseFromString[Json](s).toOption
/**
* Parse the JSON value from the supplied `s` parameter, and then try to decode
* it as a value of type `A` using the given `decoder`.
*
* Returns a failure if JSON parsing failed, or if decoding failed.
* Returns `None` if JSON parsing failed, or if decoding failed.
*/
def parseAndDecode[A](s: String)(given decoder: Decoder[A]): Try[A] =
def parseAndDecode[A](s: String)(given decoder: Decoder[A]): Option[A] =
for {
json <- parseJson(s)
a <- decoder.decode(json).toRight(new Exception("Decoding failed")).toTry
json <- parseJson(s)
a <- decoder.decode(json)
} yield a
/**