{-# LANGUAGE NoImplicitPrelude #-}
module Stack.Options.ScriptParser
( scriptOptsParser
) where
import Options.Applicative
( Parser, completer, eitherReader, flag', help, long, metavar
, option, strArgument, strOption
)
import Options.Applicative.Builder.Extra
( boolFlags, fileExtCompleter )
import Stack.Options.Completion ( ghcOptsCompleter )
import Stack.Prelude
import Stack.Script
( ScriptExecute (..), ScriptOpts (..), ShouldRun (..) )
scriptOptsParser :: Parser ScriptOpts
scriptOptsParser :: Parser ScriptOpts
scriptOptsParser = [String]
-> String
-> [String]
-> ScriptExecute
-> Bool
-> [String]
-> [PackageIdentifierRevision]
-> ShouldRun
-> ScriptOpts
ScriptOpts
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (f :: * -> *) a. Alternative f => f a -> f [a]
many (forall s. IsString s => Mod OptionFields s -> Parser s
strOption
( forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"package"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"PACKAGE"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Add a package (can be specified multiple times)."
))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall s. IsString s => Mod ArgumentFields s -> Parser s
strArgument
( forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"FILE"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasCompleter f => Completer -> Mod f a
completer ([String] -> Completer
fileExtCompleter [String
".hs", String
".lhs"])
)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Alternative f => f a -> f [a]
many (forall s. IsString s => Mod ArgumentFields s -> Parser s
strArgument
( forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"-- ARGUMENT(S) (e.g. stack script X.hs -- argument(s) to \
\program)."
))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ( forall a. a -> Mod FlagFields a -> Parser a
flag' ScriptExecute
SECompile
( forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"compile"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Compile the script without optimization and run the \
\executable."
)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
flag' ScriptExecute
SEOptimize
( forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"optimize"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Compile the script with optimization and run the \
\executable."
)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (f :: * -> *) a. Applicative f => a -> f a
pure ScriptExecute
SEInterpret
)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Bool -> String -> String -> Mod FlagFields Bool -> Parser Bool
boolFlags Bool
False
String
"use-root"
String
"writing of all compilation outputs to a script-specific location in \
\the scripts directory of the Stack root."
forall a. Monoid a => a
mempty
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Alternative f => f a -> f [a]
many (forall s. IsString s => Mod OptionFields s -> Parser s
strOption
( forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"ghc-options"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"OPTIONS"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasCompleter f => Completer -> Mod f a
completer Completer
ghcOptsCompleter
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Additional options passed to GHC (can be specified multiple \
\times)."
))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Alternative f => f a -> f [a]
many (forall a. ReadM a -> Mod OptionFields a -> Parser a
option ReadM PackageIdentifierRevision
extraDepRead
( forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"extra-dep"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"PACKAGE-VERSION"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Extra dependencies to be added to the snapshot."
))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ( forall a. a -> Mod FlagFields a -> Parser a
flag' ShouldRun
NoRun
( forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"no-run"
forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Do not run, just compile."
)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (f :: * -> *) a. Applicative f => a -> f a
pure ShouldRun
YesRun
)
where
extraDepRead :: ReadM PackageIdentifierRevision
extraDepRead = forall a. (String -> Either String a) -> ReadM a
eitherReader forall a b. (a -> b) -> a -> b
$
forall a1 a2 b. (a1 -> a2) -> Either a1 b -> Either a2 b
mapLeft forall a. Show a => a -> String
show forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Either PantryException PackageIdentifierRevision
parsePackageIdentifierRevision forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. IsString a => String -> a
fromString