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

lucuma.odb.json.parallax.scala Maven / Gradle / Ivy

// Copyright (c) 2016-2023 Association of Universities for Research in Astronomy, Inc. (AURA)
// For license information see LICENSE or https://opensource.org/licenses/BSD-3-Clause

package lucuma.odb.json

import cats.syntax.all.*
import io.circe.Decoder
import io.circe.DecodingFailure
import io.circe.Encoder
import io.circe.Json
import io.circe.syntax.*
import lucuma.core.math.Parallax

import java.math.MathContext

object parallax {

  trait DecoderParallax {
    given Decoder[Parallax] =
      Decoder.instance { c =>
        c.downField("microarcseconds")
          .as[Long]
          .map(Parallax.microarcseconds.reverseGet)
          .orElse(c.downField("milliarcseconds").as[BigDecimal].map(Parallax.milliarcseconds.reverseGet))
          .orElse(DecodingFailure("Could not parse parallax", c.history).asLeft)
      }
  }

  object decoder extends DecoderParallax

  trait QueryCodec extends DecoderParallax {

    given Encoder_Parallax: Encoder[Parallax] =
      Encoder.instance { p =>
        Json.obj(
          "microarcseconds" -> p.μas.value.value.asJson,
          "milliarcseconds" -> p.mas.value.toBigDecimal(MathContext.DECIMAL128).asJson
        )
      }
  }

  object query extends QueryCodec

  trait TransportCodec extends DecoderParallax {

    given Encoder_Parallax: Encoder[Parallax] =
      Encoder.instance { p =>
        Json.obj(
          "microarcseconds" -> p.μas.value.value.asJson
        )
      }
  }

  object transport extends TransportCodec
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy