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

com.github.mvv.sredded.Structured.scala Maven / Gradle / Ivy

package com.github.mvv.sredded

import java.time.Instant
import java.util.Date

import scala.language.{higherKinds, implicitConversions}

trait Structured[A] {
  def apply(value: A): StructValue
}

trait StructuredLowest {
  implicit def iterableStructured[A: Structured, S[_]](implicit witness: S[A] <:< Iterable[A]): Structured[S[A]] = {
    values => StructValue.Sequence(witness(values).map(Structured(_)))
  }
}

trait StructuredLow extends StructuredLowest {
  implicit def mappingStructured[A: StructuredMapping]: Structured[A] = { value => StructuredMapping(value) }
}

object Structured extends StructuredLow {
  def apply[A: Structured](value: A): StructValue = implicitly[Structured[A]].apply(value)

  implicit val structValueStructured: Structured[StructValue] = { value => value }
  implicit val structValueSequenceStructured: Structured[StructValue.Sequence] = { value => value }
  implicit val structValueMappingStructured: Structured[StructValue.Mapping] = { value => value }
  implicit val booleanStructured: Structured[Boolean] = { value => StructValue.Boolean(value) }
  implicit val byteStructured: Structured[Byte] = { value => StructValue.Int8(value) }
  implicit val shortStructured: Structured[Short] = { value => StructValue.Int16(value) }
  implicit val intStructured: Structured[Int] = { value => StructValue.Int32(value) }
  implicit val longStructured: Structured[Long] = { value => StructValue.Int64(value) }
  implicit val dateStructured: Structured[Date] = { value => StructValue.Timestamp64(value.getTime) }
  implicit val instantStructured: Structured[Instant] = { value =>
    StructValue.Timestamp.unsafe(value.getEpochSecond, value.getNano)
  }
  implicit val floatStructured: Structured[Float] = { value => StructValue.Float32(value) }
  implicit val doubleStructured: Structured[Double] = { value => StructValue.Float64(value) }
  implicit val bigIntegerStructured: Structured[java.math.BigInteger] = { value => StructValue.BigInt(value) }
  implicit val bigIntStructured: Structured[BigInt] = { value => Structured(value.bigInteger) }
  implicit val bigDecimalStructured: Structured[java.math.BigDecimal] = { value =>
    StructValue.BigNum(value.unscaledValue, java.math.BigInteger.valueOf(value.scale))
  }
  implicit val bigDecStructured: Structured[BigDecimal] = { value => Structured(value.bigDecimal) }
  implicit val stringStructured: Structured[String] = { value => StructValue.String(value) }
  implicit val byteArrayStructured: Structured[Array[Byte]] = { value => StructValue.Binary(Iterable(value)) }
  implicit def optionStructured[A: Structured]: Structured[Option[A]] = {
    case Some(value) => Structured(value)
    case None        => StructValue.Null
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy