{-# LANGUAGE DeriveLift #-}

module Argo.Internal.Json.Value where

import Control.Applicative ((<|>))

import qualified Argo.Internal.Json.Array as Array
import qualified Argo.Internal.Json.Boolean as Boolean
import qualified Argo.Internal.Json.Null as Null
import qualified Argo.Internal.Json.Number as Number
import qualified Argo.Internal.Json.Object as Object
import qualified Argo.Internal.Json.String as String
import qualified Argo.Internal.Type.Decoder as Decoder
import qualified Argo.Internal.Type.Encoder as Encoder
import qualified Argo.Vendor.DeepSeq as DeepSeq
import qualified Argo.Vendor.TemplateHaskell as TH
import qualified Data.String

-- | A JSON (JavaScript Object Notation) value, as described by RFC 8259.
-- <https://datatracker.ietf.org/doc/html/rfc8259>
data Value
    = Null Null.Null
    | Boolean Boolean.Boolean
    | Number Number.Number
    | String String.String
    | Array (Array.Array Value)
    | Object (Object.Object Value)
    deriving (Value -> Value -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Value -> Value -> Bool
$c/= :: Value -> Value -> Bool
== :: Value -> Value -> Bool
$c== :: Value -> Value -> Bool
Eq, forall t.
(forall (m :: * -> *). Quote m => t -> m Exp)
-> (forall (m :: * -> *). Quote m => t -> Code m t) -> Lift t
forall (m :: * -> *). Quote m => Value -> m Exp
forall (m :: * -> *). Quote m => Value -> Code m Value
liftTyped :: forall (m :: * -> *). Quote m => Value -> Code m Value
$cliftTyped :: forall (m :: * -> *). Quote m => Value -> Code m Value
lift :: forall (m :: * -> *). Quote m => Value -> m Exp
$clift :: forall (m :: * -> *). Quote m => Value -> m Exp
TH.Lift, Int -> Value -> ShowS
[Value] -> ShowS
Value -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Value] -> ShowS
$cshowList :: [Value] -> ShowS
show :: Value -> String
$cshow :: Value -> String
showsPrec :: Int -> Value -> ShowS
$cshowsPrec :: Int -> Value -> ShowS
Show)

instance DeepSeq.NFData Value where
    rnf :: Value -> ()
rnf Value
x = case Value
x of
        Null Null
y -> forall a. NFData a => a -> ()
DeepSeq.rnf Null
y
        Boolean Boolean
y -> forall a. NFData a => a -> ()
DeepSeq.rnf Boolean
y
        Number Number
y -> forall a. NFData a => a -> ()
DeepSeq.rnf Number
y
        String String
y -> forall a. NFData a => a -> ()
DeepSeq.rnf String
y
        Array Array Value
y -> forall a. NFData a => a -> ()
DeepSeq.rnf Array Value
y
        Object Object Value
y -> forall a. NFData a => a -> ()
DeepSeq.rnf Object Value
y

instance Data.String.IsString Value where
    fromString :: String -> Value
fromString = String -> Value
String forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. IsString a => String -> a
Data.String.fromString

encode :: Value -> Encoder.Encoder ()
encode :: Value -> Encoder ()
encode Value
x = case Value
x of
    Null Null
y -> Null -> Encoder ()
Null.encode Null
y
    Boolean Boolean
y -> Boolean -> Encoder ()
Boolean.encode Boolean
y
    Number Number
y -> Number -> Encoder ()
Number.encode Number
y
    String String
y -> String -> Encoder ()
String.encode String
y
    Array Array Value
y -> forall value. (value -> Encoder ()) -> Array value -> Encoder ()
Array.encode Value -> Encoder ()
encode Array Value
y
    Object Object Value
y -> forall value. (value -> Encoder ()) -> Object value -> Encoder ()
Object.encode Value -> Encoder ()
encode Object Value
y

decode :: Decoder.Decoder Value
decode :: Decoder Value
decode =
    (Null -> Value
Null forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Decoder Null
Null.decode)
        forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (Boolean -> Value
Boolean forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Decoder Boolean
Boolean.decode)
        forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (Number -> Value
Number forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Decoder Number
Number.decode)
        forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (String -> Value
String forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Decoder String
String.decode)
        forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (Array Value -> Value
Array forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall value. Decoder value -> Decoder (Array value)
Array.decode Decoder Value
decode)
        forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (Object Value -> Value
Object forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall value. Decoder value -> Decoder (Object value)
Object.decode Decoder Value
decode)