packages feed

hix-0.9.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.Json (JsonConfig (..))
import Hix.Data.Monad (M)
import Hix.Monad (fatalError)

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

jsonConfigE :: FromJSON a => Either a JsonConfig -> M a
jsonConfigE = either pure jsonConfig