{-# LANGUAGE LambdaCase #-}

module Data.Hermes.SIMDJSON.Types
  ( -- * simdjson Opaque Types
    Array(..)
  , ArrayIter(..)
  , Document(..)
  , InputBuffer(..)
  , JSONArray
  , JSONArrayIter
  , JSONObject
  , JSONObjectIter
  , JSONValue
  , Object(..)
  , ObjectIter(..)
  , PaddedString
  , Parser(..)
  , SIMDDocument
  , SIMDErrorCode(..)
  , SIMDParser
  , Value(..)
  , ValueType(..)
  )
  where

import           Foreign.Ptr (Ptr)

-- | A reference to an opaque simdjson::ondemand::parser.
newtype Parser = Parser (Ptr SIMDParser)

-- | A reference to an opaque simdjson::ondemand::document.
newtype Document = Document (Ptr SIMDDocument)

-- | A reference to an opaque simdjson::padded_string.
newtype InputBuffer = InputBuffer (Ptr PaddedString)

-- | A reference to an opaque simdjson::ondemand::value.
newtype Value = Value (Ptr JSONValue)

-- | A reference to an opaque simdjson::ondemand::object.
newtype Object = Object (Ptr JSONObject)

-- | A reference to an opaque simdjson::ondemand::array.
newtype Array = Array (Ptr JSONArray)

-- | A reference to an opaque simdjson::ondemand::array_iterator.
newtype ArrayIter = ArrayIter (Ptr JSONArrayIter)

-- | A reference to an opaque simdjson::ondemand::object_iterator.
newtype ObjectIter = ObjectIter (Ptr JSONObjectIter)

-- | Phantom type for a pointer to simdjson::ondemand::parser.
data SIMDParser

-- | Phantom type for a pointer to simdjson::ondemand::document.
data SIMDDocument

-- | Phantom type for a pointer to simdjson::padded_string.
data PaddedString

-- | Phantom type for a pointer to simdjson::ondemand::value.
data JSONValue

-- | Phantom type for a pointer to simdjson::ondemand::object.
data JSONObject

-- | Phantom type for a pointer to simdjson::ondemand::array.
data JSONArray

-- | Phantom type for a pointer to simdjson::ondemand::array_iterator
data JSONArrayIter

-- | Phantom type for a pointer to simdjson::ondemand::object_iterator
data JSONObjectIter

-- | Enum for simdjson errors.
data SIMDErrorCode =
    SUCCESS
  | CAPACITY
  | MEMALLOC
  | TAPE_ERROR
  | DEPTH_ERROR
  | STRING_ERROR
  | T_ATOM_ERROR
  | F_ATOM_ERROR
  | N_ATOM_ERROR
  | NUMBER_ERROR
  | UTF8_ERROR
  | UNINITIALIZED
  | EMPTY
  | UNESCAPED_CHARS
  | UNCLOSED_STRING
  | UNSUPPORTED_ARCHITECTURE
  | INCORRECT_TYPE
  | NUMBER_OUT_OF_RANGE
  | INDEX_OUT_OF_BOUNDS
  | NO_SUCH_FIELD
  | IO_ERROR
  | INVALID_JSON_POINTER
  | INVALID_URI_FRAGMENT
  | UNEXPECTED_ERROR
  | PARSER_IN_USE
  | OUT_OF_ORDER_ITERATION
  | INSUFFICIENT_PADDING
  | INCOMPLETE_ARRAY_OR_OBJECT
  | SCALAR_DOCUMENT_AS_VALUE
  | OUT_OF_BOUNDS
  | TRAILING_CONTENT
  deriving (SIMDErrorCode -> SIMDErrorCode -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SIMDErrorCode -> SIMDErrorCode -> Bool
$c/= :: SIMDErrorCode -> SIMDErrorCode -> Bool
== :: SIMDErrorCode -> SIMDErrorCode -> Bool
$c== :: SIMDErrorCode -> SIMDErrorCode -> Bool
Eq, Int -> SIMDErrorCode -> ShowS
[SIMDErrorCode] -> ShowS
SIMDErrorCode -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SIMDErrorCode] -> ShowS
$cshowList :: [SIMDErrorCode] -> ShowS
show :: SIMDErrorCode -> String
$cshow :: SIMDErrorCode -> String
showsPrec :: Int -> SIMDErrorCode -> ShowS
$cshowsPrec :: Int -> SIMDErrorCode -> ShowS
Show, SIMDErrorCode
forall a. a -> a -> Bounded a
maxBound :: SIMDErrorCode
$cmaxBound :: SIMDErrorCode
minBound :: SIMDErrorCode
$cminBound :: SIMDErrorCode
Bounded, Int -> SIMDErrorCode
SIMDErrorCode -> Int
SIMDErrorCode -> [SIMDErrorCode]
SIMDErrorCode -> SIMDErrorCode
SIMDErrorCode -> SIMDErrorCode -> [SIMDErrorCode]
SIMDErrorCode -> SIMDErrorCode -> SIMDErrorCode -> [SIMDErrorCode]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: SIMDErrorCode -> SIMDErrorCode -> SIMDErrorCode -> [SIMDErrorCode]
$cenumFromThenTo :: SIMDErrorCode -> SIMDErrorCode -> SIMDErrorCode -> [SIMDErrorCode]
enumFromTo :: SIMDErrorCode -> SIMDErrorCode -> [SIMDErrorCode]
$cenumFromTo :: SIMDErrorCode -> SIMDErrorCode -> [SIMDErrorCode]
enumFromThen :: SIMDErrorCode -> SIMDErrorCode -> [SIMDErrorCode]
$cenumFromThen :: SIMDErrorCode -> SIMDErrorCode -> [SIMDErrorCode]
enumFrom :: SIMDErrorCode -> [SIMDErrorCode]
$cenumFrom :: SIMDErrorCode -> [SIMDErrorCode]
fromEnum :: SIMDErrorCode -> Int
$cfromEnum :: SIMDErrorCode -> Int
toEnum :: Int -> SIMDErrorCode
$ctoEnum :: Int -> SIMDErrorCode
pred :: SIMDErrorCode -> SIMDErrorCode
$cpred :: SIMDErrorCode -> SIMDErrorCode
succ :: SIMDErrorCode -> SIMDErrorCode
$csucc :: SIMDErrorCode -> SIMDErrorCode
Enum)

