module Sos.Exception
  ( SosException(..)
  ) where

import Sos.Utils

import Data.ByteString (ByteString)


data SosException
  -- Error compiling the given regex.
  = SosRegexException
      ByteString -- pattern
      String     -- string reason for failure
  -- Error parsing a command template.
  | SosCommandParseException
      ByteString -- template
  -- Error applying a list of captured variables to a command template.
  | SosCommandApplyException
      [Either Int ByteString] -- template
      [ByteString]            -- captured variables
      String                  -- string reason for failure
  deriving Eq

instance Show SosException where
  show (SosRegexException pattrn err) =
    "Error compiling regex '" ++ unpackBS pattrn ++ "': " ++ err
  show (SosCommandParseException template) =
    "Error parsing command '" ++ unpackBS template ++ "'"
  show (SosCommandApplyException template vars err) =
    "Error applying template '" ++ reconstruct template ++ "' to " ++   show vars ++ ": " ++ err
   where
    reconstruct :: [Either Int ByteString] -> String
    reconstruct = concatMap
      (\case
        Left n   -> '\\' : show n
        Right bs -> unpackBS bs)