-- |
--
-- Copyright:
--   This file is part of the package vimeta. It is subject to the
--   license terms in the LICENSE file found in the top-level
--   directory of this distribution and at:
--
--     https://github.com/pjones/vimeta
--
--   No part of this package, including this file, may be copied,
--   modified, propagated, or distributed except according to the terms
--   contained in the LICENSE file.
--
-- License: BSD-2-Clause
--
-- | Utility functions for running external commands.
module Vimeta.Core.Process
  ( tagFile,
  )
where

import System.Exit (ExitCode (..))
import System.Process
import Vimeta.Core.Config
import Vimeta.Core.Vimeta

-- | Run the tagging command unless dry-run mode is in effect.
tagFile :: Text -> Vimeta IO ()
tagFile cmd = do
  dryRun <- configDryRun <$> asks ctxConfig
  if dryRun then doDryRun else doRealRun
  where
    doDryRun :: Vimeta IO ()
    doDryRun =
      verbose "dry run: skipping tagging command"
        >> verbose cmd
    doRealRun :: Vimeta IO ()
    doRealRun = do
      verbose cmd
      code <- liftIO (spawnCommand (toString cmd) >>= waitForProcess)

      case code of
        ExitSuccess ->
          pass
        ExitFailure n ->
          throwError ("command failed (" ++ show n ++ "): " ++ toString cmd)