{-# 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||]