packages feed

zuul-0.1.0.0: src/Zuul/Project.hs

{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}

module Zuul.Project (Project (..), ProjectType (..)) where

import Data.Aeson (FromJSON (..), ToJSON (..), Value (String))
import Data.Aeson.Types (prependFailure, typeMismatch)
import Data.Text (Text)
import GHC.Generics (Generic)
import Zuul.Aeson (zuulParseJSON, zuulToJSON)

data ProjectType = ProjectConfig | ProjectUntrusted
  deriving (Show, Eq, Ord, Generic)

data Project = Project
  { projectName :: Text,
    projectType :: ProjectType,
    projectCanonicalName :: Text,
    projectConnectionName :: Text
  }
  deriving (Show, Eq, Ord, Generic)

instance ToJSON ProjectType where
  toJSON v = case v of
    ProjectConfig -> "config"
    ProjectUntrusted -> "untrusted"

instance FromJSON ProjectType where
  parseJSON (String s) = pure $ case s of
    "config" -> ProjectConfig
    "untrusted" -> ProjectUntrusted
    _ -> error "Received unrecognized ProjectType"
  parseJSON invalid =
    prependFailure
      "parsing ProjectType failed, "
      (typeMismatch "String" invalid)

instance ToJSON Project where
  toJSON = zuulToJSON "project"

instance FromJSON Project where
  parseJSON = zuulParseJSON "project"