You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

40 lines
1.2 KiB

3 years ago
  1. package wow.doge.http4sdemo
  2. import cats.Applicative
  3. import cats.implicits._
  4. import io.circe.Encoder
  5. import io.circe.Json
  6. import monix.bio.Task
  7. import org.http4s.EntityEncoder
  8. import org.http4s.circe._
  9. trait HelloWorld[F[_]] {
  10. def hello(n: HelloWorld.Name): F[HelloWorld.Greeting]
  11. }
  12. object HelloWorld {
  13. implicit def apply[F[_]](implicit ev: HelloWorld[F]): HelloWorld[F] = ev
  14. final case class Name(name: String) extends AnyVal
  15. /** More generally you will want to decouple your edge representations from
  16. * your internal data structures, however this shows how you can
  17. * create encoders for your data.
  18. */
  19. final case class Greeting(greeting: String) extends AnyVal
  20. object Greeting {
  21. implicit val greetingEncoder: Encoder[Greeting] = new Encoder[Greeting] {
  22. final def apply(a: Greeting): Json = Json.obj(
  23. ("message", Json.fromString(a.greeting))
  24. )
  25. }
  26. implicit def greetingEntityEncoder[F[_]: Applicative]
  27. : EntityEncoder[F, Greeting] =
  28. jsonEncoderOf[F, Greeting]
  29. }
  30. def impl: HelloWorld[Task] = new HelloWorld[Task] {
  31. def hello(n: HelloWorld.Name): Task[HelloWorld.Greeting] =
  32. Greeting("Hello, " + n.name).pure[Task]
  33. }
  34. }