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

package wow.doge.http4sdemo
import cats.Applicative
import cats.implicits._
import io.circe.Encoder
import io.circe.Json
import monix.bio.Task
import org.http4s.EntityEncoder
import org.http4s.circe._
trait HelloWorld[F[_]] {
def hello(n: HelloWorld.Name): F[HelloWorld.Greeting]
}
object HelloWorld {
implicit def apply[F[_]](implicit ev: HelloWorld[F]): HelloWorld[F] = ev
final case class Name(name: String) extends AnyVal
/** More generally you will want to decouple your edge representations from
* your internal data structures, however this shows how you can
* create encoders for your data.
*/
final case class Greeting(greeting: String) extends AnyVal
object Greeting {
implicit val greetingEncoder: Encoder[Greeting] = new Encoder[Greeting] {
final def apply(a: Greeting): Json = Json.obj(
("message", Json.fromString(a.greeting))
)
}
implicit def greetingEntityEncoder[F[_]: Applicative]
: EntityEncoder[F, Greeting] =
jsonEncoderOf[F, Greeting]
}
def impl: HelloWorld[Task] = new HelloWorld[Task] {
def hello(n: HelloWorld.Name): Task[HelloWorld.Greeting] =
Greeting("Hello, " + n.name).pure[Task]
}
}