packages feed

typesafe-hs-0.1.0.0: src/TypeSafe/Wire/Models.hs

-- | Model metadata preserves release dates verbatim, with an optional day parser.
module TypeSafe.Wire.Models (ModelMetadataList (..), ModelMetadata (..), releaseDay) where

import Data.Aeson
import Data.Text (Text)
import Data.Text qualified as Text
import Data.Time.Calendar (Day)
import Data.Time.Format.ISO8601 (iso8601ParseM)
import Data.Vector (Vector)
import GHC.Generics (Generic)
import TypeSafe.Wire.Common

-- | The available models returned by GET /v1/models, in server-provided order.
data ModelMetadataList = ModelMetadataList
  { models :: !(Vector ModelMetadata)
  }
  deriving stock (Generic, Eq, Show)

instance ToJSON ModelMetadataList where
  toJSON x = object $ [] <> ["models" .= x.models]
  toEncoding x = pairs $ "models" .= x.models

instance FromJSON ModelMetadataList where
  parseJSON = withObject "ModelMetadataList" $ \o -> ModelMetadataList <$> o .: "models"

-- | Model metadata with verbatim release-date text; use releaseDay to parse a day.
data ModelMetadata = ModelMetadata
  { name :: !(ModelName),
    description :: !(Text),
    releaseDate :: !(Text)
  }
  deriving stock (Generic, Eq, Show)

instance ToJSON ModelMetadata where
  toJSON x = object $ [] <> ["name" .= x.name] <> ["description" .= x.description] <> ["release_date" .= x.releaseDate]
  toEncoding x = pairs $ "name" .= x.name <> "description" .= x.description <> "release_date" .= x.releaseDate

instance FromJSON ModelMetadata where
  parseJSON = withObject "ModelMetadata" $ \o -> ModelMetadata <$> o .: "name" <*> o .: "description" <*> o .: "release_date"

-- | Parse YYYY-MM-DD when possible; unusual dates still decode as text (R9).
releaseDay :: ModelMetadata -> Maybe Day
releaseDay m = iso8601ParseM (Text.unpack m.releaseDate)