Rohan Sircar
3 years ago
11 changed files with 115 additions and 146 deletions
-
2.github/workflows/ci.yaml
-
3build.sbt
-
47src/main/scala/wow/doge/http4sdemo/Jokes.scala
-
28src/main/scala/wow/doge/http4sdemo/Main.scala
-
34src/main/scala/wow/doge/http4sdemo/Server.scala
-
4src/main/scala/wow/doge/http4sdemo/SlickResource.scala
-
1src/main/scala/wow/doge/http4sdemo/dto/Library.scala
-
16src/main/scala/wow/doge/http4sdemo/implicits/package.scala
-
81src/main/scala/wow/doge/http4sdemo/routes/LibraryRoutes.scala
-
18src/main/scala/wow/doge/http4sdemo/services/LibraryService.scala
-
27src/test/scala/wow/doge/http4sdemo/LibraryControllerSpec.scala
@ -1,47 +0,0 @@ |
|||
package wow.doge.http4sdemo |
|||
|
|||
import cats.Applicative |
|||
import cats.effect.Sync |
|||
import cats.implicits._ |
|||
import io.circe.Decoder |
|||
import io.circe.Encoder |
|||
import io.circe.generic.semiauto._ |
|||
import monix.bio.Task |
|||
import org.http4s.Method._ |
|||
import org.http4s._ |
|||
import org.http4s.circe._ |
|||
import org.http4s.client.Client |
|||
import org.http4s.client.dsl.Http4sClientDsl |
|||
import org.http4s.implicits._ |
|||
|
|||
sealed trait Jokes[F[_]] { |
|||
def get: F[Jokes.Joke] |
|||
} |
|||
|
|||
object Jokes { |
|||
def apply[F[_]](implicit ev: Jokes[F]): Jokes[F] = ev |
|||
|
|||
final case class Joke(joke: String) |
|||
object Joke { |
|||
implicit val jokeDecoder: Decoder[Joke] = deriveDecoder[Joke] |
|||
implicit def jokeEntityDecoder[F[_]: Sync]: EntityDecoder[F, Joke] = |
|||
jsonOf |
|||
implicit val jokeEncoder: Encoder[Joke] = deriveEncoder[Joke] |
|||
implicit def jokeEntityEncoder[F[_]: Applicative]: EntityEncoder[F, Joke] = |
|||
jsonEncoderOf |
|||
} |
|||
|
|||
final case class JokeError(e: Throwable) extends RuntimeException |
|||
|
|||
def impl(C: Client[Task]): Jokes[Task] = new Jokes[Task] { |
|||
val dsl = new Http4sClientDsl[Task] {} |
|||
import dsl._ |
|||
def get: Task[Jokes.Joke] = { |
|||
C.expect[Joke](GET(uri"https://icanhazdadjoke.com/")) |
|||
.adaptError { case t => |
|||
JokeError(t) |
|||
} // Prevent Client Json Decoding Failure Leaking |
|||
} |
|||
} |
|||
|
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue