{-|
Module: Capnp.Errors
Description: Error handling utilities
-}
{-# LANGUAGE FlexibleInstances    #-}
{-# LANGUAGE UndecidableInstances #-}
module Capnp.Errors
    ( Error(..)
    )
  where

import Control.Monad.Catch      (Exception)
import Data.Text.Encoding.Error (UnicodeException)

-- | An error that may occur when processing a capnproto message.
data Error
    -- | A 'BoundsError' indicates an attempt to access an illegal
    -- index 'index' within a sequence of length 'maxIndex'.
    = BoundsError
        { Error -> Int
index    :: !Int
        , Error -> Int
maxIndex :: !Int
        -- TODO: choose a better name than maxIndex; this is confusing
        -- since it's supposed to be the length, rather than the maximum
        -- legal index. The latter would make it impossible to represent
        -- an error for an empty sequence. I(zenhack) also think there may
        -- be places in the library where we are misusing this field.
        }
    -- | A 'RecursionLimitError' indicates that the recursion depth limit
    -- was exceeded.
    | RecursionLimitError
    -- | A 'TraversalLimitError' indicates that the traversal limit was
    -- exceeded.
    | TraversalLimitError
    -- | An 'InvalidDataError' indicates that a part of a message being
    -- parsed was malformed. The argument to the data constructor is a
    -- human-readable error message.
    | InvalidDataError String
    -- | A 'SizeError' indicates that an operation would have resulted in
    -- a message that violated the library's limit on either segment size
    -- or number of segments.
    | SizeError
    -- | A 'SchemaViolationError' indicates that part of the message does
    -- not match the schema. The argument to the data construtor is a
    -- human-readable error message.
    | SchemaViolationError String
    -- | An 'InvalidUtf8Error' indicates that a text value in the message
    -- was invalid utf8.
    --
    -- Note well: Most parts of the library don't actually check for valid
    -- utf8 -- don't assume the check is made unless an interface says it is.
    | InvalidUtf8Error UnicodeException
    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, Error -> Error -> Bool
(Error -> Error -> Bool) -> (Error -> Error -> Bool) -> Eq Error
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Error -> Error -> Bool
$c/= :: Error -> Error -> Bool
== :: Error -> Error -> Bool
$c== :: Error -> Error -> Bool
Eq)

instance Exception Error