{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS -Wno-orphans #-}
module TextShow.Data.Aeson where

import Data.Aeson (Value(..))
import qualified Data.Aeson.Key as K
import qualified Data.Aeson.KeyMap as KM

import Prelude ()
import Prelude.Compat

import TextShow (TextShow(..), fromText, showbParen, showtToShowb, singleton)
import TextShow.Data.Scientific ()
import TextShow.Data.Vector ()

instance TextShow K.Key where
    showb :: Key -> Builder
showb = forall a. (a -> Text) -> a -> Builder
showtToShowb forall a. TextShow a => a -> Text
showt
    showt :: Key -> Text
showt = forall a. TextShow a => a -> Text
showt forall b c a. (b -> c) -> (a -> b) -> a -> c
. Key -> Text
K.toText

instance TextShow Value where
    showbPrec :: Int -> Value -> Builder
showbPrec Int
_ Value
Null = Text -> Builder
fromText Text
"Null"
    showbPrec Int
d (Bool Bool
b) = Bool -> Builder -> Builder
showbParen (Int
d forall a. Ord a => a -> a -> Bool
> Int
10)
        forall a b. (a -> b) -> a -> b
$ Text -> Builder
fromText Text
"Bool " forall a. Semigroup a => a -> a -> a
<> forall a. TextShow a => Int -> a -> Builder
showbPrec Int
11 Bool
b
    showbPrec Int
d (Number Scientific
s) = Bool -> Builder -> Builder
showbParen (Int
d forall a. Ord a => a -> a -> Bool
> Int
10)
        forall a b. (a -> b) -> a -> b
$ Text -> Builder
fromText Text
"Number " forall a. Semigroup a => a -> a -> a
<> forall a. TextShow a => Int -> a -> Builder
showbPrec Int
11 Scientific
s
    showbPrec Int
d (String Text
s) = Bool -> Builder -> Builder
showbParen (Int
d forall a. Ord a => a -> a -> Bool
> Int
10)
        forall a b. (a -> b) -> a -> b
$ Text -> Builder
fromText Text
"String " forall a. Semigroup a => a -> a -> a
<> forall a. TextShow a => Int -> a -> Builder
showbPrec Int
11 Text
s
    showbPrec Int
d (Array Array
xs) = Bool -> Builder -> Builder
showbParen (Int
d forall a. Ord a => a -> a -> Bool
> Int
10)
        forall a b. (a -> b) -> a -> b
$ Text -> Builder
fromText Text
"Array " forall a. Semigroup a => a -> a -> a
<> forall a. TextShow a => Int -> a -> Builder
showbPrec Int
11 Array
xs
    showbPrec Int
d (Object Object
xs) = Bool -> Builder -> Builder
showbParen (Int
d forall a. Ord a => a -> a -> Bool
> Int
10)
        forall a b. (a -> b) -> a -> b
$ Text -> Builder
fromText Text
"Object (fromList "
        forall a. Semigroup a => a -> a -> a
<> forall a. TextShow a => Int -> a -> Builder
showbPrec Int
11 (forall v. KeyMap v -> [(Key, v)]
KM.toAscList Object
xs)
        forall a. Semigroup a => a -> a -> a
<> Char -> Builder
singleton Char
')'