packages feed

hercules-ci-api-agent-0.3.0.0: src/Hercules/Formats/CachixCache.hs

module Hercules.Formats.CachixCache where

import Data.Aeson
import Data.Foldable
import Data.Text (Text)
import Hercules.Formats.Common
  ( noVersion,
    withKind,
    withVersions,
  )
import Prelude

-- | Credentials and keys for a cache.
data CachixCache = CachixCache
  { signingKeys :: [Text],
    authToken :: Maybe Text,
    publicKeys :: [Text]
  }

instance ToJSON CachixCache where
  toJSON a =
    object $
      ["kind" .= String "CachixCache", "signingKeys" .= signingKeys a]
        <> foldMap (pure . ("authToken" .=)) (toList $ authToken a)
        <> ["publicKeys" .= publicKeys a]

  toEncoding a =
    pairs
      ( "kind"
          .= String "CachixCache"
          <> "signingKeys"
          .= signingKeys a
          <> foldMap ("authToken" .=) (authToken a)
          <> "publicKeys"
          .= publicKeys a
      )

instance FromJSON CachixCache where
  parseJSON =
    withKind "CachixCache" $
      withVersions
        [ noVersion $ \o ->
            CachixCache
              <$> (fold <$> o .:? "signingKeys")
              <*> o
              .:? "authToken"
              <*> o
              .: "publicKeys"
        ]