{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE LambdaCase #-}

module Language.Jsonnet.Error where

import Data.Scientific (Scientific)
import Data.Text (Text)
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)

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)