{-# LANGUAGE DeriveAnyClass #-}
module Toml.Codec.Error
( TomlDecodeError (..)
, prettyTomlDecodeErrors
, prettyTomlDecodeError
, LoadTomlException (..)
) where
import Control.DeepSeq (NFData)
import Control.Exception (Exception)
import Data.Text (Text)
import GHC.Generics (Generic)
import Toml.Codec.BiMap (TomlBiMapError, prettyBiMapError)
import Toml.Parser (TomlParseError (..))
import Toml.Type.Key (Key (..))
import Toml.Type.TOML (TOML)
import Toml.Type.Printer (prettyKey, pretty)
import qualified Data.Text as Text
data TomlDecodeError
= BiMapError !Key !TomlBiMapError
| KeyNotFound !Key
| TableNotFound !Key
| TableArrayNotFound !Key
| ParseError !TomlParseError
| NotExactDecode !TOML
deriving stock (Int -> TomlDecodeError -> ShowS
[TomlDecodeError] -> ShowS
TomlDecodeError -> String
(Int -> TomlDecodeError -> ShowS)
-> (TomlDecodeError -> String)
-> ([TomlDecodeError] -> ShowS)
-> Show TomlDecodeError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TomlDecodeError -> ShowS
showsPrec :: Int -> TomlDecodeError -> ShowS
$cshow :: TomlDecodeError -> String
show :: TomlDecodeError -> String
$cshowList :: [TomlDecodeError] -> ShowS
showList :: [TomlDecodeError] -> ShowS
Show, TomlDecodeError -> TomlDecodeError -> Bool
(TomlDecodeError -> TomlDecodeError -> Bool)
-> (TomlDecodeError -> TomlDecodeError -> Bool)
-> Eq TomlDecodeError
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: TomlDecodeError -> TomlDecodeError -> Bool
== :: TomlDecodeError -> TomlDecodeError -> Bool
$c/= :: TomlDecodeError -> TomlDecodeError -> Bool
/= :: TomlDecodeError -> TomlDecodeError -> Bool
Eq, (forall x. TomlDecodeError -> Rep TomlDecodeError x)
-> (forall x. Rep TomlDecodeError x -> TomlDecodeError)
-> Generic TomlDecodeError
forall x. Rep TomlDecodeError x -> TomlDecodeError
forall x. TomlDecodeError -> Rep TomlDecodeError x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. TomlDecodeError -> Rep TomlDecodeError x
from :: forall x. TomlDecodeError -> Rep TomlDecodeError x
$cto :: forall x. Rep TomlDecodeError x -> TomlDecodeError
to :: forall x. Rep TomlDecodeError x -> TomlDecodeError
Generic)
deriving anyclass (TomlDecodeError -> ()
(TomlDecodeError -> ()) -> NFData TomlDecodeError
forall a. (a -> ()) -> NFData a
$crnf :: TomlDecodeError -> ()
rnf :: TomlDecodeError -> ()
NFData)
prettyTomlDecodeErrors :: [TomlDecodeError] -> Text
prettyTomlDecodeErrors :: [TomlDecodeError] -> Text
prettyTomlDecodeErrors [TomlDecodeError]
errs = [Text] -> Text
Text.unlines ([Text] -> Text) -> [Text] -> Text
forall a b. (a -> b) -> a -> b
$
(Text
"tomland errors number: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
Text.pack (Int -> String
forall a. Show a => a -> String
show (Int -> String) -> Int -> String
forall a b. (a -> b) -> a -> b
$ [TomlDecodeError] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [TomlDecodeError]
errs))
Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
: (TomlDecodeError -> Text) -> [TomlDecodeError] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map TomlDecodeError -> Text
prettyTomlDecodeError [TomlDecodeError]
errs
prettyTomlDecodeError :: TomlDecodeError -> Text
prettyTomlDecodeError :: TomlDecodeError -> Text
prettyTomlDecodeError TomlDecodeError
de = Text
"tomland decode error: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> case TomlDecodeError
de of
BiMapError Key
name TomlBiMapError
biError -> Text
"BiMap error in key '" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Key -> Text
prettyKey Key
name Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"' : "
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> TomlBiMapError -> Text
prettyBiMapError TomlBiMapError
biError
KeyNotFound Key
name -> Text
"Key " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Key -> Text
prettyKey Key
name Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
" is not found"
TableNotFound Key
name -> Text
"Table [" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Key -> Text
prettyKey Key
name Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"] is not found"
TableArrayNotFound Key
name -> Text
"Table array [[" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Key -> Text
prettyKey Key
name Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"]] is not found"
ParseError (TomlParseError Text
msg) ->
Text
"Parse error during conversion from TOML to custom user type:\n " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
msg
NotExactDecode TOML
toml ->
Text
"The following fields are present in TOML but not used:\n"
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> TOML -> Text
pretty TOML
toml
data LoadTomlException = LoadTomlException !FilePath !Text
instance Show LoadTomlException where
show :: LoadTomlException -> String
show (LoadTomlException String
filePath Text
msg) = String
"Couldnt parse file " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
filePath String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
": " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Text -> String
forall a. Show a => a -> String
show Text
msg
instance Exception LoadTomlException