{-# Language ExistentialQuantification #-}
module Client.Commands.Types where
import Client.State (ClientState, clientErrorMsg)
import Client.State.Network (NetworkState)
import Data.Text (Text)
import Data.List.NonEmpty (NonEmpty)
import Client.Commands.Arguments.Spec
import Irc.Identifier (Identifier)
import Control.Lens
data CommandResult
= CommandSuccess ClientState
| CommandFailure ClientState
| CommandQuit ClientState
type ClientCommand a = ClientState -> a -> IO CommandResult
type NetworkCommand a = NetworkState -> ClientCommand a
type ChannelCommand a = Identifier -> NetworkCommand a
data CommandImpl a
= ClientCommand (ClientCommand a) (Bool -> ClientCommand String)
| NetworkCommand (NetworkCommand a) (Bool -> NetworkCommand String)
| ChatCommand (ChannelCommand a) (Bool -> ChannelCommand String)
| ChannelCommand (ChannelCommand a) (Bool -> ChannelCommand String)
data Command = forall a. Command
{
Command -> NonEmpty Text
cmdNames :: NonEmpty Text
, ()
cmdArgumentSpec :: Args ClientState a
, Command -> Text
cmdDocumentation :: Text
, ()
cmdImplementation :: CommandImpl a
}
data CommandSection = CommandSection
{ CommandSection -> Text
cmdSectionName :: Text
, CommandSection -> [Command]
cmdSectionCmds :: [Command]
}
commandSuccess :: Monad m => ClientState -> m CommandResult
commandSuccess :: ClientState -> m CommandResult
commandSuccess = CommandResult -> m CommandResult
forall (m :: * -> *) a. Monad m => a -> m a
return (CommandResult -> m CommandResult)
-> (ClientState -> CommandResult) -> ClientState -> m CommandResult
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ClientState -> CommandResult
CommandSuccess
commandFailure :: Monad m => ClientState -> m CommandResult
commandFailure :: ClientState -> m CommandResult
commandFailure = CommandResult -> m CommandResult
forall (m :: * -> *) a. Monad m => a -> m a
return (CommandResult -> m CommandResult)
-> (ClientState -> CommandResult) -> ClientState -> m CommandResult
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ClientState -> CommandResult
CommandFailure
commandFailureMsg :: Text -> ClientState -> IO CommandResult
commandFailureMsg :: Text -> ClientState -> IO CommandResult
commandFailureMsg Text
e ClientState
st =
CommandResult -> IO CommandResult
forall (m :: * -> *) a. Monad m => a -> m a
return (CommandResult -> IO CommandResult)
-> CommandResult -> IO CommandResult
forall a b. (a -> b) -> a -> b
$! ClientState -> CommandResult
CommandFailure (ClientState -> CommandResult) -> ClientState -> CommandResult
forall a b. (a -> b) -> a -> b
$! ASetter ClientState ClientState (Maybe Text) (Maybe Text)
-> Maybe Text -> ClientState -> ClientState
forall s t a b. ASetter s t a b -> b -> s -> t
set ASetter ClientState ClientState (Maybe Text) (Maybe Text)
Lens' ClientState (Maybe Text)
clientErrorMsg (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
e) ClientState
st