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

com.sksamuel.avro4s.decoders.bytes.scala Maven / Gradle / Ivy

package com.sksamuel.avro4s.decoders

import com.sksamuel.avro4s.avroutils.ByteBufferHelper
import com.sksamuel.avro4s.{Avro4sDecodingException, Decoder}
import org.apache.avro.Schema

import java.nio.ByteBuffer

trait ByteDecoders:
  given Decoder[Array[Byte]] = ArrayByteDecoder
  given Decoder[ByteBuffer] = ByteBufferDecoder
  given Decoder[List[Byte]] = ArrayByteDecoder.map(_.toList)
  given Decoder[Seq[Byte]] = ArrayByteDecoder.map(_.toList)
  given Decoder[Vector[Byte]] = ArrayByteDecoder.map(_.toVector)

/**
  * A [[Decoder]] for byte arrays that accepts any compatible type regardless of schema.
  */
object ArrayByteDecoder extends Decoder[Array[Byte]] :
  override def decode(schema: Schema): Any => Array[Byte] = { value =>
    value match {
      case buffer: ByteBuffer => ByteBufferHelper.asArray(buffer)
      case array: Array[Byte] => array
      case fixed: org.apache.avro.generic.GenericFixed => fixed.bytes
      case _ => throw new Avro4sDecodingException(s"ArrayByteDecoder cannot decode '$value'", value)
    }
  }

object ByteBufferDecoder extends Decoder[ByteBuffer] :
  override def decode(schema: Schema): Any => ByteBuffer = { value =>
    value match {
      case buffer: ByteBuffer => buffer
      case array: Array[Byte] => ByteBuffer.wrap(array)
      case fixed: org.apache.avro.generic.GenericFixed => ByteBuffer.wrap(fixed.bytes)
      case _ => throw new Avro4sDecodingException(s"ByteBufferDecoder cannot decode '$value'", value)
    }
  }

/**
  * A Strict [[Decoder]] for byte arays that only works if the schema is FIXED.
  */
object FixedByteArrayDecoder extends Decoder[Array[Byte]] :
  override def decode(schema: Schema): Any => Array[Byte] =
    require(schema.getType == Schema.Type.FIXED, {
      s"Fixed byte array decoder only supports schema type FIXED, got $schema"
    })
    { value =>
      value match {
        case fixed: org.apache.avro.generic.GenericFixed => fixed.bytes
        case _ => throw new Avro4sDecodingException(s"FixedByteArrayDecoder cannot decode '$value'", value)
      }
    }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy