{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}

-- | Accepting arguments to be passed through to a sub-process.


module Options.Applicative.Args
    (argsArgument
    ,argsOption
    ,cmdOption)
    where

import           Data.Attoparsec.Args
import qualified Options.Applicative as O
import           Stack.Prelude

-- | An argument which accepts a list of arguments e.g. @--ghc-options="-X P.hs \"this\""@.

argsArgument :: O.Mod O.ArgumentFields [String] -> O.Parser [String]
argsArgument :: Mod ArgumentFields [String] -> Parser [String]
argsArgument =
    forall a. ReadM a -> Mod ArgumentFields a -> Parser a
O.argument
        (do String
string <- forall s. IsString s => ReadM s
O.str
            forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall a. String -> ReadM a
O.readerError forall (m :: * -> *) a. Monad m => a -> m a
return (EscapingMode -> String -> Either String [String]
parseArgsFromString EscapingMode
Escaping String
string))

-- | An option which accepts a list of arguments e.g. @--ghc-options="-X P.hs \"this\""@.

argsOption :: O.Mod O.OptionFields [String] -> O.Parser [String]
argsOption :: Mod OptionFields [String] -> Parser [String]
argsOption =
    forall a. ReadM a -> Mod OptionFields a -> Parser a
O.option
        (do String
string <- forall s. IsString s => ReadM s
O.str
            forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall a. String -> ReadM a
O.readerError forall (m :: * -> *) a. Monad m => a -> m a
return (EscapingMode -> String -> Either String [String]
parseArgsFromString EscapingMode
Escaping String
string))

-- | An option which accepts a command and a list of arguments e.g. @--exec "echo hello world"@

cmdOption :: O.Mod O.OptionFields (String, [String]) -> O.Parser (String, [String])
cmdOption :: Mod OptionFields (String, [String]) -> Parser (String, [String])
cmdOption =
    forall a. ReadM a -> Mod OptionFields a -> Parser a
O.option
        (do String
string <- forall s. IsString s => ReadM s
O.str
            [String]
xs <- forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall a. String -> ReadM a
O.readerError forall (m :: * -> *) a. Monad m => a -> m a
return (EscapingMode -> String -> Either String [String]
parseArgsFromString EscapingMode
Escaping String
string)
            case [String]
xs of
                [] -> forall a. String -> ReadM a
O.readerError String
"Must provide a command"
                String
x:[String]
xs' -> forall (m :: * -> *) a. Monad m => a -> m a
return (String
x, [String]
xs'))