packages feed

nbparts-0.1.0.0: src/Nbparts/Types/Manifest.hs

module Nbparts.Types.Manifest
  ( currentNbpartsVersion,
    Manifest (..),
    Format (..),
    defManifest,
    formatExtension,
  )
where

import Data.Aeson (Options (constructorTagModifier))
import Data.Aeson qualified as Aeson
import Data.Version (Version)
import GHC.Generics (Generic)
import Paths_nbparts qualified

currentNbpartsVersion :: Version
currentNbpartsVersion = Paths_nbparts.version

data Manifest = Manifest
  { nbpartsVersion :: Version,
    sourcesFormat :: Format,
    metadataFormat :: Format,
    outputsFormat :: Format
  }
  deriving (Generic, Show, Eq, Ord)

defManifest :: Manifest
defManifest =
  Manifest
    { nbpartsVersion = currentNbpartsVersion,
      sourcesFormat = FormatYaml,
      metadataFormat = FormatYaml,
      outputsFormat = FormatYaml
    }

data Format
  = FormatYaml
  | FormatJson
  | FormatMarkdown
  deriving (Generic, Show, Eq, Ord)

formatExtension :: Format -> String
formatExtension FormatYaml = "yaml"
formatExtension FormatJson = "json"
formatExtension FormatMarkdown = "md"

instance Aeson.ToJSON Manifest where
  toJSON = Aeson.genericToJSON jsonOptions

instance Aeson.FromJSON Manifest where
  parseJSON = Aeson.genericParseJSON jsonOptions

instance Aeson.ToJSON Format where
  toJSON = Aeson.genericToJSON jsonOptions

instance Aeson.FromJSON Format where
  parseJSON = Aeson.genericParseJSON jsonOptions

jsonOptions :: Aeson.Options
jsonOptions =
  Aeson.defaultOptions
    { constructorTagModifier = \case
        "FormatYaml" -> "yaml"
        "FormatMarkdown" -> "markdown"
        other -> other
    }