summaryrefslogtreecommitdiff
path: root/src/Command.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Command.hs')
-rw-r--r--src/Command.hs39
1 files changed, 37 insertions, 2 deletions
diff --git a/src/Command.hs b/src/Command.hs
index 78d0d6c..bb0b26f 100644
--- a/src/Command.hs
+++ b/src/Command.hs
@@ -1,20 +1,55 @@
module Command (
Command(..),
+ CommandArgumentsType(..),
CommandExec(..),
getConfig,
) where
+import Control.Monad.Except
import Control.Monad.Reader
+import Data.Kind
+import Data.Text (Text)
+import Data.Text qualified as T
+
+import System.Console.GetOpt
+
import Config
-class Command c where
+class CommandArgumentsType (CommandArguments c) => Command c where
commandName :: proxy c -> String
- commandInit :: proxy c -> c
+ type CommandOptions c :: Type
+ type CommandOptions c = ()
+ commandOptions :: proxy c -> [OptDescr (CommandOptions c -> CommandOptions c)]
+ commandOptions _ = []
+ defaultCommandOptions :: proxy c -> CommandOptions c
+ default defaultCommandOptions :: CommandOptions c ~ () => proxy c -> CommandOptions c
+ defaultCommandOptions _ = ()
+
+ type CommandArguments c :: Type
+ type CommandArguments c = ()
+
+ commandInit :: CommandArgumentsType (CommandArguments c) => proxy c -> CommandOptions c -> CommandArguments c -> c
commandExec :: c -> CommandExec ()
+class CommandArgumentsType args where
+ argsFromStrings :: [String] -> Except String args
+
+instance CommandArgumentsType () where
+ argsFromStrings [] = return ()
+ argsFromStrings _ = throwError "no argument expected"
+
+instance CommandArgumentsType Text where
+ argsFromStrings [str] = return $ T.pack str
+ argsFromStrings _ = throwError "expected single argument"
+
+instance CommandArgumentsType (Maybe Text) where
+ argsFromStrings [] = return $ Nothing
+ argsFromStrings [str] = return $ Just (T.pack str)
+ argsFromStrings _ = throwError "expected at most one argument"
+
newtype CommandExec a = CommandExec (ReaderT Config IO a)
deriving (Functor, Applicative, Monad, MonadIO)