1{-# LANGUAGE NoImplicitPrelude #-}
2{-# LANGUAGE OverloadedStrings #-}
3
4-- | Accepting arguments to be passed through to a sub-process.
5
6module Options.Applicative.Args
7    (argsArgument
8    ,argsOption
9    ,cmdOption)
10    where
11
12import           Data.Attoparsec.Args
13import qualified Options.Applicative as O
14import           Stack.Prelude
15
16-- | An argument which accepts a list of arguments e.g. @--ghc-options="-X P.hs \"this\""@.
17argsArgument :: O.Mod O.ArgumentFields [String] -> O.Parser [String]
18argsArgument =
19    O.argument
20        (do string <- O.str
21            either O.readerError return (parseArgsFromString Escaping string))
22
23-- | An option which accepts a list of arguments e.g. @--ghc-options="-X P.hs \"this\""@.
24argsOption :: O.Mod O.OptionFields [String] -> O.Parser [String]
25argsOption =
26    O.option
27        (do string <- O.str
28            either O.readerError return (parseArgsFromString Escaping string))
29
30-- | An option which accepts a command and a list of arguments e.g. @--exec "echo hello world"@
31cmdOption :: O.Mod O.OptionFields (String, [String]) -> O.Parser (String, [String])
32cmdOption =
33    O.option
34        (do string <- O.str
35            xs <- either O.readerError return (parseArgsFromString Escaping string)
36            case xs of
37                [] -> O.readerError "Must provide a command"
38                x:xs' -> return (x, xs'))
39