module System.JBI.Commands.Stack (Stack) where
import System.JBI.Commands.BuildTool
import System.JBI.Commands.Nix (nixShell)
import System.JBI.Commands.Tool
import System.JBI.Environment
import System.JBI.Tagged
import Control.Applicative (liftA2)
import Data.Char (isSpace)
import Data.Maybe (isJust, maybeToList)
import System.Directory (doesDirectoryExist)
import System.Exit (ExitCode)
import System.FilePath ((</>))
data Stack
instance Tool Stack where
commandName = "stack"
instance BuildTool Stack where
commandProjectRoot = withTaggedF go
where
go :: FilePath -> IO (Maybe FilePath)
go _ = recurseUpFindFile (== stackYaml)
hasBuildArtifacts dir = doesDirectoryExist (stripTag dir </> ".stack-work")
commandPrepare env cmd = commandArg "setup" env cmd
.&&. commandArgs ["build", "--dry-run"] env cmd
commandTargets cfg = withTaggedF go
where
go cmd = maybe [] validTargets <$> tryRunOutput cfg cmd ["ide", "targets"]
validTargets = filter isTarget . lines
isTarget = liftA2 (&&) (not . null) (all (not . isSpace))
commandBuild = commandArgsTarget ["build", "--test", "--no-run-tests", "--bench", "--no-run-benchmarks"]
commandRepl env cmd rargs = commandArgsTarget stackArgs env cmd
where
stackArgs = [ "ghci"
, "--ghci-options"
, ghcArgs
, "--test"
, "--bench"
, "--no-load"
]
ghcArgs = unwords (stripTag rargs :: Args)
commandClean = commandArgs ["clean", "--full"]
commandTest = commandArg "test"
commandBench = commandArg "bench"
commandExec env cmd prog progArgs = commandArgs args env cmd
where
args = "exec" : prog : "--" : progArgs
commandRun env cmd prog progArgs =
commandBuild env cmd (Just prog)
.&&. commandExec env cmd (componentName prog) progArgs
commandUpdate = commandArg "update"
instance NamedTool Stack
stackYaml :: String
stackYaml = "stack.yaml"
commandArgsTarget :: Args -> Env -> Tagged Stack CommandPath
-> Maybe (Tagged Stack ProjectTarget) -> IO ExitCode
commandArgsTarget args env cmd mt = commandArgs args' env cmd
where
args' = args ++ maybeToList (fmap stripTag mt)
commandArg :: String -> Env -> Tagged Stack CommandPath
-> IO ExitCode
commandArg arg = commandArgs [arg]
commandArgs :: Args -> Env -> Tagged Stack CommandPath
-> IO ExitCode
commandArgs args env cmd = tryRun (envConfig env) cmd args'
where
hasNix = isJust (nixShell (nix (envTools env)))
args' = addNix (["--stack-yaml", stackYaml] ++ args)
addNix
| hasNix = ("--nix":)
| otherwise = id