soostone/lib/Soostone/Types.hs

59 lines
1.4 KiB
Haskell

{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Soostone.Types where
import Control.Monad.Catch ( MonadMask, MonadCatch, MonadThrow )
import Control.Monad.Error.Class
import Control.Monad.IO.Class ( MonadIO(..) )
import Control.Monad.Reader.Class ( MonadReader )
import Control.Monad.Trans.Reader (ReaderT)
import Data.Aeson hiding (Key)
import Data.String
import Data.Text ( Text )
import Database.SQLite.Simple
import Database.SQLite.Simple.ToField
import Servant
import Servant.API.Generic
newtype Key = Key Text
deriving (FromHttpApiData, Generic)
instance ToField Key where
toField (Key k) = toField k
instance ToJSON Key where
toEncoding = genericToEncoding defaultOptions
instance FromJSON Key
newtype Count = Count Integer
deriving (Generic, Num)
instance FromRow Count where
fromRow = Count <$> field
instance ToField Count where
toField (Count c) = toField c
instance ToJSON Count where
toEncoding = genericToEncoding defaultOptions
instance FromJSON Count
data AppState = AppState {
sqliteFile :: FilePath
}
newtype AppM a = AppM { runAppM :: ReaderT AppState Handler a }
deriving
( Functor, Applicative, Monad, MonadIO, Generic
, MonadThrow, MonadCatch, MonadMask
, MonadReader AppState
, MonadError ServerError
)
instance MonadFail AppM where
fail str = throwError $ err500 { errBody = fromString str }