data ValueType =
    VArray
  | VObject
  | VNumber
  | VString
  | VBoolean
  | VNull
  deriving (ValueType -> ValueType -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ValueType -> ValueType -> Bool
$c/= :: ValueType -> ValueType -> Bool
== :: ValueType -> ValueType -> Bool
$c== :: ValueType -> ValueType -> Bool
Eq, ValueType
forall a. a -> a -> Bounded a
maxBound :: ValueType
$cmaxBound :: ValueType
minBound :: ValueType
$cminBound :: ValueType
Bounded, Int -> ValueType -> ShowS
[ValueType] -> ShowS
ValueType -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ValueType] -> ShowS
$cshowList :: [ValueType] -> ShowS
show :: ValueType -> String
$cshow :: ValueType -> String
showsPrec :: Int -> ValueType -> ShowS
$cshowsPrec :: Int -> ValueType -> ShowS
Show)

instance Enum ValueType where
  fromEnum :: ValueType -> Int
fromEnum
    = \case
    ValueType
VArray   -> Int
1
    ValueType
VObject  -> Int
2
    ValueType
VNumber  -> Int
3
    ValueType
VString  -> Int
4
    ValueType
VBoolean -> Int
5
    ValueType
VNull    -> Int
6
  toEnum :: Int -> ValueType
toEnum
    = \case
    Int
1 -> ValueType
VArray
    Int
2 -> ValueType
VObject
    Int
3 -> ValueType
VNumber
    Int
4 -> ValueType
VString
    Int
5 -> ValueType
VBoolean
    Int
6 -> ValueType
VNull
    Int
_ -> forall a. HasCallStack => String -> a
error String
"unknown int for Value type"