module Aeson.Match.QQ
  ( Value(..)
  , Array
  , Object
  , Box(..)
  , 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)


qq :: QuasiQuoter
qq = QuasiQuoter
  { quoteExp = \str ->
      case parse (fromString str) of
        Left err ->
          error ("Aeson.Match.QQ.qq: " ++ err)
        Right val ->
          lift val
  , quotePat =
      \_ -> error "Aeson.Match.QQ.qq: no quotePat"
  , quoteType =
      \_ -> error "Aeson.Match.QQ.qq: no quoteType"
  , quoteDec =
      \_ -> error "Aeson.Match.QQ.qq: no quoteDec"
  }