packages feed

arion-compose-0.2.2.0: src/haskell/lib/Arion/Aeson.hs

module Arion.Aeson where

import Data.Aeson
import Data.Aeson.Encode.Pretty
  ( confCompare,
    confTrailingNewline,
    defConfig,
  )
import qualified Data.Aeson.Encode.Pretty
import qualified Data.ByteString.Lazy as BL
import qualified Data.Text.Lazy as TL
import qualified Data.Text.Lazy.Builder as TB
import Protolude
import Prelude ()

pretty :: (ToJSON a) => a -> Text
pretty =
  TL.toStrict
    . TB.toLazyText
    . Data.Aeson.Encode.Pretty.encodePrettyToTextBuilder' config
  where
    config = defConfig {confCompare = compare, confTrailingNewline = True}

decodeFile :: (FromJSON a) => FilePath -> IO a
decodeFile fp = do
  b <- BL.readFile fp
  case eitherDecode b of
    Left e -> panic (toS e)
    Right v -> pure v