    -- | Like @<https://hackage.haskell.org/package/aeson-qq/docs/Data-Aeson-QQ.html 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 (..))

    -- | Converts a string representation of a JSON value into 'Data.Aeson.Value' at compile-time.
    --
    -- @
    -- {-\# LANGUAGE QuasiQuotes \#-}
    --
    -- import Data.Aeson (Value)
    -- import Data.Aeson.QQ.Simple
    --
    -- joe :: 'Value'
    -- joe = [aesonQQ|{ "name": \"Joe\", "age": 12 }|]
    -- @
    aesonQQ :: QuasiQuoter
    aesonQQ :: QuasiQuoter
    aesonQQ = 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 String
    "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 String
    "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 String
    "No quoteDec defined for jsonQQ"
        }

    aesonExp :: String -> ExpQ
    aesonExp :: String -> Q Exp
    aesonExp 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 String
    err  -> String -> Q Exp
    forall a. HasCallStack => String -> a
    error (String -> Q Exp) -> String -> Q Exp
    forall a b. (a -> b) -> a -> b
    $ String
    "Error in aesonExp: " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ String -> String
    forall a. Show a => a -> String
    show String
    err
        Right Value
    val -> Value -> Q Exp
    forall t (m :: * -> *). (Lift t, Quote m) => t -> m Exp
    forall (m :: * -> *). Quote m => Value -> m Exp
    lift (Value
    val :: Value)