All Downloads are FREE. Search and download functionalities are using the official Maven repository.

muffin.interop.http.zio.ZClient.scala Maven / Gradle / Ivy

There is a newer version: 0.3.0
Show newest version
package muffin.interop.http.zio

import java.nio.charset.Charset

import cats.effect.Sync

import zhttp.http.{Body as ZBody, Headers, Method as ZMethod}
import zhttp.service.{ChannelFactory, Client, EventLoopGroup}
import zio.*

import muffin.codec.*
import muffin.http.*

class ZClient[R, To[_], From[_]](codec: CodecSupport[To, From]) extends HttpClient[RHttp[R], To, From] {

  import codec.given

  def request[In: To, Out: From](
      url: String,
      method: Method,
      body: Body[In],
      headers: Map[String, String],
      params: Params => Params
  ): ZRHttp[R, Out] =
    Client
      .request(
        url + params(Params.Empty).mkString,
        method match {
          case Method.Get    => ZMethod.GET
          case Method.Post   => ZMethod.POST
          case Method.Delete => ZMethod.DELETE
          case Method.Put    => ZMethod.PUT
          case Method.Patch  => ZMethod.PATCH
        },
        Headers(headers.toList),
        content =
          body match {
            case Body.Empty          => ZBody.empty
            case Body.Json(value)    => ZBody.fromString(summon[Encode[In]].apply(value))
            case Body.RawJson(value) => ZBody.fromString(value)
            case Body.Multipart(_)   => throw new Exception("ZIO Backend don't support multipart")
          }
      )
      .flatMap(_.body.asString(Charset.defaultCharset()))
      .flatMap {
        summon[Decode[Out]].apply(_) match {
          case Left(value)  => ZIO.fail(value)
          case Right(value) => ZIO.succeed(value)
        }
      }

}

object ZClient {

  def apply[R, I[_]: Sync, To[_], From[_]](codec: CodecSupport[To, From]): I[ZClient[R, To, From]] =
    Sync[I].delay(
      new ZClient[R, To, From](codec)
    )

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy