-- Some ad-hoc process return value overloading, for cleaner syntax module Mit.Process where import Mit.Prelude import System.Exit (ExitCode (..), exitWith) class ProcessOutput a where fromProcessOutput :: [Text] -> [Text] -> ExitCode -> IO a instance ProcessOutput () where fromProcessOutput _ _ code = when (code /= ExitSuccess) (exitWith code) instance ProcessOutput Bool where fromProcessOutput _ _ = \case ExitFailure _ -> pure False ExitSuccess -> pure True instance ProcessOutput Text where fromProcessOutput out _ code = do when (code /= ExitSuccess) (exitWith code) case out of [] -> throwIO (userError "no stdout") line : _ -> pure line instance a ~ Text => ProcessOutput [a] where fromProcessOutput out _ code = do when (code /= ExitSuccess) (exitWith code) pure out instance a ~ ExitCode => ProcessOutput (Either a Text) where fromProcessOutput out _ code = case code of ExitFailure _ -> pure (Left code) ExitSuccess -> case out of [] -> throwIO (userError "no stdout") line : _ -> pure (Right line) instance a ~ Text => ProcessOutput (Maybe a) where fromProcessOutput out _ code = do when (code /= ExitSuccess) (exitWith code) pure (listToMaybe out)