1 {-# LANGUAGE TemplateHaskell, OverloadedStrings, DeriveDataTypeable, DataKinds #-}
    2 {-# OPTIONS_GHC -fno-warn-orphans #-}
    3 module Databrary.Model.Release.Types
    4   ( Release(..)
    5   , EffectiveRelease(..)
    6   ) where
    7 
    8 import Data.Foldable (fold)
    9 import Language.Haskell.TH.Lift (deriveLift)
   10 import qualified Data.Typeable.Internal
   11 import qualified GHC.Arr
   12 import qualified Database.PostgreSQL.Typed.Types
   13 import qualified Database.PostgreSQL.Typed.Dynamic
   14 import qualified Database.PostgreSQL.Typed.Enum
   15 import qualified Data.Aeson.Types
   16 import qualified Data.ByteString
   17 import qualified Data.ByteString.Char8
   18 
   19 import Databrary.Has (Has(..))
   20 import Databrary.Model.Enum
   21 import qualified Databrary.Model.Kind
   22 import qualified Databrary.HTTP.Form.Deform
   23 
   24 -- makeDBEnum "release" "Release"
   25 -- TODO: db coherence
   26 data Release
   27     = ReleasePRIVATE | ReleaseSHARED | ReleaseEXCERPTS | ReleasePUBLIC
   28           deriving (Eq,
   29                     Ord,
   30                     Enum,
   31                     GHC.Arr.Ix,
   32                     Bounded,
   33                     Data.Typeable.Internal.Typeable)
   34 instance Show Release where
   35   show ReleasePRIVATE = "PRIVATE"
   36   show ReleaseSHARED = "SHARED"
   37   show ReleaseEXCERPTS = "EXCERPTS"
   38   show ReleasePUBLIC = "PUBLIC"
   39 instance Database.PostgreSQL.Typed.Types.PGType "release"
   40 instance Database.PostgreSQL.Typed.Types.PGParameter "release" Release where
   41   pgEncode _ ReleasePRIVATE
   42     = Data.ByteString.pack [80, 82, 73, 86, 65, 84, 69]
   43   pgEncode _ ReleaseSHARED
   44     = Data.ByteString.pack [83, 72, 65, 82, 69, 68]
   45   pgEncode _ ReleaseEXCERPTS
   46     = Data.ByteString.pack [69, 88, 67, 69, 82, 80, 84, 83]
   47   pgEncode _ ReleasePUBLIC
   48     = Data.ByteString.pack [80, 85, 66, 76, 73, 67]
   49 instance Database.PostgreSQL.Typed.Types.PGColumn "release" Release where
   50   pgDecode _ x_a2Skv
   51     = case Data.ByteString.unpack x_a2Skv of
   52         [80, 82, 73, 86, 65, 84, 69] -> ReleasePRIVATE
   53         [83, 72, 65, 82, 69, 68] -> ReleaseSHARED
   54         [69, 88, 67, 69, 82, 80, 84, 83] -> ReleaseEXCERPTS
   55         [80, 85, 66, 76, 73, 67] -> ReleasePUBLIC
   56         _ -> error
   57                ("pgDecode release: " ++ (Data.ByteString.Char8.unpack x_a2Skv))
   58 instance Database.PostgreSQL.Typed.Dynamic.PGRep "release" Release
   59 instance Database.PostgreSQL.Typed.Enum.PGEnum Release
   60 instance Databrary.Model.Kind.Kinded Release where
   61   kindOf _ = "release"
   62 instance DBEnum Release
   63 instance Data.Aeson.Types.ToJSON Release where
   64   toJSON
   65     = (Data.Aeson.Types.toJSON . fromEnum)
   66 instance Data.Aeson.Types.FromJSON Release where
   67   parseJSON = parseJSONEnum
   68 instance Databrary.HTTP.Form.Deform.Deform f_a2Skw Release where
   69   deform = enumForm
   70 
   71 instance Monoid Release where
   72   mempty = ReleasePRIVATE
   73   mappend = max
   74 
   75 instance Has Release (Maybe Release) where
   76   view = fold
   77 
   78 deriveLift ''Release
   79 
   80 data EffectiveRelease =
   81        EffectiveRelease {
   82            effRelPublic :: !Release
   83          , effRelPrivate :: !Release
   84          } -- deriving (Eq, Show)