Skip to content

Commit

Permalink
Add ProposalAttachmentType dynamic enum.
Browse files Browse the repository at this point in the history
  • Loading branch information
toddburnside committed Dec 11, 2023
1 parent 6390b3c commit d781d3c
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 32 deletions.
2 changes: 1 addition & 1 deletion build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ val munitCatsEffectVersion = "1.0.7"
val lucumaCoreVersion = "0.88.2"
val lucumaODBSchema = "0.7.0"

ThisBuild / tlBaseVersion := "0.65"
ThisBuild / tlBaseVersion := "0.66"
ThisBuild / tlCiReleaseBranches := Seq("main")
ThisBuild / crossScalaVersions := Seq("3.3.1")
ThisBuild / tlVersionIntroduced := Map("3" -> "0.29.0")
Expand Down
64 changes: 34 additions & 30 deletions lucuma-schemas/src/clue/scala/lucuma/schemas/ObservationDB.scala
Original file line number Diff line number Diff line change
Expand Up @@ -20,41 +20,44 @@ import lucuma.core.math.BrightnessUnits._
trait ObservationDB {
object Scalars {
// Ids
type AtomId = Atom.Id
type ExecutionEventId = ExecutionEvent.Id
type GroupId = Group.Id
type ObsAttachmentId = ObsAttachment.Id
type ObservationId = Observation.Id
type ProgramId = Program.Id
type StepId = Step.Id
type DatasetId = Dataset.Id
type TargetId = Target.Id
type UserId = User.Id
type VisitId = Visit.Id
type AtomId = Atom.Id
type ExecutionEventId = ExecutionEvent.Id
type GroupId = Group.Id
type ObsAttachmentId = ObsAttachment.Id
type ObservationId = Observation.Id
type ProgramId = Program.Id
type StepId = Step.Id
type DatasetId = Dataset.Id
type TargetId = Target.Id
type UserId = User.Id
type VisitId = Visit.Id
// Basic types
type BigDecimal = scala.BigDecimal
type Long = scala.Long
type BigDecimal = scala.BigDecimal
type Long = scala.Long
// Formatted strings
type DatasetFilename = String
type DmsString = String
type EpochString = String
type HmsString = String
type DatasetFilename = String
type DmsString = String
type EpochString = String
type HmsString = String
// Refined
type Extinction = NonNegBigDecimal // """Non-negative floating-point value."""
type NonEmptyString = eu.timepit.refined.types.string.NonEmptyString
type NonNegBigDecimal = eu.timepit.refined.types.numeric.NonNegBigDecimal
type NonNegInt = eu.timepit.refined.types.numeric.NonNegInt
type NonNegLong = eu.timepit.refined.types.numeric.NonNegLong
type NonNegShort = eu.timepit.refined.types.numeric.NonNegShort
type PosBigDecimal = eu.timepit.refined.types.numeric.PosBigDecimal
type PosInt = eu.timepit.refined.types.numeric.PosInt
type PosLong = eu.timepit.refined.types.numeric.PosLong
type PosShort = eu.timepit.refined.types.numeric.PosShort
type Extinction = NonNegBigDecimal // """Non-negative floating-point value."""
type NonEmptyString = eu.timepit.refined.types.string.NonEmptyString
type NonNegBigDecimal = eu.timepit.refined.types.numeric.NonNegBigDecimal
type NonNegInt = eu.timepit.refined.types.numeric.NonNegInt
type NonNegLong = eu.timepit.refined.types.numeric.NonNegLong
type NonNegShort = eu.timepit.refined.types.numeric.NonNegShort
type PosBigDecimal = eu.timepit.refined.types.numeric.PosBigDecimal
type PosInt = eu.timepit.refined.types.numeric.PosInt
type PosLong = eu.timepit.refined.types.numeric.PosLong
type PosShort = eu.timepit.refined.types.numeric.PosShort
// Core Types
type SignalToNoise = lucuma.core.math.SignalToNoise
type Timestamp = lucuma.core.util.Timestamp
type SignalToNoise = lucuma.core.math.SignalToNoise
type Timestamp = lucuma.core.util.Timestamp
// Enum Meta
type ObsAttachmentTypeMeta = lucuma.schemas.enums.ObsAttachmentType
// These mappings cannot be used, because the decoder is for the
// Enumerated instances, but this prevents a spurious codec from being generated.
type ObsAttachmentTypeMeta = lucuma.schemas.enums.ObsAttachmentType
type ProposalAttachmentTypeMeta = lucuma.schemas.enums.ProposalAttachmentType
}

object Enums {
Expand Down Expand Up @@ -113,6 +116,7 @@ trait ObservationDB {
type Partner = model.Partner
type PlanetSpectrum = enums.PlanetSpectrum
type PlanetaryNebulaSpectrum = enums.PlanetaryNebulaSpectrum
type ProposalAttachmentType = lucuma.schemas.enums.ProposalAttachmentType
type QuasarSpectrum = enums.QuasarSpectrum
type ScienceMode = enums.ScienceMode
type SequenceCommand = enums.SequenceCommand
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import cats.Eq
import cats.derived.*
import io.circe.*
import io.circe.generic.semiauto
import io.circe.generic.semiauto.*
import lucuma.core.util.Display
import lucuma.core.util.Enumerated
import lucuma.core.util.NewType
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
// 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.schemas.enums

import cats.Eq
import cats.derived.*
import io.circe.*
import io.circe.generic.semiauto
import lucuma.core.util.Display
import lucuma.core.util.Enumerated
import monocle.Focus
import monocle.Lens

case class ProposalAttachmentType(
tag: String,
shortName: String,
longName: String
) derives Eq:
val accept: String = ".pdf" // only PDF files are currently allowed

object ProposalAttachmentType:
given Display[ProposalAttachmentType] = Display.by(_.shortName, _.longName)

val tag: Lens[ProposalAttachmentType, String] = Focus[ProposalAttachmentType](_.tag)
val shortName: Lens[ProposalAttachmentType, String] = Focus[ProposalAttachmentType](_.shortName)
val longName: Lens[ProposalAttachmentType, String] = Focus[ProposalAttachmentType](_.longName)

val values: List[ProposalAttachmentType] =
// This is a meta decoder, not a decoder for enum instances (which comes from the `Enumerated` instance)
given Decoder[ProposalAttachmentType] = semiauto.deriveDecoder

DynamicEnums.parsedEnums
.downField("proposalAttachmentTypeMeta")
.as[List[ProposalAttachmentType]] match
case Left(err) => err.printStackTrace; throw err
case Right(json) => json

// The givens are apparently (probably) constructed lazily.
// See https://alexn.org/blog/2022/05/11/implicit-vs-scala-3-given/
// We want to fail immediately if there is a problem, so we'll reference
// the enumerated givens here.
Enumerated[ProposalAttachmentType]

given Enumerated[ProposalAttachmentType] =
Enumerated.from(values.head, values.tail: _*).withTag(_.tag)

0 comments on commit d781d3c

Please sign in to comment.