{-# 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 }