{- | Calamity commands
 This module exports the DSL and core types for using commands
-}
module Calamity.Commands (
  module Calamity.Commands.Dsl,
  module CalamityCommands.Error,
  module Calamity.Commands.Help,
  module CalamityCommands.Parser,
  module Calamity.Commands.Utils,
  module Calamity.Commands.Types,

  -- * Commands
  -- $commandDocs
) where

import Calamity.Commands.CalamityParsers ()
import Calamity.Commands.Dsl
import Calamity.Commands.Help
import Calamity.Commands.Types
import Calamity.Commands.Utils
import CalamityCommands.Error
import CalamityCommands.Parser

{- $commandDocs

 This module provides abstractions for writing declarative commands, that
 support grouping, pre-invokation checks, and automatic argument parsing by
 using a type level list of parameter types.

 A DSL is provided in "Calamity.Commands.Dsl" for constructing commands
 declaratively.

 You can implement 'ParameterParser' for your own types to allow them to be used
 in the parameter list of commands.

 A default help command is provided in "Calamity.Commands.Help" which can be
 added just by using 'helpCommand' inside the command declaration DSL.

 This module is pretty much a wrapper/re-export of the package
 "CalamityCommands", look there for more documentation.

 To decide which context type you want to use, and how the command prefix
 should be parsed, you need to handle the following effects:

     1. 'CalamityCommands.ParsePrefix.ParsePrefix'

         Handles parsing prefixes, the
         'Calamity.Commands.Utils.useConstantPrefix' function handles constant
         prefixes.

     2. 'CalamityCommands.Context.ConstructContext'

         Handles constructing the context and also decides which context is
         going to be used, calamity offers
         'Calamity.Commands.Context.useFullContext' which makes the context
         'Calamity.Commands.Context.FullContext', and
         'Calamity.Commands.Context.useLightContext' which makes the context
         'Calamity.Commands.Context.LightContext'.

 ==== Custom Events

 The event handler registered by 'addCommands' will fire the following custom events:

     1. 'Calamity.Commands.Utils.CtxCommandError'

         Fired when a command returns an error.

     2. 'Calamity.Commands.Utils.CommandNotFound'

         Fired when a valid prefix is used, but the command is not found.

     3. 'Calamity.Commands.Utils.CommandInvoked'

         Fired when a command is successfully invoked.


 ==== Registered Metrics

     1. Counter: @"commands_invoked" [name]@

         Incremented on each command invokation, the parameter @name@ is the
         path/name of the invoked command.


 ==== Examples

 An example of using commands:

 @
 'addCommands' $ do
   'helpCommand'
   'command' \@\'['Calamity.Types.Model.User.User'] "utest" $ \\ctx u \-\> do
     'Control.Monad.void' $ 'Calamity.Types.Tellable.tell' ctx $ "got user: " '<>' 'TextShow.showt' u
   'group' "admin" $ do
     'command' \@'[] "bye" $ \\ctx -> do
       'Control.Monad.void' $ 'Calamity.Types.Tellable.tell' ctx "bye!"
       'Calamity.Client.stopBot'
 @
-}