Skip to content

Instantly share code, notes, and snippets.

@fanf
Last active January 6, 2016 15:18
Show Gist options
  • Save fanf/496509318b32968fbc7e to your computer and use it in GitHub Desktop.
Save fanf/496509318b32968fbc7e to your computer and use it in GitHub Desktop.
Implicit resolution error with Rapture
name := "demo"
version := "0.1"
scalaVersion := "2.11.7"
resolvers += "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/"
resolvers += "Sonatype OSS Snapshots" at "http://oss.sonatype.org/content/repositories/snapshots/"
libraryDependencies ++= Seq(
"com.propensive" %% "rapture-core" % "2.0.0-M1"
, "com.propensive" %% "rapture-io" % "2.0.0-M1"
, "com.propensive" %% "rapture-uri" % "2.0.0-M1"
, "com.propensive" %% "rapture-net" % "2.0.0-M1"
, "com.propensive" %% "rapture-json" % "2.0.0-M1"
, "com.propensive" %% "rapture-json-jackson" % "2.0.0-M1"
, "com.propensive" %% "rapture-fs" % "2.0.0-M1"
// utilities
, "com.typesafe.scala-logging" %% "scala-logging" % "3.1.0"
, "joda-time" % "joda-time" % "2.9.1"
, "org.joda" % "joda-convert" % "1.2"
// test
, "junit" % "junit" % "4.12" //to get the "RunWith" annotation
, "org.specs2" %% "specs2-core" % "3.6.5" % "test"
, "org.specs2" %% "specs2-junit" % "3.6.5" % "test"
)
scalacOptions += "-deprecation"
package fanf
import rapture.core._
import rapture.core.timeSystems.numeric
import rapture.io._
import rapture.net._
import rapture.json._
import rapture.uri._
import rapture.codec.encodings.`UTF-8`._
import rapture.json.jsonBackends.jackson._
object TestApi {
import TestData._
val base = "https://some/api/"
trait User {
def help: String
def userGet(page: String) = {
val url = base + "/user" + page
implicit val httpTimeout = 500L
val res = Http.parse(url).httpGet()
val content = res.slurp[Char]
Json.parse(content)
}
}
object UserInfo extends User {
import MyExtractor._
//adding that import, which import a "mode" requested afterward,
//does not change anything
//import modes.throwExceptions._
val help = "Get general information about the user"
// This method does not compile with the following messages:
//- cannot extract type Vector[fanf.TestData.Item] from rapture.json.Json
// (this is coming from https://github.com/propensive/rapture-data/blob/master/src/extractors.scala#L109 )
//- not enough arguments for method as: (implicit ext: rapture.data.Extractor[Vector[fanf.TestData.Item],rapture.json.Json], implicit
// mode: rapture.core.Mode[rapture.data.Data#as])mode.Wrap[Vector[fanf.TestData.Item],ext.Throws]. Unspecified value parameters ext, mode.
def shouldWork = userGet("/items").as[Vector[Item]]
// passing argument explicitly works
def explicitArgumentsOK = userGet("/items").as[Vector[Json]].map(
_.as[Item](itemExtractor, modes.throwExceptions.apply())
)
}
}
object TestData {
final case class Item(
uuid: String
, amount: Double
//this is the faulty part, with for ex String in place of
//Status, "shouldWork" method compiles
, status: Status
)
sealed trait Status
case object Delivered extends Status
}
object MyExtractor {
import TestData._
implicit val itemExtractor = Json.extractor[Json].map { json =>
Item(
json.uuid.as[String]
, json.amount.as[Double]
, Delivered
)
}
}
@fanf
Copy link
Author

fanf commented Jan 4, 2016

So, the problem is that I can't use rapture Json custom extractor with a case classe which happens to have a case classe as one of its values.

The solution I found is to put the different objects TestApi, TestData and MyExtractor in 3 files. Of course, that does not teach me what is wrong here. Something with the order of declaration of things ? Some scoping ? Anybody having clues is welcome to share them :)

@fanf
Copy link
Author

fanf commented Jan 6, 2016

As requested by Jon Pretty, I opened an issue on that subject: propensive/rapture#40

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment