-- Some ad-hoc process return value overloading, for cleaner syntax module Mit.Process where import qualified Data.Sequence as Seq import Mit.Prelude import qualified Data.Text as Text import qualified Data.Text.IO as Text import qualified Data.Text.Lazy as Text.Lazy import qualified Data.List as List import qualified Data.Text.Builder.ANSI as Text.Builder import qualified Data.Text.Lazy.Builder as Text.Builder import System.Exit (ExitCode (..), exitWith) logProcess :: Text -> [Text] -> IO () logProcess s0 ss = Text.putStrLn (Text.Lazy.toStrict (Text.Builder.toLazyText line)) where line = "ยป " <> Text.Builder.bold (Text.Builder.fromText s0 <> space <> formatArgs ss) formatArgs = mconcat . List.intersperse space . map formatArg formatArg s = Text.Builder.fromText (if Text.elem ' ' s then s else s) space = Text.Builder.singleton ' ' class ProcessOutput a where fromProcessOutput :: Seq Text -> Seq 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 Seq.Empty -> throwIO (userError "no stdout") line Seq.:<| _ -> pure line instance a ~ Text => ProcessOutput [a] where fromProcessOutput out err code = toList @Seq <$> fromProcessOutput out err code instance a ~ ExitCode => ProcessOutput (Either a Text) where fromProcessOutput out _ code = case code of ExitFailure _ -> pure (Left code) ExitSuccess -> case out of Seq.Empty -> throwIO (userError "no stdout") line Seq.:<| _ -> pure (Right line) instance a ~ Text => ProcessOutput (Maybe a) where fromProcessOutput out _ code = do when (code /= ExitSuccess) (exitWith code) case out of Seq.Empty -> pure Nothing line Seq.:<| _ -> pure (Just line) instance a ~ Text => ProcessOutput (Seq a) where fromProcessOutput out _ code = do when (code /= ExitSuccess) (exitWith code) pure out