module Data.Gargantext.Error where

import Control.Exception (Exception)
import Data.Typeable (Typeable)
import GHC.Generics (Generic)
import Network.HTTP.Client (HttpException)

import System.Exit (ExitCode (..), exitWith)
import System.IO (stderr)
--import Text.Parsec.Error
--import Text.Parsec.Pos hiding (Line)


data GargError = GargIOError String IOError
               | GargHttpError String HttpException
               | GargParseError String
               | GargNgramsError String
               | GargDatabaseError String
               deriving (Show, Typeable, Generic)


instance Exception PandocError

-- | Handle GargError by exiting with an error message.
handleError :: Either GargError a -> IO a
handleError (Right r) = pure r
handleError (Left e) =
  case e of
    GargIOError _ err'   -> ioError err'
    GargHttpError u err' -> err 61 $
      "Could not fetch " ++ u ++ "\n" ++ show err'
    GargParseError s     -> err 64 s
    _ s                  -> err 0 s


err :: Int -> String -> IO a
err exitCode msg = do
  UTF8.hPutStrLn stderr msg
  exitWith $ ExitFailure exitCode
  return undefined