packages feed

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
  }