module Aeson.Match.QQ
  ( Value(..)
  , Array
  , Object
  , Box(..)
  , TypeSig(..)
  , Type(..)
  , Nullable(..)
  , Path
  , PathElem(..)
  , parse
  , qq
  , match
  , mismatch
  , missingPathElem
  , extraArrayValues
  , extraObjectValues
  ) where

import           Data.String (IsString(..))
import           Language.Haskell.TH.Quote (QuasiQuoter(..))
import           Language.Haskell.TH.Syntax (Lift(..))

import           Aeson.Match.QQ.Internal.Match (Path, PathElem(..), match, mismatch, missingPathElem, extraArrayValues, extraObjectValues)
import           Aeson.Match.QQ.Internal.Parse (parse)
import           Aeson.Match.QQ.Internal.Value (Value(..), Box(..), Array, Object, TypeSig(..), Type(..), Nullable(..))


qq :: QuasiQuoter
qq :: QuasiQuoter
qq = QuasiQuoter :: (String -> Q Exp)
-> (String -> Q Pat)
-> (String -> Q Type)
-> (String -> Q [Dec])
-> QuasiQuoter
QuasiQuoter
  { quoteExp :: String -> Q Exp
quoteExp = \String
str ->
      case ByteString -> Either String (Value Exp)
parse (String -> ByteString
forall a. IsString a => String -> a
fromString String
str) of
        Left String
err ->
          String -> Q Exp
forall a. HasCallStack => String -> a
error (String
"Aeson.Match.QQ.qq: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
err)
        Right Value Exp
val ->
          Value Exp -> Q Exp
forall t. Lift t => t -> Q Exp
lift Value Exp
val
  , quotePat :: String -> Q Pat
quotePat =
      \String
_ -> String -> Q Pat
forall a. HasCallStack => String -> a
error String
"Aeson.Match.QQ.qq: no quotePat"
  , quoteType :: String -> Q Type
quoteType =
      \String
_ -> String -> Q Type
forall a. HasCallStack => String -> a
error String
"Aeson.Match.QQ.qq: no quoteType"
  , quoteDec :: String -> Q [Dec]
quoteDec =
      \String
_ -> String -> Q [Dec]
forall a. HasCallStack => String -> a
error String
"Aeson.Match.QQ.qq: no quoteDec"
  }