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