{- |
Module                  : Language.Jsonnet.Error
Copyright               : (c) 2020-2021 Alexandre Moreno
SPDX-License-Identifier : BSD-3-Clause OR Apache-2.0
Maintainer              : Alexandre Moreno <alexmorenocano@gmail.com>
Stability               : experimental
Portability             : non-portable
-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE LambdaCase #-}

module Language.Jsonnet.Error where

import Control.Exception
import Data.Scientific (Scientific)
import Data.Text (Text)
import Data.Typeable (Typeable)
import Data.Void (Void)
import Language.Jsonnet.Common
import Language.Jsonnet.Core
import Language.Jsonnet.Parser.SrcSpan
import Text.Megaparsec (ParseErrorBundle)
import Text.PrettyPrint.ANSI.Leijen (Doc)

data Error
  = ParserError ParserError
  | CheckError CheckError (Maybe SrcSpan)
  | EvalError EvalError (Backtrace Core)
  deriving (Int -> Error -> ShowS
[Error] -> ShowS
Error -> String
(Int -> Error -> ShowS)
-> (Error -> String) -> ([Error] -> ShowS) -> Show Error
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Error] -> ShowS
$cshowList :: [Error] -> ShowS
show :: Error -> String
$cshow :: Error -> String
showsPrec :: Int -> Error -> ShowS
$cshowsPrec :: Int -> Error -> ShowS
Show)

data EvalError
  = TypeMismatch
      { EvalError -> Text
expected :: Text,
        EvalError -> Text
actual :: Text
      }
  | InvalidKey Doc
  | DuplicateKey Doc
  | NoSuchKey Doc
  | InvalidIndex Doc
  | IndexOutOfBounds Scientific
  | DivByZero
  | VarNotFound Doc
  | AssertionFailed Doc
  | TooManyArgs Int
  | ParamNotBound Doc
  | BadParam Doc
  | StdError Doc
  | RuntimeError Doc
  | ManifestError Doc
  deriving (Int -> EvalError -> ShowS
[EvalError] -> ShowS
EvalError -> String
(Int -> EvalError -> ShowS)
-> (EvalError -> String)
-> ([EvalError] -> ShowS)
-> Show EvalError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [EvalError] -> ShowS
$cshowList :: [EvalError] -> ShowS
show :: EvalError -> String
$cshow :: EvalError -> String
showsPrec :: Int -> EvalError -> ShowS
$cshowsPrec :: Int -> EvalError -> ShowS
Show, Typeable)

instance Exception EvalError

data ParserError
  = ParseError (ParseErrorBundle Text Void)
  | ImportError IOError (Maybe SrcSpan)
  deriving (ParserError -> ParserError -> Bool
(ParserError -> ParserError -> Bool)
-> (ParserError -> ParserError -> Bool) -> Eq ParserError
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ParserError -> ParserError -> Bool
$c/= :: ParserError -> ParserError -> Bool
== :: ParserError -> ParserError -> Bool
$c== :: ParserError -> ParserError -> Bool
Eq, Int -> ParserError -> ShowS
[ParserError] -> ShowS
ParserError -> String
(Int -> ParserError -> ShowS)
-> (ParserError -> String)
-> ([ParserError] -> ShowS)
-> Show ParserError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ParserError] -> ShowS
$cshowList :: [ParserError] -> ShowS
show :: ParserError -> String
$cshow :: ParserError -> String
showsPrec :: Int -> ParserError -> ShowS
$cshowsPrec :: Int -> ParserError -> ShowS
Show)

data CheckError
  = DuplicateParam String
  | PosAfterNamedParam
  | DuplicateBinding String
  deriving (Int -> CheckError -> ShowS
[CheckError] -> ShowS
CheckError -> String
(Int -> CheckError -> ShowS)
-> (CheckError -> String)
-> ([CheckError] -> ShowS)
-> Show CheckError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CheckError] -> ShowS
$cshowList :: [CheckError] -> ShowS
show :: CheckError -> String
$cshow :: CheckError -> String
showsPrec :: Int -> CheckError -> ShowS
$cshowsPrec :: Int -> CheckError -> ShowS
Show)