{-# LANGUAGE TemplateHaskell #-}
module Data.Aeson.THReader where

import Data.Aeson
import Language.Haskell.TH.Syntax
import TH.RelativePaths

readJSONFromFile :: (FromJSON a, Lift a) => String -> Code Q a
readJSONFromFile :: forall a. (FromJSON a, Lift a) => String -> Code Q a
readJSONFromFile String
name = Q (TExp a) -> Code Q a
forall a (m :: * -> *). m (TExp a) -> Code m a
liftCode (Q (TExp a) -> Code Q a) -> Q (TExp a) -> Code Q a
forall a b. (a -> b) -> a -> b
$ do
    ByteString
contents <- String -> Q ByteString
qReadFileLBS String
name
    case ByteString -> Either String a
forall a. FromJSON a => ByteString -> Either String a
eitherDecode ByteString
contents of
        Left String
err  -> String -> Q (TExp a)
forall a. String -> Q a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
err
        Right a
res -> Code Q a -> Q (TExp a)
forall (m :: * -> *) a. Code m a -> m (TExp a)
examineCode [||a
res||]