{-# LANGUAGE PatternSynonyms #-}

module Prolude.Aeson
  ( -- * Aeson re-exports
    -- $aeson
    module Data.Aeson
    -- * Alias types
    -- $alias
  , JsonOptions
  , JsonValue
    -- * Pattern synonyms
    -- $pattern
  , pattern JsonArray
  , pattern JsonBoolean
  , pattern JsonNull
  , pattern JsonNumber
  , pattern JsonObject
  , pattern JsonString
  )
where

import Data.Aeson
  ( FromJSON
  , ToJSON
  , fromJSON
  , genericParseJSON
  , genericToJSON
  , parseJSON
  , toJSON
  , (.!=)
  , (.:)
  , (.:?)
  , (.=)
  )
import qualified Data.Aeson as Aeson
import qualified Data.Bool as Bool
import qualified Data.Scientific as Scientific
import qualified Data.Text as Text
import qualified Data.Vector as Vector

{- $aeson
These are our re-exports from Aeson. They include: The FromJSON and ToJSON classes; Generic JSON parsing; (.!=), (.:), (.:?), (.=)
-}

{- $alias
We created type aliases for Aeson.Options and Aeson.Value.
-}

{- $pattern
We created pattern synonyms for the Aeson.Value constructors.
-}

type JsonOptions = Aeson.Options
type JsonValue = Aeson.Value

pattern JsonNull :: JsonValue
pattern $bJsonNull :: JsonValue
$mJsonNull :: forall {r}. JsonValue -> ((# #) -> r) -> ((# #) -> r) -> r
JsonNull = Aeson.Null

pattern JsonBoolean :: Bool.Bool -> JsonValue
pattern $bJsonBoolean :: Bool -> JsonValue
$mJsonBoolean :: forall {r}. JsonValue -> (Bool -> r) -> ((# #) -> r) -> r
JsonBoolean x = Aeson.Bool x

pattern JsonNumber :: Scientific.Scientific -> JsonValue
pattern $bJsonNumber :: Scientific -> JsonValue
$mJsonNumber :: forall {r}. JsonValue -> (Scientific -> r) -> ((# #) -> r) -> r
JsonNumber x = Aeson.Number x

pattern JsonString :: Text.Text -> JsonValue
pattern $bJsonString :: Text -> JsonValue
$mJsonString :: forall {r}. JsonValue -> (Text -> r) -> ((# #) -> r) -> r
JsonString x = Aeson.String x

pattern JsonArray :: Vector.Vector JsonValue -> JsonValue
pattern $bJsonArray :: Vector JsonValue -> JsonValue
$mJsonArray :: forall {r}.
JsonValue -> (Vector JsonValue -> r) -> ((# #) -> r) -> r
JsonArray x = Aeson.Array x

pattern JsonObject :: Aeson.Object -> JsonValue
pattern $bJsonObject :: Object -> JsonValue
$mJsonObject :: forall {r}. JsonValue -> (Object -> r) -> ((# #) -> r) -> r
JsonObject x = Aeson.Object x

{-# COMPLETE
  JsonNull,
  JsonBoolean,
  JsonNumber,
  JsonString,
  JsonArray,
  JsonObject #-}