module Require.Error where

import Control.Exception
import Relude
import qualified Require.File as File
import System.Console.ANSI
import System.IO


data Error
  = MissingRequiresFile
  | MissingOptionalRequiresFile
  | AutorequireImpossible
  deriving (Eq, Show)


describe :: Error -> [String]
describe MissingRequiresFile =
  [ "`autorequirepp` couldn't find a `Requires` file in the system." ]
describe MissingOptionalRequiresFile =
  [ "Discovered an `autorequire` directive but no `Requires` file was found." ]
describe AutorequireImpossible =
  [ "Unable to determine where to insert the autorequire contents."
  , "Use the `autorequire` directive to specify a location yourself."
  ]


die :: File.Name -> Error -> IO a
die (File.Name fn) e = do
  let outputHeaderColored = do
        hSetSGR stderr [SetConsoleIntensity BoldIntensity]
        hPutStr stderr (toString fn ++ ": ")
        hSetSGR stderr [SetColor Foreground Vivid Red]
        hPutStr stderr "error:\n"

  -- Don't mess up the terminal if there is an exception half-way through.
  outputHeaderColored `finally` hSetSGR stderr []

  let indent s = replicate 4 ' ' ++ s
  traverse_ (hPutStrLn stderr . indent) (describe e)
  exitFailure