    -- | Like "Data.Aeson.QQ" but without interpolation.
    module Data.Aeson.QQ.Simple (aesonQQ) where

    import           Data.Aeson
    import qualified Data.Text                  as T
    import qualified Data.Text.Encoding         as TE
    import           Language.Haskell.TH
    import           Language.Haskell.TH.Quote
    import           Language.Haskell.TH.Syntax (Lift (..))
    import           Prelude                    ()
    import           Prelude.Compat

    aesonQQ :: QuasiQuoter
    aesonQQ :: QuasiQuoter
    aesonQQ = QuasiQuoter :: (String -> Q Exp)
    -> (String -> Q Pat)
    -> (String -> Q Type)
    -> (String -> Q [Dec])
    -> QuasiQuoter
    QuasiQuoter
        { quoteExp :: String -> Q Exp
    quoteExp  = String -> Q Exp
    aesonExp
        , quotePat :: String -> Q Pat
    quotePat  = Q Pat -> String -> Q Pat
    forall a b. a -> b -> a
    const (Q Pat -> String -> Q Pat) -> Q Pat -> String -> Q Pat
    forall a b. (a -> b) -> a -> b
    $ String -> Q Pat
    forall a. HasCallStack => String -> a
    error "No quotePat defined for jsonQQ"
        , quoteType :: String -> Q Type
    quoteType = Q Type -> String -> Q Type
    forall a b. a -> b -> a
    const (Q Type -> String -> Q Type) -> Q Type -> String -> Q Type
    forall a b. (a -> b) -> a -> b
    $ String -> Q Type
    forall a. HasCallStack => String -> a
    error "No quoteType defined for jsonQQ"
        , quoteDec :: String -> Q [Dec]
    quoteDec  = Q [Dec] -> String -> Q [Dec]
    forall a b. a -> b -> a
    const (Q [Dec] -> String -> Q [Dec]) -> Q [Dec] -> String -> Q [Dec]
    forall a b. (a -> b) -> a -> b
    $ String -> Q [Dec]
    forall a. HasCallStack => String -> a
    error "No quoteDec defined for jsonQQ"
        }

    aesonExp :: String -> ExpQ
    aesonExp :: String -> Q Exp
    aesonExp txt :: String
    txt =
      case ByteString -> Either String Value
    forall a. FromJSON a => ByteString -> Either String a
    eitherDecodeStrict (ByteString -> Either String Value)
    -> ByteString -> Either String Value
    forall a b. (a -> b) -> a -> b
    $ Text -> ByteString
    TE.encodeUtf8 (Text -> ByteString) -> Text -> ByteString
    forall a b. (a -> b) -> a -> b
    $ String -> Text
    T.pack String
    txt of
        Left err :: String
    err  -> String -> Q Exp
    forall a. HasCallStack => String -> a
    error (String -> Q Exp) -> String -> Q Exp
    forall a b. (a -> b) -> a -> b
    $ "Error in aesonExp: " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ String -> String
    forall a. Show a => a -> String
    show String
    err
        Right val :: Value
    val -> Value -> Q Exp
    forall t. Lift t => t -> Q Exp
    lift (Value
    val :: Value)