{-| Module : Resources.Paused Description : Copyright : (c) Alexander Vieth, 2015 Licence : BSD3 Maintainer : aovieth@gmail.com Stability : experimental Portability : non-portable (GHC only) -} {-# LANGUAGE AutoDeriveTypeable #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE GADTs #-} module Resources.Pause ( resource ) where import GHC.Generics import Data.Typeable import Control.Monad.Trans.Class import Control.Monad.Trans.Reader import Control.Monad.Trans.Except import Control.Monad.State.Class as SC import qualified Data.Map as M import Data.AtLeast import Data.TypeNat.Vect import Data.Aeson import Data.JSON.Schema import Rest import Rest.Resource as R import Diplomacy.Game import Types.Server import Types.GameId import Types.Credentials import Types.GameState resource :: Resource (ReaderT GameId Server) (ReaderT GameId Server) () Void Void resource = mkResourceId { R.name = "pause" , R.schema = singleton () $ unnamedSingle (const ()) , R.update = Just update } where update :: Handler (ReaderT GameId Server) update = secureHandler $ mkInputHandler (jsonO . jsonE . jsonI) $ doUpdate doUpdate :: PauseInput -> ExceptT (Reason PauseError) (ReaderT GameId Server) PauseOutput doUpdate input = withAdminCredentials creds pauseGame where PauseInput creds = input pauseGame :: ExceptT (Reason PauseError) (ReaderT GameId Server) PauseOutput pauseGame = do gameId <- lift ask modifyGameState gameId modifier return GamePaused modifier :: GameState -> ExceptT (Reason PauseError) (ReaderT GameId Server) GameState modifier gameState = case gameState of GameNotStarted _ _ _ -> throwE (domainReason PauseGameNotStarted) GameStarted m games duration duration' elapsed _ -> return (GameStarted m games duration duration' elapsed True) data PauseError = PauseGameNotStarted instance ToResponseCode PauseError where toResponseCode _ = 403 deriving instance Generic PauseError deriving instance Typeable PauseError instance FromJSON PauseError instance ToJSON PauseError instance JSONSchema PauseError where schema = gSchema newtype PauseInput = PauseInput Credentials deriving instance Generic PauseInput deriving instance Typeable PauseInput instance FromJSON PauseInput instance ToJSON PauseInput instance JSONSchema PauseInput where schema = gSchema data PauseOutput = GamePaused deriving instance Generic PauseOutput deriving instance Typeable PauseOutput instance FromJSON PauseOutput instance ToJSON PauseOutput instance JSONSchema PauseOutput where schema = gSchema