packages feed

rattle-0.2: pipeline/Pipeline.hs

-- Run commands separated by
-- a ; b - do a, continue with b ignoring the escape code
-- a || b - do a, only do b if a fails
-- a && b - do a, only do b if a succeeds
-- there is no bracketing
module Pipeline(main) where

import Development.Shake.Command
import System.Environment
import System.Exit


main :: IO ()
main = exitWith =<< run =<< getArgs


isSpecial x = x `elem` [";", "&&", "||"]


run :: [String] -> IO ExitCode
run xs | (a, op:b) <- break isSpecial xs = case op of
    ";" -> run a >> run b
    "&&" -> do a <- run a; if a == ExitSuccess then run b else pure a
    "||" -> do a <- run a; if a == ExitSuccess then pure a else run b
run [] = pure ExitSuccess
run (x:xs) = cmd x xs