pa-json 0.1.0.0 → 0.1.1.0
raw patch · 2 files changed
+42/−1 lines, 2 filesdep +aeson-prettydep +bytestringPVP ok
version bump matches the API change (PVP)
Dependencies added: aeson-pretty, bytestring
API changes (from Hackage documentation)
+ Json.Enc: encToBytesUtf8 :: Enc -> ByteString
+ Json.Enc: encToBytesUtf8Lazy :: Enc -> ByteString
+ Json.Enc: encToTextPretty :: Enc -> Text
+ Json.Enc: encToTextPrettyLazy :: Enc -> Text
+ Json.Enc: instance GHC.Show.Show Json.Enc.Enc
Files
- pa-json.cabal +3/−1
- src/Json/Enc.hs +39/−0
pa-json.cabal view
@@ -1,7 +1,7 @@ cabal-version: 3.0 -- !!! ATTN: file autogenerated from pa-template.cabal.mustache on toplevel !!! name: pa-json-version: 0.1.0.0+version: 0.1.1.0 synopsis: Our JSON parsers/encoders description: The interface of `aeson` is unfortunately extremely … suboptimal. Here’s some wrappers trying to improve the situation, which we use internally. license: BSD-3-Clause@@ -77,7 +77,9 @@ pa-label, pa-error-tree, aeson,+ aeson-pretty, aeson-better-errors,+ bytestring, containers, scientific, time,
src/Json/Enc.hs view
@@ -4,15 +4,21 @@ module Json.Enc where import Data.Aeson (Encoding, Value (..))+import Data.Aeson qualified as Json+import Data.Aeson.Encode.Pretty qualified as Aeson.Pretty import Data.Aeson.Encoding qualified as AesonEnc+import Data.Aeson.Encoding qualified as Json.Enc+import Data.Aeson.Encoding qualified as Json.Encoding import Data.Aeson.Key qualified as Key import Data.Aeson.KeyMap (KeyMap) import Data.Aeson.KeyMap qualified as KeyMap+import Data.ByteString.Lazy qualified as LazyBytes import Data.Int (Int64) import Data.Map.Strict qualified as Map import Data.Scientific import Data.String (IsString (fromString)) import Data.Text.Lazy qualified as Lazy+import Data.Text.Lazy.Builder qualified as Text.Builder import Data.Time qualified as Time import Data.Time.Format.ISO8601 qualified as ISO8601 import GHC.TypeLits@@ -25,6 +31,9 @@ newtype Enc = Enc {unEnc :: Encoding} deriving (Num, Fractional) via (NumLiteralOnly "Enc" Enc) +instance Show Enc where+ show e = e.unEnc & Json.Encoding.encodingToLazyByteString & bytesToTextUtf8UnsafeLazy & show+ -- | You can create an @Enc any@ that renders an 'Aeson.String' value with @OverloadedStrings@. instance IsString Enc where fromString = Enc . AesonEnc.string@@ -39,6 +48,34 @@ instance RationalLiteral Enc where rationalLiteral r = Enc $ AesonEnc.scientific (r & fromRational @Scientific) +-- | Convert an 'Enc' to a strict UTF8-bytestring which is valid JSON (minified).+encToBytesUtf8 :: Enc -> ByteString+encToBytesUtf8 enc = enc & encToBytesUtf8Lazy & toStrictBytes++-- | Convert an 'Enc' to a lazy UTF8-bytestring which is valid JSON (minified).+encToBytesUtf8Lazy :: Enc -> LazyBytes.ByteString+encToBytesUtf8Lazy enc = enc.unEnc & Json.Enc.encodingToLazyByteString++-- | Convert an 'Enc' to a strict Text which is valid JSON (prettyfied).+encToTextPretty :: Enc -> Text+encToTextPretty enc =+ enc+ & encToTextPrettyLazy+ & toStrict++-- | Convert an 'Enc' to a lazy Text which is valid JSON (prettyfied).+encToTextPrettyLazy :: Enc -> Lazy.Text+encToTextPrettyLazy enc =+ enc+ & encToBytesUtf8Lazy+ & Json.decode @Json.Value+ & annotate "the json parser can’t parse json encodings??"+ & unwrapError+ & Aeson.Pretty.encodePrettyToTextBuilder+ & Text.Builder.toLazyText++-- | * Encoders+ -- | Embed an 'Encoding' verbatim (it’s a valid JSON value) encoding :: Encoding -> Enc encoding = Enc@@ -184,6 +221,8 @@ utcTime :: Time.UTCTime -> Enc utcTime = text . stringToText . ISO8601.iso8601Show @Time.UTCTime++-- | * Helpers -- | Implement this class if you want your type to only implement the part of 'Num' -- that allows creating them from Integer-literals, then derive Num via 'NumLiteralOnly':