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
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]
|
|
}
|
|
}
|