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)