1 {-# LANGUAGE TemplateHaskell, OverloadedStrings, TypeFamilies #-} 2 module Databrary.Model.Format.Types 3 ( Format(..) 4 , unknownFormat 5 ) where 6 7 import qualified Data.ByteString as BS 8 import Data.Function (on) 9 import Data.Int (Int16) 10 import Data.Ord (comparing) 11 import qualified Data.Text as T 12 import Instances.TH.Lift () 13 import Language.Haskell.TH.Lift (deriveLift) 14 15 import Databrary.Has (Has(..)) 16 import Databrary.Model.Kind 17 import Databrary.Model.Id.Types 18 19 type instance IdType Format = Int16 20 21 data Format = Format 22 { formatId :: Id Format 23 , formatMimeType :: BS.ByteString 24 , formatExtension :: [BS.ByteString] -- TODO: nonempty list 25 , formatName :: T.Text 26 } 27 deriving (Show) 28 29 instance Kinded Format where 30 kindOf _ = "format" 31 32 instance Eq Format where 33 (==) = on (==) formatId 34 (/=) = on (/=) formatId 35 36 instance Ord Format where 37 compare = comparing formatId 38 39 -- makeHasRec ''Format ['formatId] 40 instance Has (Id Format) Format where 41 view = formatId 42 43 deriveLift ''Format 44 45 unknownFormat :: Format 46 unknownFormat = Format 47 { formatId = error "unknownFormat" 48 , formatMimeType = "application/octet-stream" 49 , formatExtension = [] 50 , formatName = "Unknown" 51 } 52