{-# LANGUAGE TemplateHaskell #-}
module CalamityCommands.Command (Command (..)) where
import CalamityCommands.Check
import CalamityCommands.Error
import CalamityCommands.Group
import CalamityCommands.ParameterInfo
import Data.Kind (Type)
import Data.List.NonEmpty (NonEmpty)
import qualified Data.List.NonEmpty as NE
import Data.Text as T
import Optics
import qualified TextShow
import TextShow.TH (deriveTextShow)
data Command (m :: Type -> Type) (c :: Type) (a :: Type) = forall p.
Command
{ Command m c a -> NonEmpty Text
names :: NonEmpty T.Text
, Command m c a -> Maybe (Group m c a)
parent :: Maybe (Group m c a)
,
Command m c a -> Bool
hidden :: Bool
,
Command m c a -> [Check m c]
checks :: [Check m c]
,
Command m c a -> [ParameterInfo]
params :: [ParameterInfo]
,
Command m c a -> c -> Text
help :: c -> T.Text
,
()
parser :: c -> m (Either CommandError p)
,
()
callback :: (c, p) -> m (Either T.Text a)
}
$(makeFieldLabelsNoPrefix ''Command)
data CommandS = CommandS
{ CommandS -> NonEmpty Text
names :: NonEmpty T.Text
, CommandS -> [ParameterInfo]
params :: [ParameterInfo]
, CommandS -> Maybe Text
parent :: Maybe T.Text
, CommandS -> [Text]
checks :: [T.Text]
, CommandS -> Bool
hidden :: Bool
}
deriving (Int -> CommandS -> ShowS
[CommandS] -> ShowS
CommandS -> String
(Int -> CommandS -> ShowS)
-> (CommandS -> String) -> ([CommandS] -> ShowS) -> Show CommandS
forall (a :: OpticKind).
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CommandS] -> ShowS
$cshowList :: [CommandS] -> ShowS
show :: CommandS -> String
$cshow :: CommandS -> String
showsPrec :: Int -> CommandS -> ShowS
$cshowsPrec :: Int -> CommandS -> ShowS
Show)
instance Show (Command m c a) where
showsPrec :: Int -> Command m c a -> ShowS
showsPrec Int
d Command {NonEmpty Text
names :: NonEmpty Text
$sel:names:Command :: forall (m :: OpticKind -> OpticKind) (c :: OpticKind)
(a :: OpticKind).
Command m c a -> NonEmpty Text
names, [ParameterInfo]
params :: [ParameterInfo]
$sel:params:Command :: forall (m :: OpticKind -> OpticKind) (c :: OpticKind)
(a :: OpticKind).
Command m c a -> [ParameterInfo]
params, Maybe (Group m c a)
parent :: Maybe (Group m c a)
$sel:parent:Command :: forall (m :: OpticKind -> OpticKind) (c :: OpticKind)
(a :: OpticKind).
Command m c a -> Maybe (Group m c a)
parent, [Check m c]
checks :: [Check m c]
$sel:checks:Command :: forall (m :: OpticKind -> OpticKind) (c :: OpticKind)
(a :: OpticKind).
Command m c a -> [Check m c]
checks, Bool
hidden :: Bool
$sel:hidden:Command :: forall (m :: OpticKind -> OpticKind) (c :: OpticKind)
(a :: OpticKind).
Command m c a -> Bool
hidden} =
Int -> CommandS -> ShowS
forall (a :: OpticKind). Show a => Int -> a -> ShowS
showsPrec Int
d (CommandS -> ShowS) -> CommandS -> ShowS
forall (a :: OpticKind) b. (a -> b) -> a -> b
$
NonEmpty Text
-> [ParameterInfo] -> Maybe Text -> [Text] -> Bool -> CommandS
CommandS
NonEmpty Text
names
[ParameterInfo]
params
(NonEmpty Text -> Text
forall (a :: OpticKind). NonEmpty a -> a
NE.head (NonEmpty Text -> Text) -> Maybe (NonEmpty Text) -> Maybe Text
forall (f :: OpticKind -> OpticKind) (a :: OpticKind)
(b :: OpticKind).
Functor f =>
(a -> b) -> f a -> f b
<$> Maybe (Group m c a)
parent Maybe (Group m c a)
-> Optic'
An_AffineTraversal NoIx (Maybe (Group m c a)) (NonEmpty Text)
-> Maybe (NonEmpty Text)
forall (k :: OpticKind) (s :: OpticKind) (is :: IxList)
(a :: OpticKind).
Is k An_AffineFold =>
s -> Optic' k is s a -> Maybe a
^? Prism
(Maybe (Group m c a))
(Maybe (Group m c a))
(Group m c a)
(Group m c a)
forall (a :: OpticKind) (b :: OpticKind).
Prism (Maybe a) (Maybe b) a b
_Just Prism
(Maybe (Group m c a))
(Maybe (Group m c a))
(Group m c a)
(Group m c a)
-> Optic
A_Lens
NoIx
(Group m c a)
(Group m c a)
(NonEmpty Text)
(NonEmpty Text)
-> Optic'
An_AffineTraversal NoIx (Maybe (Group m c a)) (NonEmpty Text)
forall (k :: OpticKind) (l :: OpticKind) (m :: OpticKind)
(is :: IxList) (js :: IxList) (ks :: IxList) (s :: OpticKind)
(t :: OpticKind) (u :: OpticKind) (v :: OpticKind) (a :: OpticKind)
(b :: OpticKind).
(JoinKinds k l m, AppendIndices is js ks) =>
Optic k is s t u v -> Optic l js u v a b -> Optic m ks s t a b
% IsLabel
"names"
(Optic
A_Lens
NoIx
(Group m c a)
(Group m c a)
(NonEmpty Text)
(NonEmpty Text))
Optic
A_Lens
NoIx
(Group m c a)
(Group m c a)
(NonEmpty Text)
(NonEmpty Text)
#names)
([Check m c]
checks [Check m c] -> Optic' A_Traversal NoIx [Check m c] Text -> [Text]
forall (k :: OpticKind) (s :: OpticKind) (is :: IxList)
(a :: OpticKind).
Is k A_Fold =>
s -> Optic' k is s a -> [a]
^.. Traversal [Check m c] [Check m c] (Check m c) (Check m c)
forall (t :: OpticKind -> OpticKind) (a :: OpticKind)
(b :: OpticKind).
Traversable t =>
Traversal (t a) (t b) a b
traversed Traversal [Check m c] [Check m c] (Check m c) (Check m c)
-> Optic A_Lens NoIx (Check m c) (Check m c) Text Text
-> Optic' A_Traversal NoIx [Check m c] Text
forall (k :: OpticKind) (l :: OpticKind) (m :: OpticKind)
(is :: IxList) (js :: IxList) (ks :: IxList) (s :: OpticKind)
(t :: OpticKind) (u :: OpticKind) (v :: OpticKind) (a :: OpticKind)
(b :: OpticKind).
(JoinKinds k l m, AppendIndices is js ks) =>
Optic k is s t u v -> Optic l js u v a b -> Optic m ks s t a b
% IsLabel
"name" (Optic A_Lens NoIx (Check m c) (Check m c) Text Text)
Optic A_Lens NoIx (Check m c) (Check m c) Text Text
#name)
Bool
hidden
$(deriveTextShow ''CommandS)
instance TextShow.TextShow (Command m c a) where
showbPrec :: Int -> Command m c a -> Builder
showbPrec Int
d Command {NonEmpty Text
names :: NonEmpty Text
$sel:names:Command :: forall (m :: OpticKind -> OpticKind) (c :: OpticKind)
(a :: OpticKind).
Command m c a -> NonEmpty Text
names, [ParameterInfo]
params :: [ParameterInfo]
$sel:params:Command :: forall (m :: OpticKind -> OpticKind) (c :: OpticKind)
(a :: OpticKind).
Command m c a -> [ParameterInfo]
params, Maybe (Group m c a)
parent :: Maybe (Group m c a)
$sel:parent:Command :: forall (m :: OpticKind -> OpticKind) (c :: OpticKind)
(a :: OpticKind).
Command m c a -> Maybe (Group m c a)
parent, [Check m c]
checks :: [Check m c]
$sel:checks:Command :: forall (m :: OpticKind -> OpticKind) (c :: OpticKind)
(a :: OpticKind).
Command m c a -> [Check m c]
checks, Bool
hidden :: Bool
$sel:hidden:Command :: forall (m :: OpticKind -> OpticKind) (c :: OpticKind)
(a :: OpticKind).
Command m c a -> Bool
hidden} =
Int -> CommandS -> Builder
forall (a :: OpticKind). TextShow a => Int -> a -> Builder
TextShow.showbPrec Int
d (CommandS -> Builder) -> CommandS -> Builder
forall (a :: OpticKind) b. (a -> b) -> a -> b
$
NonEmpty Text
-> [ParameterInfo] -> Maybe Text -> [Text] -> Bool -> CommandS
CommandS
NonEmpty Text
names
[ParameterInfo]
params
(NonEmpty Text -> Text
forall (a :: OpticKind). NonEmpty a -> a
NE.head (NonEmpty Text -> Text) -> Maybe (NonEmpty Text) -> Maybe Text
forall (f :: OpticKind -> OpticKind) (a :: OpticKind)
(b :: OpticKind).
Functor f =>
(a -> b) -> f a -> f b
<$> Maybe (Group m c a)
parent Maybe (Group m c a)
-> Optic'
An_AffineTraversal NoIx (Maybe (Group m c a)) (NonEmpty Text)
-> Maybe (NonEmpty Text)
forall (k :: OpticKind) (s :: OpticKind) (is :: IxList)
(a :: OpticKind).
Is k An_AffineFold =>
s -> Optic' k is s a -> Maybe a
^? Prism
(Maybe (Group m c a))
(Maybe (Group m c a))
(Group m c a)
(Group m c a)
forall (a :: OpticKind) (b :: OpticKind).
Prism (Maybe a) (Maybe b) a b
_Just Prism
(Maybe (Group m c a))
(Maybe (Group m c a))
(Group m c a)
(Group m c a)
-> Optic
A_Lens
NoIx
(Group m c a)
(Group m c a)
(NonEmpty Text)
(NonEmpty Text)
-> Optic'
An_AffineTraversal NoIx (Maybe (Group m c a)) (NonEmpty Text)
forall (k :: OpticKind) (l :: OpticKind) (m :: OpticKind)
(is :: IxList) (js :: IxList) (ks :: IxList) (s :: OpticKind)
(t :: OpticKind) (u :: OpticKind) (v :: OpticKind) (a :: OpticKind)
(b :: OpticKind).
(JoinKinds k l m, AppendIndices is js ks) =>
Optic k is s t u v -> Optic l js u v a b -> Optic m ks s t a b
% IsLabel
"names"
(Optic
A_Lens
NoIx
(Group m c a)
(Group m c a)
(NonEmpty Text)
(NonEmpty Text))
Optic
A_Lens
NoIx
(Group m c a)
(Group m c a)
(NonEmpty Text)
(NonEmpty Text)
#names)
([Check m c]
checks [Check m c] -> Optic' A_Traversal NoIx [Check m c] Text -> [Text]
forall (k :: OpticKind) (s :: OpticKind) (is :: IxList)
(a :: OpticKind).
Is k A_Fold =>
s -> Optic' k is s a -> [a]
^.. Traversal [Check m c] [Check m c] (Check m c) (Check m c)
forall (t :: OpticKind -> OpticKind) (a :: OpticKind)
(b :: OpticKind).
Traversable t =>
Traversal (t a) (t b) a b
traversed Traversal [Check m c] [Check m c] (Check m c) (Check m c)
-> Optic A_Lens NoIx (Check m c) (Check m c) Text Text
-> Optic' A_Traversal NoIx [Check m c] Text
forall (k :: OpticKind) (l :: OpticKind) (m :: OpticKind)
(is :: IxList) (js :: IxList) (ks :: IxList) (s :: OpticKind)
(t :: OpticKind) (u :: OpticKind) (v :: OpticKind) (a :: OpticKind)
(b :: OpticKind).
(JoinKinds k l m, AppendIndices is js ks) =>
Optic k is s t u v -> Optic l js u v a b -> Optic m ks s t a b
% IsLabel
"name" (Optic A_Lens NoIx (Check m c) (Check m c) Text Text)
Optic A_Lens NoIx (Check m c) (Check m c) Text Text
#name)
Bool
hidden