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

nl.vroste.zio.kinesis.client.serde.Serde.scala Maven / Gradle / Ivy

The newest version!
package nl.vroste.zio.kinesis.client.serde

import zio.{ Chunk, RIO }

import scala.util.Try

/**
 * A serializer and deserializer for values of type T
 *
 * @tparam R
 *   Environment available to the deserializer
 * @tparam T
 *   Value type
 */
trait Serde[-R, T] extends Deserializer[R, T] with Serializer[R, T] {

  /**
   * Converts to a Serde of type U with pure transformations
   */
  def inmap[U](f: T => U)(g: U => T): Serde[R, U] =
    Serde(map(f))(contramap(g))

  /**
   * Convert to a Serde of type U with effectful transformations
   */
  def inmapM[R1 <: R, U](f: T => RIO[R1, U])(g: U => RIO[R1, T]): Serde[R1, U] =
    Serde(mapM(f))(contramapM(g))
}

object Serde extends Serdes {

  /**
   * Create a Serde from a deserializer and serializer function
   *
   * The (de)serializer functions can returned a failure ZIO with a Throwable to indicate (de)serialization failure
   */
  def apply[R, T](
    deser: Chunk[Byte] => RIO[R, T]
  )(ser: T => RIO[R, Chunk[Byte]]): Serde[R, T] =
    new Serde[R, T] {
      override def serialize(value: T): RIO[R, Chunk[Byte]]  =
        ser(value)
      override def deserialize(data: Chunk[Byte]): RIO[R, T] =
        deser(data)
    }

  /**
   * Create a Serde from a deserializer and serializer function
   */
  def apply[R, T](deser: Deserializer[R, T])(ser: Serializer[R, T]): Serde[R, T] =
    new Serde[R, T] {
      override def serialize(value: T): RIO[R, Chunk[Byte]]  =
        ser.serialize(value)
      override def deserialize(data: Chunk[Byte]): RIO[R, T] =
        deser.deserialize(data)
    }

  implicit def deserializerWithError[R, T](implicit deser: Deserializer[R, T]): Deserializer[R, Try[T]] =
    deser.asTry
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy