calamity-commands 0.3.0.0 → 0.4.0.0
raw patch · 16 files changed
+187/−201 lines, 16 filesdep +opticsdep −generic-lensdep −lensPVP ok
version bump matches the API change (PVP)
Dependencies added: optics
Dependencies removed: generic-lens, lens
API changes (from Hackage documentation)
- CalamityCommands.AliasType: instance GHC.Generics.Generic CalamityCommands.AliasType.AliasType
- CalamityCommands.Check: instance GHC.Generics.Generic (CalamityCommands.Check.Check m c)
- CalamityCommands.Command: instance GHC.Generics.Generic CalamityCommands.Command.CommandS
- CalamityCommands.Context: instance GHC.Generics.Generic (CalamityCommands.Context.BasicContext m a)
- CalamityCommands.Error: instance GHC.Generics.Generic CalamityCommands.Error.CommandError
- CalamityCommands.Group: instance GHC.Generics.Generic (CalamityCommands.Group.Group m c a)
- CalamityCommands.Group: instance GHC.Generics.Generic (CalamityCommands.Group.GroupS m c a)
- CalamityCommands.Group: instance GHC.Show.Show (CalamityCommands.Group.Group m c a)
- CalamityCommands.Group: instance GHC.Show.Show (CalamityCommands.Group.GroupS m c a)
- CalamityCommands.Group: instance TextShow.Classes.TextShow (CalamityCommands.Group.Group m c a)
- CalamityCommands.Group: instance TextShow.Classes.TextShow (CalamityCommands.Group.GroupS m c a)
- CalamityCommands.Handler: instance GHC.Generics.Generic (CalamityCommands.Handler.CommandHandler m c a)
- CalamityCommands.Handler: instance GHC.Generics.Generic (CalamityCommands.Handler.CommandHandlerS m c a)
- CalamityCommands.Handler: instance GHC.Show.Show (CalamityCommands.Handler.CommandHandler m c a)
- CalamityCommands.Handler: instance GHC.Show.Show (CalamityCommands.Handler.CommandHandlerS m c a)
- CalamityCommands.Handler: instance TextShow.Classes.TextShow (CalamityCommands.Handler.CommandHandler m c a)
- CalamityCommands.Handler: instance TextShow.Classes.TextShow (CalamityCommands.Handler.CommandHandlerS m c a)
- CalamityCommands.ParameterInfo: instance GHC.Generics.Generic CalamityCommands.ParameterInfo.ParameterInfo
- CalamityCommands.Parser: instance GHC.Generics.Generic CalamityCommands.Parser.ParserState
- CalamityCommands.Utils: instance GHC.Generics.Generic (CalamityCommands.Utils.CmdInvokeFailReason c)
+ CalamityCommands.Check: instance (k GHC.Types.~ Optics.Internal.Optic.Types.A_Lens, a GHC.Types.~ (c1 -> m1 (GHC.Maybe.Maybe Data.Text.Internal.Text)), b GHC.Types.~ (c2 -> m2 (GHC.Maybe.Maybe Data.Text.Internal.Text))) => Optics.Label.LabelOptic "callback" k (CalamityCommands.Check.Check m1 c1) (CalamityCommands.Check.Check m2 c2) a b
+ CalamityCommands.Check: instance (k GHC.Types.~ Optics.Internal.Optic.Types.A_Lens, a GHC.Types.~ Data.Text.Internal.Text, b GHC.Types.~ Data.Text.Internal.Text) => Optics.Label.LabelOptic "name" k (CalamityCommands.Check.Check m c) (CalamityCommands.Check.Check m c) a b
+ CalamityCommands.Command: instance (k GHC.Types.~ Optics.Internal.Optic.Types.A_Lens, a1 GHC.Types.~ (c -> Data.Text.Internal.Text), b GHC.Types.~ (c -> Data.Text.Internal.Text)) => Optics.Label.LabelOptic "help" k (CalamityCommands.Command.Command m c a2) (CalamityCommands.Command.Command m c a2) a1 b
+ CalamityCommands.Command: instance (k GHC.Types.~ Optics.Internal.Optic.Types.A_Lens, a1 GHC.Types.~ GHC.Base.NonEmpty Data.Text.Internal.Text, b GHC.Types.~ GHC.Base.NonEmpty Data.Text.Internal.Text) => Optics.Label.LabelOptic "names" k (CalamityCommands.Command.Command m c a2) (CalamityCommands.Command.Command m c a2) a1 b
+ CalamityCommands.Command: instance (k GHC.Types.~ Optics.Internal.Optic.Types.A_Lens, a1 GHC.Types.~ GHC.Maybe.Maybe (CalamityCommands.Group.Group m c a2), b GHC.Types.~ GHC.Maybe.Maybe (CalamityCommands.Group.Group m c a2)) => Optics.Label.LabelOptic "parent" k (CalamityCommands.Command.Command m c a2) (CalamityCommands.Command.Command m c a2) a1 b
+ CalamityCommands.Command: instance (k GHC.Types.~ Optics.Internal.Optic.Types.A_Lens, a1 GHC.Types.~ GHC.Types.Bool, b GHC.Types.~ GHC.Types.Bool) => Optics.Label.LabelOptic "hidden" k (CalamityCommands.Command.Command m c a2) (CalamityCommands.Command.Command m c a2) a1 b
+ CalamityCommands.Command: instance (k GHC.Types.~ Optics.Internal.Optic.Types.A_Lens, a1 GHC.Types.~ [CalamityCommands.Check.Check m c], b GHC.Types.~ [CalamityCommands.Check.Check m c]) => Optics.Label.LabelOptic "checks" k (CalamityCommands.Command.Command m c a2) (CalamityCommands.Command.Command m c a2) a1 b
+ CalamityCommands.Command: instance (k GHC.Types.~ Optics.Internal.Optic.Types.A_Lens, a1 GHC.Types.~ [CalamityCommands.ParameterInfo.ParameterInfo], b GHC.Types.~ [CalamityCommands.ParameterInfo.ParameterInfo]) => Optics.Label.LabelOptic "params" k (CalamityCommands.Command.Command m c a2) (CalamityCommands.Command.Command m c a2) a1 b
+ CalamityCommands.Context: instance (k GHC.Types.~ Optics.Internal.Optic.Types.A_Lens, a1 GHC.Types.~ CalamityCommands.Command.Command m1 (CalamityCommands.Context.BasicContext m1 a2) a2, b GHC.Types.~ CalamityCommands.Command.Command m2 (CalamityCommands.Context.BasicContext m2 a3) a3) => Optics.Label.LabelOptic "bcCommand" k (CalamityCommands.Context.BasicContext m1 a2) (CalamityCommands.Context.BasicContext m2 a3) a1 b
+ CalamityCommands.Context: instance (k GHC.Types.~ Optics.Internal.Optic.Types.A_Lens, a1 GHC.Types.~ Data.Text.Internal.Text, b GHC.Types.~ Data.Text.Internal.Text) => Optics.Label.LabelOptic "bcPrefix" k (CalamityCommands.Context.BasicContext m a2) (CalamityCommands.Context.BasicContext m a2) a1 b
+ CalamityCommands.Context: instance (k GHC.Types.~ Optics.Internal.Optic.Types.A_Lens, a1 GHC.Types.~ Data.Text.Internal.Text, b GHC.Types.~ Data.Text.Internal.Text) => Optics.Label.LabelOptic "bcUnparsedParams" k (CalamityCommands.Context.BasicContext m a2) (CalamityCommands.Context.BasicContext m a2) a1 b
+ CalamityCommands.Group: instance (GHC.Show.Show a, GHC.Show.Show c) => GHC.Show.Show (CalamityCommands.Group.Group m c a)
+ CalamityCommands.Group: instance (GHC.Show.Show a, GHC.Show.Show c) => GHC.Show.Show (CalamityCommands.Group.GroupS m c a)
+ CalamityCommands.Group: instance (TextShow.Classes.TextShow a, TextShow.Classes.TextShow c) => TextShow.Classes.TextShow (CalamityCommands.Group.Group m c a)
+ CalamityCommands.Group: instance (TextShow.Classes.TextShow c, TextShow.Classes.TextShow a) => TextShow.Classes.TextShow (CalamityCommands.Group.GroupS m c a)
+ CalamityCommands.Group: instance (k GHC.Types.~ Optics.Internal.Optic.Types.A_Lens, a1 GHC.Types.~ (c -> Data.Text.Internal.Text), b GHC.Types.~ (c -> Data.Text.Internal.Text)) => Optics.Label.LabelOptic "help" k (CalamityCommands.Group.Group m c a2) (CalamityCommands.Group.Group m c a2) a1 b
+ CalamityCommands.Group: instance (k GHC.Types.~ Optics.Internal.Optic.Types.A_Lens, a1 GHC.Types.~ Data.HashMap.Internal.HashMap Data.Text.Internal.Text (CalamityCommands.Command.Command m c a2, CalamityCommands.AliasType.AliasType), b GHC.Types.~ Data.HashMap.Internal.HashMap Data.Text.Internal.Text (CalamityCommands.Command.Command m c a2, CalamityCommands.AliasType.AliasType)) => Optics.Label.LabelOptic "commands" k (CalamityCommands.Group.Group m c a2) (CalamityCommands.Group.Group m c a2) a1 b
+ CalamityCommands.Group: instance (k GHC.Types.~ Optics.Internal.Optic.Types.A_Lens, a1 GHC.Types.~ Data.HashMap.Internal.HashMap Data.Text.Internal.Text (CalamityCommands.Group.Group m c a2, CalamityCommands.AliasType.AliasType), b GHC.Types.~ Data.HashMap.Internal.HashMap Data.Text.Internal.Text (CalamityCommands.Group.Group m c a2, CalamityCommands.AliasType.AliasType)) => Optics.Label.LabelOptic "children" k (CalamityCommands.Group.Group m c a2) (CalamityCommands.Group.Group m c a2) a1 b
+ CalamityCommands.Group: instance (k GHC.Types.~ Optics.Internal.Optic.Types.A_Lens, a1 GHC.Types.~ GHC.Base.NonEmpty Data.Text.Internal.Text, b GHC.Types.~ GHC.Base.NonEmpty Data.Text.Internal.Text) => Optics.Label.LabelOptic "names" k (CalamityCommands.Group.Group m c a2) (CalamityCommands.Group.Group m c a2) a1 b
+ CalamityCommands.Group: instance (k GHC.Types.~ Optics.Internal.Optic.Types.A_Lens, a1 GHC.Types.~ GHC.Maybe.Maybe (CalamityCommands.Group.Group m c a2), b GHC.Types.~ GHC.Maybe.Maybe (CalamityCommands.Group.Group m c a2)) => Optics.Label.LabelOptic "parent" k (CalamityCommands.Group.Group m c a2) (CalamityCommands.Group.Group m c a2) a1 b
+ CalamityCommands.Group: instance (k GHC.Types.~ Optics.Internal.Optic.Types.A_Lens, a1 GHC.Types.~ GHC.Types.Bool, b GHC.Types.~ GHC.Types.Bool) => Optics.Label.LabelOptic "hidden" k (CalamityCommands.Group.Group m c a2) (CalamityCommands.Group.Group m c a2) a1 b
+ CalamityCommands.Group: instance (k GHC.Types.~ Optics.Internal.Optic.Types.A_Lens, a1 GHC.Types.~ [CalamityCommands.Check.Check m c], b GHC.Types.~ [CalamityCommands.Check.Check m c]) => Optics.Label.LabelOptic "checks" k (CalamityCommands.Group.Group m c a2) (CalamityCommands.Group.Group m c a2) a1 b
+ CalamityCommands.Handler: instance (GHC.Show.Show a, GHC.Show.Show c) => GHC.Show.Show (CalamityCommands.Handler.CommandHandlerS m c a)
+ CalamityCommands.Handler: instance (GHC.Show.Show c, GHC.Show.Show a) => GHC.Show.Show (CalamityCommands.Handler.CommandHandler m c a)
+ CalamityCommands.Handler: instance (TextShow.Classes.TextShow c, TextShow.Classes.TextShow a) => TextShow.Classes.TextShow (CalamityCommands.Handler.CommandHandler m c a)
+ CalamityCommands.Handler: instance (TextShow.Classes.TextShow c, TextShow.Classes.TextShow a) => TextShow.Classes.TextShow (CalamityCommands.Handler.CommandHandlerS m c a)
+ CalamityCommands.Handler: instance (k GHC.Types.~ Optics.Internal.Optic.Types.A_Lens, a1 GHC.Types.~ Data.HashMap.Internal.HashMap Data.Text.Internal.Text (CalamityCommands.Command.Command m c a2, CalamityCommands.AliasType.AliasType), b GHC.Types.~ Data.HashMap.Internal.HashMap Data.Text.Internal.Text (CalamityCommands.Command.Command m c a2, CalamityCommands.AliasType.AliasType)) => Optics.Label.LabelOptic "commands" k (CalamityCommands.Handler.CommandHandler m c a2) (CalamityCommands.Handler.CommandHandler m c a2) a1 b
+ CalamityCommands.Handler: instance (k GHC.Types.~ Optics.Internal.Optic.Types.A_Lens, a1 GHC.Types.~ Data.HashMap.Internal.HashMap Data.Text.Internal.Text (CalamityCommands.Group.Group m c a2, CalamityCommands.AliasType.AliasType), b GHC.Types.~ Data.HashMap.Internal.HashMap Data.Text.Internal.Text (CalamityCommands.Group.Group m c a2, CalamityCommands.AliasType.AliasType)) => Optics.Label.LabelOptic "groups" k (CalamityCommands.Handler.CommandHandler m c a2) (CalamityCommands.Handler.CommandHandler m c a2) a1 b
+ CalamityCommands.ParameterInfo: instance (k GHC.Types.~ Optics.Internal.Optic.Types.A_Lens, a GHC.Types.~ Data.Text.Internal.Text, b GHC.Types.~ Data.Text.Internal.Text) => Optics.Label.LabelOptic "typeDescription" k CalamityCommands.ParameterInfo.ParameterInfo CalamityCommands.ParameterInfo.ParameterInfo a b
+ CalamityCommands.ParameterInfo: instance (k GHC.Types.~ Optics.Internal.Optic.Types.A_Lens, a GHC.Types.~ Data.Typeable.TypeRep, b GHC.Types.~ Data.Typeable.TypeRep) => Optics.Label.LabelOptic "type_" k CalamityCommands.ParameterInfo.ParameterInfo CalamityCommands.ParameterInfo.ParameterInfo a b
+ CalamityCommands.ParameterInfo: instance (k GHC.Types.~ Optics.Internal.Optic.Types.A_Lens, a GHC.Types.~ GHC.Maybe.Maybe Data.Text.Internal.Text, b GHC.Types.~ GHC.Maybe.Maybe Data.Text.Internal.Text) => Optics.Label.LabelOptic "name" k CalamityCommands.ParameterInfo.ParameterInfo CalamityCommands.ParameterInfo.ParameterInfo a b
+ CalamityCommands.Parser: instance (k GHC.Types.~ Optics.Internal.Optic.Types.A_Lens, a GHC.Types.~ Data.Text.Internal.Text, b GHC.Types.~ Data.Text.Internal.Text) => Optics.Label.LabelOptic "msg" k CalamityCommands.Parser.ParserState CalamityCommands.Parser.ParserState a b
+ CalamityCommands.Parser: instance (k GHC.Types.~ Optics.Internal.Optic.Types.A_Lens, a GHC.Types.~ GHC.Types.Int, b GHC.Types.~ GHC.Types.Int) => Optics.Label.LabelOptic "off" k CalamityCommands.Parser.ParserState CalamityCommands.Parser.ParserState a b
- CalamityCommands.Context: constructContext :: forall msg_aHk3 ctx_aHk1 m'_aHk0 a'_aHk2 r_aHmD. Member (ConstructContext msg_aHk3 ctx_aHk1 m'_aHk0 a'_aHk2) r_aHmD => (Text, Command m'_aHk0 ctx_aHk1 a'_aHk2, Text) -> msg_aHk3 -> Sem r_aHmD (Maybe ctx_aHk1)
+ CalamityCommands.Context: constructContext :: forall msg_atzk ctx_atzi m'_atzh a'_atzj r_atBU. Member (ConstructContext msg_atzk ctx_atzi m'_atzh a'_atzj) r_atBU => (Text, Command m'_atzh ctx_atzi a'_atzj, Text) -> msg_atzk -> Sem r_atBU (Maybe ctx_atzi)
- CalamityCommands.Internal.LocalWriter: llisten :: forall o_amZR r_anb8 a_XmZR. Member (LocalWriter o_amZR) r_anb8 => Sem r_anb8 a_XmZR -> Sem r_anb8 (o_amZR, a_XmZR)
+ CalamityCommands.Internal.LocalWriter: llisten :: forall o_ahfv r_ahn9 a_Xhfv. Member (LocalWriter o_ahfv) r_ahn9 => Sem r_ahn9 a_Xhfv -> Sem r_ahn9 (o_ahfv, a_Xhfv)
- CalamityCommands.Internal.LocalWriter: ltell :: forall o_amZN r_anb6. Member (LocalWriter o_amZN) r_anb6 => o_amZN -> Sem r_anb6 ()
+ CalamityCommands.Internal.LocalWriter: ltell :: forall o_ahfr r_ahn7. Member (LocalWriter o_ahfr) r_ahn7 => o_ahfr -> Sem r_ahn7 ()
- CalamityCommands.ParsePrefix: parsePrefix :: forall msg_aI7h r_aI87. Member (ParsePrefix msg_aI7h) r_aI87 => msg_aI7h -> Sem r_aI87 (Maybe (Text, Text))
+ CalamityCommands.ParsePrefix: parsePrefix :: forall msg_auxN r_auyD. Member (ParsePrefix msg_auxN) r_auyD => msg_auxN -> Sem r_auyD (Maybe (Text, Text))
Files
- CalamityCommands/AliasType.hs +6/−9
- CalamityCommands/Check.hs +18/−21
- CalamityCommands/Command.hs +19/−20
- CalamityCommands/CommandUtils.hs +1/−4
- CalamityCommands/Context.hs +5/−4
- CalamityCommands/Dsl.hs +0/−2
- CalamityCommands/Error.hs +21/−22
- CalamityCommands/Group.hs +34/−37
- CalamityCommands/Handler.hs +22/−21
- CalamityCommands/Help.hs +3/−6
- CalamityCommands/Internal/Utils.hs +24/−24
- CalamityCommands/ParameterInfo.hs +13/−11
- CalamityCommands/Parser.hs +7/−9
- CalamityCommands/Utils.hs +2/−7
- ChangeLog.md +9/−0
- calamity-commands.cabal +3/−4
CalamityCommands/AliasType.hs view
@@ -1,15 +1,12 @@ -- | Named boolean for determining if something is an alias or not-module CalamityCommands.AliasType- ( AliasType (..),- )-where+module CalamityCommands.AliasType (+ AliasType (..),+) where -import GHC.Generics (Generic)-import TextShow (TextShow)-import qualified TextShow.Generic as TSG+import qualified TextShow data AliasType = Alias | Original- deriving (Eq, Enum, Show, Generic)- deriving (TextShow) via TSG.FromGeneric AliasType+ deriving (Eq, Enum, Show)+ deriving (TextShow.TextShow) via TextShow.FromStringShow AliasType
CalamityCommands/Check.hs view
@@ -1,23 +1,19 @@+{-# LANGUAGE TemplateHaskell #-}+ -- | Command invokation preconditions module CalamityCommands.Check (- Check (..),- buildCheck,- buildCheckPure,- runCheck,+ Check (..),+ buildCheck,+ buildCheckPure,+ runCheck, ) where import CalamityCommands.Error import CalamityCommands.Internal.RunIntoM import CalamityCommands.Internal.Utils--import Control.Lens hiding (Context, (<.>))--import Data.Generics.Labels () import Data.Maybe import qualified Data.Text as T--import GHC.Generics-+import Optics import qualified Polysemy as P {- | A check for a command.@@ -25,22 +21,23 @@ Every check for a command must return Nothing for the command to be run. -} data Check m c = MkCheck- { -- | The name of the check.- name :: T.Text- , -- | The callback for the check, returns Nothing if it passes, otherwise- -- returns the reason for it not passing.- callback :: c -> m (Maybe T.Text)- }- deriving (Generic)+ { -- | The name of the check.+ name :: T.Text+ , -- | The callback for the check, returns Nothing if it passes, otherwise+ -- returns the reason for it not passing.+ callback :: c -> m (Maybe T.Text)+ } +$(makeFieldLabelsNoPrefix ''Check)+ {- | Given the name of a check and a callback in the 'P.Sem' monad, build a check by transforming the Polysemy action into an @m@ action. -} buildCheck :: (Monad m, P.Member (P.Final m) r) => T.Text -> (c -> P.Sem r (Maybe T.Text)) -> P.Sem r (Check m c) buildCheck name cb = do- cb' <- bindSemToM cb- let cb'' = fromMaybe (Just "failed internally") <.> cb'- pure $ MkCheck name cb''+ cb' <- bindSemToM cb+ let cb'' = fromMaybe (Just "failed internally") <.> cb'+ pure $ MkCheck name cb'' -- | Given the name of a check and a pure callback function, build a check. buildCheckPure :: Monad m => T.Text -> (c -> Maybe T.Text) -> Check m c
CalamityCommands/Command.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE NoPolyKinds #-}+{-# LANGUAGE TemplateHaskell #-} -- | Commands and stuff module CalamityCommands.Command (Command (..)) where@@ -7,18 +7,13 @@ import CalamityCommands.Error import CalamityCommands.Group import CalamityCommands.ParameterInfo--import Control.Lens hiding (Context, (<.>))- import Data.Kind (Type) import Data.List.NonEmpty (NonEmpty)-import Data.Text as T--import GHC.Generics- import qualified Data.List.NonEmpty as NE-import TextShow-import qualified TextShow.Generic as TSG+import Data.Text as T+import Optics+import qualified TextShow+import TextShow.TH (deriveTextShow) -- | A command, paremeterised over its context data Command (m :: Type -> Type) (c :: Type) (a :: Type) = forall p.@@ -41,6 +36,8 @@ callback :: (c, p) -> m (Either T.Text a) } +$(makeFieldLabelsNoPrefix ''Command)+ data CommandS = CommandS { names :: NonEmpty T.Text , params :: [ParameterInfo]@@ -48,25 +45,27 @@ , checks :: [T.Text] , hidden :: Bool }- deriving (Generic, Show)- deriving (TextShow) via TSG.FromGeneric CommandS+ deriving (Show) instance Show (Command m c a) where- showsPrec d Command{names, params, parent, checks, hidden} =+ showsPrec d Command {names, params, parent, checks, hidden} = showsPrec d $ CommandS names params- (NE.head <$> parent ^? _Just . #names)- (checks ^.. traverse . #name)+ (NE.head <$> parent ^? _Just % #names)+ (checks ^.. traversed % #name) hidden -instance TextShow (Command m c a) where- showbPrec d Command{names, params, parent, checks, hidden} =- showbPrec d $+$(deriveTextShow ''CommandS)++instance TextShow.TextShow (Command m c a) where+ showbPrec d Command {names, params, parent, checks, hidden} =+ TextShow.showbPrec d $ CommandS names params- (NE.head <$> parent ^? _Just . #names)- (checks ^.. traverse . #name)+ (NE.head <$> parent ^? _Just % #names)+ (checks ^.. traversed % #name) hidden+
CalamityCommands/CommandUtils.hs view
@@ -22,17 +22,14 @@ import CalamityCommands.Internal.Utils import CalamityCommands.ParameterInfo import CalamityCommands.Parser--import Control.Lens hiding (Context, (<.>))+import Optics import Control.Monad- import Data.Foldable import Data.Kind import Data.List.NonEmpty (NonEmpty (..)) import qualified Data.List.NonEmpty as NE import Data.Maybe import qualified Data.Text as S- import qualified Polysemy as P import qualified Polysemy.Error as P import qualified Polysemy.Fail as P
CalamityCommands/Context.hs view
@@ -9,12 +9,11 @@ useBasicContext, ) where +import CalamityCommands.Command import qualified Data.Text as T-import GHC.Generics (Generic)+import Optics.TH import qualified Polysemy as P -import CalamityCommands.Command- class CommandContext m c a | c -> m, c -> a where -- | The prefix that was used to invoke the command ctxPrefix :: c -> T.Text@@ -44,7 +43,7 @@ , bcCommand :: Command m (BasicContext m a) a , bcUnparsedParams :: T.Text }- deriving (Show, Generic)+ deriving (Show) instance CommandContext m (BasicContext m a) a where ctxPrefix = bcPrefix@@ -58,3 +57,5 @@ ( \case ConstructContext (pre, cmd, up) _ -> pure . Just $ BasicContext pre cmd up )++$(makeFieldLabelsNoPrefix ''BasicContext)
CalamityCommands/Dsl.hs view
@@ -33,10 +33,8 @@ import CalamityCommands.Handler import CalamityCommands.ParameterInfo import CalamityCommands.Internal.LocalWriter- import qualified Data.HashMap.Lazy as LH import qualified Data.Text as T- import Data.List.NonEmpty (NonEmpty (..)) import qualified Polysemy as P import qualified Polysemy.Fail as P
CalamityCommands/Error.hs view
@@ -1,28 +1,27 @@+{-# LANGUAGE TemplateHaskell #-}+ -- | Command errors module CalamityCommands.Error (CommandError (..)) where import qualified Data.Text as T--import GHC.Generics--import TextShow-import qualified TextShow.Generic as TSG+import TextShow.TH (deriveTextShow) data CommandError- = ParseError- T.Text- -- ^ The type of the parser- T.Text- -- ^ The reason that parsing failed- | CheckError- T.Text- -- ^ The name of the check that failed- T.Text- -- ^ The reason for the check failing- | InvokeError- T.Text- -- ^ The name of the command that failed- T.Text- -- ^ The reason for failing- deriving (Show, Generic)- deriving (TextShow) via TSG.FromGeneric CommandError+ = ParseError+ T.Text+ -- ^ The type of the parser+ T.Text+ -- ^ The reason that parsing failed+ | CheckError+ T.Text+ -- ^ The name of the check that failed+ T.Text+ -- ^ The reason for the check failing+ | InvokeError+ T.Text+ -- ^ The name of the command that failed+ T.Text+ -- ^ The reason for failing+ deriving (Show)++$(deriveTextShow ''CommandError)
CalamityCommands/Group.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE NoPolyKinds #-}+{-# LANGUAGE TemplateHaskell #-} -- | Command groups module CalamityCommands.Group (Group (..)) where@@ -6,49 +6,46 @@ import CalamityCommands.AliasType import CalamityCommands.Check import {-# SOURCE #-} CalamityCommands.Command--import Control.Lens hiding (Context, (<.>))- import qualified Data.HashMap.Lazy as LH-import qualified Data.Text as T--import GHC.Generics- import Data.List.NonEmpty (NonEmpty) import qualified Data.List.NonEmpty as NE-import TextShow-import qualified TextShow.Generic as TSG+import qualified Data.Text as T+import Optics+import qualified TextShow+import TextShow.TH (deriveTextShow) -- | A group of commands data Group m c a = Group- { names :: NonEmpty T.Text- , parent :: Maybe (Group m c a)- , hidden :: Bool- , -- | Any child commands of this group- commands :: LH.HashMap T.Text (Command m c a, AliasType)- , -- | Any child groups of this group- children :: LH.HashMap T.Text (Group m c a, AliasType)- , -- | A function producing the \'help\' for the group- help :: c -> T.Text- , -- | A list of checks that must pass- checks :: [Check m c]- }- deriving (Generic)+ { names :: NonEmpty T.Text+ , parent :: Maybe (Group m c a)+ , hidden :: Bool+ , -- | Any child commands of this group+ commands :: LH.HashMap T.Text (Command m c a, AliasType)+ , -- | Any child groups of this group+ children :: LH.HashMap T.Text (Group m c a, AliasType)+ , -- | A function producing the \'help\' for the group+ help :: c -> T.Text+ , -- | A list of checks that must pass+ checks :: [Check m c]+ } +$(makeFieldLabelsNoPrefix ''Group)+ data GroupS m c a = GroupS- { names :: NonEmpty T.Text- , parent :: Maybe T.Text- , commands :: [(T.Text, (Command m c a, AliasType))]- , children :: [(T.Text, (Group m c a, AliasType))]- , hidden :: Bool- }- deriving (Generic, Show)- deriving (TextShow) via TSG.FromGeneric (GroupS m c a)+ { names :: NonEmpty T.Text+ , parent :: Maybe T.Text+ , commands :: [(T.Text, (Command m c a, AliasType))]+ , children :: [(T.Text, (Group m c a, AliasType))]+ , hidden :: Bool+ }+ deriving (Show) -instance Show (Group m c a) where- showsPrec d Group{names, parent, commands, children, hidden} =- showsPrec d $ GroupS names (NE.head <$> parent ^? _Just . #names) (LH.toList commands) (LH.toList children) hidden+instance (Show a, Show c) => Show (Group m c a) where+ showsPrec d Group {names, parent, commands, children, hidden} =+ showsPrec d $ GroupS names (NE.head <$> parent ^? _Just % #names) (LH.toList commands) (LH.toList children) hidden -instance TextShow (Group m c a) where- showbPrec d Group{names, parent, commands, children, hidden} =- showbPrec d $ GroupS names (NE.head <$> parent ^? _Just . #names) (LH.toList commands) (LH.toList children) hidden+$(deriveTextShow ''GroupS)++instance (TextShow.TextShow a, TextShow.TextShow c) => TextShow.TextShow (Group m c a) where+ showbPrec d Group {names, parent, commands, children, hidden} =+ TextShow.showbPrec d $ GroupS names (NE.head <$> parent ^? _Just % #names) (LH.toList commands) (LH.toList children) hidden
CalamityCommands/Handler.hs view
@@ -1,35 +1,36 @@+{-# LANGUAGE TemplateHaskell #-}+ -- | A command handler module CalamityCommands.Handler (CommandHandler (..)) where import CalamityCommands.AliasType import CalamityCommands.Command import CalamityCommands.Group- import qualified Data.HashMap.Lazy as LH import qualified Data.Text as S--import GHC.Generics--import TextShow-import qualified TextShow.Generic as TSG+import Optics.TH+import qualified TextShow+import TextShow.TH (deriveTextShow) data CommandHandler m c a = CommandHandler- { -- | Top level groups- groups :: LH.HashMap S.Text (Group m c a, AliasType)- , -- | Top level commands- commands :: LH.HashMap S.Text (Command m c a, AliasType)- }- deriving (Generic)+ { -- | Top level groups+ groups :: LH.HashMap S.Text (Group m c a, AliasType)+ , -- | Top level commands+ commands :: LH.HashMap S.Text (Command m c a, AliasType)+ } data CommandHandlerS m c a = CommandHandlerS- { groups :: [(S.Text, (Group m c a, AliasType))]- , commands :: [(S.Text, (Command m c a, AliasType))]- }- deriving (Show, Generic)- deriving (TextShow) via TSG.FromGeneric (CommandHandlerS m c a)+ { groups :: [(S.Text, (Group m c a, AliasType))]+ , commands :: [(S.Text, (Command m c a, AliasType))]+ }+ deriving (Show) -instance Show (CommandHandler m c a) where- showsPrec d CommandHandler{groups, commands} = showsPrec d $ CommandHandlerS (LH.toList groups) (LH.toList commands)+instance (Show c, Show a) => Show (CommandHandler m c a) where+ showsPrec d CommandHandler {groups, commands} = showsPrec d $ CommandHandlerS (LH.toList groups) (LH.toList commands) -instance TextShow (CommandHandler m c a) where- showbPrec d CommandHandler{groups, commands} = showbPrec d $ CommandHandlerS (LH.toList groups) (LH.toList commands)+$(deriveTextShow ''CommandHandlerS)++instance (TextShow.TextShow c, TextShow.TextShow a) => TextShow.TextShow (CommandHandler m c a) where+ showbPrec d CommandHandler {groups, commands} = TextShow.showbPrec d $ CommandHandlerS (LH.toList groups) (LH.toList commands)++$(makeFieldLabelsNoPrefix ''CommandHandler)
CalamityCommands/Help.hs view
@@ -14,16 +14,13 @@ import CalamityCommands.Handler import CalamityCommands.ParameterInfo import CalamityCommands.Internal.LocalWriter- import Control.Applicative-import Control.Lens hiding (Context (..))-+import Optics import qualified Data.HashMap.Lazy as LH import Data.List.NonEmpty (NonEmpty (..)) import qualified Data.List.NonEmpty as NE import Data.Maybe (mapMaybe) import qualified Data.Text as T- import qualified Polysemy as P import qualified Polysemy.Fail as P import qualified Polysemy.Reader as P@@ -100,7 +97,7 @@ path' = T.unwords $ groupPath grp groups = onlyVisibleG . onlyOriginals . LH.elems $ grp ^. #children commands = onlyVisibleC . onlyOriginals . LH.elems $ grp ^. #commands- groupsFmt = map formatWithAliases (groups ^.. traverse . #names)+ groupsFmt = map formatWithAliases (groups ^.. traversed % #names) groupsMsg = if null groups then ""@@ -125,7 +122,7 @@ where groups = onlyVisibleG . onlyOriginals . LH.elems $ handler ^. #groups commands = onlyVisibleC . onlyOriginals . LH.elems $ handler ^. #commands- groupsFmt = map formatWithAliases (groups ^.. traverse . #names)+ groupsFmt = map formatWithAliases (groups ^.. traversed % #names) groupsMsg = if null groups then ""
CalamityCommands/Internal/Utils.hs view
@@ -1,27 +1,27 @@ {-# OPTIONS_GHC -Wno-orphans #-} -- | Internal utilities and instances-module CalamityCommands.Internal.Utils- ( -- whileMFinalIO- -- , untilJustFinalIO- whenJust- , whenM- , unlessM- , lastMaybe- , leftToMaybe- , rightToMaybe- , justToEither- , mapLeft- , (<<$>>)- , (<<*>>)- , (<.>)- ) where+module CalamityCommands.Internal.Utils (+ -- whileMFinalIO+ -- , untilJustFinalIO+ whenJust,+ whenM,+ unlessM,+ lastMaybe,+ leftToMaybe,+ rightToMaybe,+ justToEither,+ mapLeft,+ (<<$>>),+ (<<*>>),+ (<.>),+) where -- import CalamityCommands.Internal.RunIntoIO -import Control.Applicative+import Control.Applicative -import Data.Semigroup ( Last(..) )+import Data.Semigroup (Last (..)) -- import qualified Polysemy as P @@ -61,9 +61,10 @@ whenJust = flip $ maybe (pure ()) whenM :: Monad m => m Bool -> m () -> m ()-whenM p m = p >>= \case- True -> m- False -> pure ()+whenM p m =+ p >>= \case+ True -> m+ False -> pure () unlessM :: Monad m => m Bool -> m () -> m () unlessM = whenM . (not <$>)@@ -77,15 +78,15 @@ leftToMaybe :: Either e a -> Maybe e leftToMaybe (Left x) = Just x-leftToMaybe _ = Nothing+leftToMaybe _ = Nothing rightToMaybe :: Either e a -> Maybe a rightToMaybe (Right x) = Just x-rightToMaybe _ = Nothing+rightToMaybe _ = Nothing justToEither :: Maybe e -> Either e () justToEither (Just x) = Left x-justToEither _ = Right ()+justToEither _ = Right () (<<$>>) :: (Functor f, Functor g) => (a -> b) -> f (g a) -> f (g b) (<<$>>) = fmap . fmap@@ -101,4 +102,3 @@ (<.>) f g x = f <$> g x infixl 4 <.>-
CalamityCommands/ParameterInfo.hs view
@@ -1,19 +1,21 @@+{-# LANGUAGE TemplateHaskell #-}+ -- | Parameter info for a command module CalamityCommands.ParameterInfo (- ParameterInfo (..),+ ParameterInfo (..), ) where import qualified Data.Text as S import Data.Typeable--import GHC.Generics (Generic)-import TextShow-import qualified TextShow.Generic as TSG+import Optics.TH (makeFieldLabelsNoPrefix)+import TextShow.TH (deriveTextShow) data ParameterInfo = ParameterInfo- { name :: Maybe S.Text- , type_ :: TypeRep- , typeDescription :: S.Text- }- deriving (Show, Generic)- deriving (TextShow) via TSG.FromGeneric ParameterInfo+ { name :: Maybe S.Text+ , type_ :: TypeRep+ , typeDescription :: S.Text+ }+ deriving (Show)++$(deriveTextShow ''ParameterInfo)+$(makeFieldLabelsNoPrefix ''ParameterInfo)
CalamityCommands/Parser.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE TemplateHaskell #-}+ -- | Something that can parse user input module CalamityCommands.Parser ( ParameterParser (..),@@ -15,11 +17,9 @@ import CalamityCommands.ParameterInfo -import Control.Lens hiding (Context) import Control.Monad-+import Optics import Data.Char (isSpace)-import Data.Generics.Labels () import Data.Kind import Data.List.NonEmpty (NonEmpty (..)) import Data.Maybe (fromMaybe)@@ -27,15 +27,11 @@ import qualified Data.Text as T import qualified Data.Text.Lazy as L import Data.Typeable--import GHC.Generics (Generic) import GHC.TypeLits (KnownSymbol, Symbol, symbolVal)- import qualified Polysemy as P import qualified Polysemy.Error as P import qualified Polysemy.Reader as P import qualified Polysemy.State as P- import Numeric.Natural (Natural) import Text.Megaparsec hiding (parse) import Text.Megaparsec.Char@@ -57,8 +53,10 @@ , -- | The input message ot parse msg :: T.Text }- deriving (Show, Generic)+ deriving (Show) +$(makeFieldLabelsNoPrefix ''ParserState)+ -- | type ParserEffs c r = ( P.State ParserState@@ -129,7 +127,7 @@ res <- P.raise . P.raise $ runParserT (skipN (s ^. #off) *> trackOffsets (space *> m)) "" (s ^. #msg) case res of Right (a, offset) -> do- P.modify (#off +~ offset)+ P.modify (#off %~ (+ offset)) pure a Left s -> P.throw (n, T.pack $ errorBundlePretty s)
CalamityCommands/Utils.hs view
@@ -19,21 +19,16 @@ import CalamityCommands.Handler import CalamityCommands.Internal.LocalWriter import CalamityCommands.ParsePrefix--import Control.Lens hiding (Context) import Control.Monad.Fix (MonadFix)- import Data.Char (isSpace) import qualified Data.HashMap.Lazy as LH import qualified Data.Text as T--import GHC.Generics (Generic)- import qualified Polysemy as P import qualified Polysemy.Error as P import qualified Polysemy.Fixpoint as P import qualified Polysemy.Reader as P import qualified Polysemy.Tagged as P+import Optics mapLeft :: (e -> e') -> Either e a -> Either e' a mapLeft f (Left x) = Left $ f x@@ -43,7 +38,7 @@ = NoContext | NotFound [T.Text] | CommandInvokeError c CommandError- deriving (Show, Generic)+ deriving (Show) {- | Manages parsing messages and handling commands for a CommandHandler.
ChangeLog.md view
@@ -1,5 +1,14 @@ # Changelog for Calamity Commands +## 0.5.0.0+++ Replaced lens with optics internally, you should use optics for field labels now.++ Generic instances have been removed from library data types.++## 0.3.0.0+++ DSL commands no longer use a concrete effect list prefix.+ ## 0.2.0.0 + Remove all usages of lazy Text (except from typeclass instances)
calamity-commands.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack name: calamity-commands-version: 0.3.0.0+version: 0.4.0.0 synopsis: A library for declaring, parsing, and invoking text-input based commands description: Please see the README on GitHub at <https://github.com/simmsb/calamity#readme> category: Utils@@ -18,7 +18,7 @@ license-file: LICENSE build-type: Simple tested-with:- GHC == 8.10.4+ GHC == 8.10.7, GHC == 9.2.2 extra-source-files: README.md ChangeLog.md@@ -104,8 +104,7 @@ ghc-options: -fplugin=Polysemy.Plugin -funbox-strict-fields -Wall -fno-warn-name-shadowing build-depends: base >=4.13 && <5- , generic-lens >=2.0 && <3- , lens >=4.18 && <6+ , optics >=0.4.1 && <0.5 , megaparsec >=8 && <10 , polysemy >=1.5 && <2 , polysemy-plugin >=0.3 && <0.5