{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}

module Json.Error
  ( -- * Types
    Error(..)
    -- * Encoding
  , encode
  , builderUtf8
  ) where

import Data.Bytes.Builder (Builder)
import Data.Text.Short (ShortText)
import Json.Context (Context(..))
import Data.ByteString.Short.Internal (ShortByteString(SBS))

import qualified Data.Bytes.Builder as Builder
import qualified Data.Bytes.Chunks as ByteChunks
import qualified Data.Primitive as PM
import qualified Data.Text.Short.Unsafe as TS
import qualified Json.Context as Context

-- | A single error message.
data Error = Error
  { Error -> ShortText
message :: !ShortText
  , Error -> Context
context :: !Context
  } deriving (Error -> Error -> Bool
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,Int -> Error -> ShowS
[Error] -> ShowS
Error -> String
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)

ba2st :: PM.ByteArray -> ShortText
{-# inline ba2st #-}
ba2st :: ByteArray -> ShortText
ba2st (PM.ByteArray ByteArray#
x) = ShortByteString -> ShortText
TS.fromShortByteStringUnsafe (ByteArray# -> ShortByteString
SBS ByteArray#
x)

encode :: Error -> ShortText
encode :: Error -> ShortText
encode Error
p = ByteArray -> ShortText
ba2st (Chunks -> ByteArray
ByteChunks.concatU (Int -> Builder -> Chunks
Builder.run Int
128 (Error -> Builder
builderUtf8 Error
p)))

builderUtf8 :: Error -> Builder
builderUtf8 :: Error -> Builder
builderUtf8 Error{ShortText
message :: ShortText
$sel:message:Error :: Error -> ShortText
message,Context
context :: Context
$sel:context:Error :: Error -> Context
context}
  =  Context -> Builder
Context.builderUtf8 Context
context
  forall a. Semigroup a => a -> a -> a
<> Char -> Char -> Builder
Builder.ascii2 Char
':' Char
' '
  forall a. Semigroup a => a -> a -> a
<> ShortText -> Builder
Builder.shortTextUtf8 ShortText
message