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

import           Data.String (IsString(..))
import qualified Data.Text.Encoding as Text
import           Language.Haskell.TH.Quote (QuasiQuoter(..))
import           Language.Haskell.TH.Syntax (Lift(..))

import           Aeson.Match.QQ.Internal.Match
  ( Path
  , PathElem(..)
  , match
  , mismatch
  , mistype
  , 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 (Text -> ByteString
Text.encodeUtf8 (String -> Text
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"
  }