rattletrap-11.2.3: src/lib/Rattletrap/Utility/Json.hs
{- hlint ignore "Avoid restricted flags" -}
{-# OPTIONS_GHC -Wno-orphans #-}
{- hlint ignore "Avoid restricted extensions" -}
{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleInstances #-}
module Rattletrap.Utility.Json
( module Rattletrap.Utility.Json
, Aeson.FromJSON(parseJSON)
, Aeson.ToJSON(toJSON)
, Aeson.Value
, Aeson.encode
, Aeson.object
, Aeson.withObject
, Aeson.withText
) where
import qualified Data.Aeson as Aeson
import qualified Data.Aeson.Encode.Pretty as Aeson
import qualified Data.Aeson.Types as Aeson
import qualified Data.ByteString as ByteString
import qualified Data.ByteString.Lazy as LazyByteString
# if MIN_VERSION_aeson(2, 0, 0)
import qualified Data.Aeson.Key as Key
toKey :: String -> Key.Key
toKey = Key.fromString
fromKey :: Key.Key -> String
fromKey = Key.toString
# else
import qualified Data.Text as Text
toKey :: String -> Text.Text
toKey = Text.pack
fromKey :: Text.Text -> String
fromKey = Text.unpack
# endif
instance Aeson.KeyValue (String, Aeson.Value) where
k .= v = (fromKey k, Aeson.toJSON v)
required
:: Aeson.FromJSON value => Aeson.Object -> String -> Aeson.Parser value
required object key = object Aeson..: toKey key
optional
:: Aeson.FromJSON value
=> Aeson.Object
-> String
-> Aeson.Parser (Maybe value)
optional object key = object Aeson..:? toKey key
pair :: (Aeson.ToJSON value, Aeson.KeyValue pair) => String -> value -> pair
pair key value = toKey key Aeson..= value
decode :: Aeson.FromJSON a => ByteString.ByteString -> Either String a
decode = Aeson.eitherDecodeStrict'
encodePretty :: Aeson.ToJSON a => a -> LazyByteString.ByteString
encodePretty = Aeson.encodePretty' Aeson.defConfig
{ Aeson.confCompare = compare
, Aeson.confIndent = Aeson.Tab
, Aeson.confTrailingNewline = True
}