module Arion.Aeson where

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

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