package com.nodeta.scalandra.serializer

/**
 * Interface for serializers.
 *
 * These are used to serialize and deserialize data going to and coming from
 * cassandra.
 *
 * @author Ville Lautanala
 */
trait Serializer[T] {
  /**
   * Serialize value to byte array
   */ 
  def serialize(t : T) : Array[Byte]

  /**
   * Deserialize value from byte array
   */
  def deserialize(a : Array[Byte]) : T

  def apply(t : T) : Array[Byte] = serialize(t)
  def unapply(a : Array[Byte]) : Option[T] = Some(deserialize(a))

  /**
   * Empty collection for serializer
   *
   * @return Empty byte array or a value representing smallest
   * possible value
   */
  def empty() : Array[Byte] = "".getBytes

  def << (t : T) : Array[Byte] = serialize(t)
  def >> (t : Array[Byte]) : T = deserialize(t)
}

/**
 * This serializer is used when raw data is handled. It does nothing to data.
 */
object NonSerializer extends Serializer[Array[Byte]] {
  def serialize(a : Array[Byte]) = a
  def deserialize(a : Array[Byte]) = a
}