packages feed

hix-0.1.0.0: lib/Hix/Json.hs

module Hix.Json where

import Control.Monad.Trans.Class (lift)
import Control.Monad.Trans.Except (throwE)
import qualified Data.Aeson as Aeson
import Data.Aeson (FromJSON, fromJSON)
import Exon (exon)

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

jsonConfig ::
  FromJSON a =>
  JsonConfig ->
  M a
jsonConfig (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 = lift . throwE . GhciError