packages feed

hix-0.7.0: lib/Hix/Json.hs

module Hix.Json where

import qualified Data.Aeson as Aeson
import Data.Aeson (FromJSON, fromJSON)
import Exon (exon)

import Hix.Data.Error (Error)
import Hix.Data.Monad (M)
import Hix.Monad (throwM)
import Hix.Optparse (JsonConfig (JsonConfig))

jsonConfig ::
  FromJSON a =>
  (Text -> Error) ->
  JsonConfig ->
  M a
jsonConfig consError (JsonConfig mv) =
  liftIO mv >>= \case
    Left msg -> failure [exon|Invalid JSON: #{toText msg}|]
    Right v -> case fromJSON v of
      Aeson.Success a -> pure a
      Aeson.Error err -> failure [exon|Invalid JSON: #{toText err}
#{show v}|]
  where
    failure = throwM . consError

jsonConfigE ::
  FromJSON a =>
  (Text -> Error) ->
  Either a JsonConfig ->
  M a
jsonConfigE consError =
  either pure (jsonConfig consError)