module Data.Aeson.JSONPath
(
query
, queryQQ
, queryLocated
, queryLocatedQQ
, jsonPath
)
where
import qualified Text.ParserCombinators.Parsec as P
import Data.Aeson (Value)
import Data.Vector (Vector)
import Language.Haskell.TH.Quote (QuasiQuoter (..))
import Language.Haskell.TH.Syntax (lift)
import Data.Aeson.JSONPath.Query.Types (Query (..))
import Data.Aeson.JSONPath.Query (Queryable (..))
import Data.Aeson.JSONPath.Parser (pQuery)
import Prelude
jsonPath :: QuasiQuoter
jsonPath :: QuasiQuoter
jsonPath = QuasiQuoter
{ quoteExp :: String -> Q Exp
quoteExp = \String
q -> case Parsec String () Query
-> String -> String -> Either ParseError Query
forall s t a.
Stream s Identity t =>
Parsec s () a -> String -> s -> Either ParseError a
P.parse Parsec String () Query
pQuery (String
"failed to parse query: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
q) String
q of
Left ParseError
err -> String -> Q Exp
forall a. String -> Q a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Q Exp) -> String -> Q Exp
forall a b. (a -> b) -> a -> b
$ ParseError -> String
forall a. Show a => a -> String
show ParseError
err
Right Query
ex -> Query -> Q Exp
forall t (m :: * -> *). (Lift t, Quote m) => t -> m Exp
forall (m :: * -> *). Quote m => Query -> m Exp
lift Query
ex
, quotePat :: String -> Q Pat
quotePat = String -> String -> Q Pat
forall a. HasCallStack => String -> a
error String
"Error: quotePat"
, quoteType :: String -> Q Type
quoteType = String -> String -> Q Type
forall a. HasCallStack => String -> a
error String
"Error: quoteType"
, quoteDec :: String -> Q [Dec]
quoteDec = String -> String -> Q [Dec]
forall a. HasCallStack => String -> a
error String
"Error: quoteDec"
}
query :: String -> Value -> Either P.ParseError (Vector Value)
query :: String -> Value -> Either ParseError (Vector Value)
query String
q Value
root = do
Query
parsedQuery <- Parsec String () Query
-> String -> String -> Either ParseError Query
forall s t a.
Stream s Identity t =>
Parsec s () a -> String -> s -> Either ParseError a
P.parse Parsec String () Query
pQuery (String
"failed to parse query: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
q) String
q
Vector Value -> Either ParseError (Vector Value)
forall a. a -> Either ParseError a
forall (m :: * -> *) a. Monad m => a -> m a
return (Vector Value -> Either ParseError (Vector Value))
-> Vector Value -> Either ParseError (Vector Value)
forall a b. (a -> b) -> a -> b
$ Query -> Value -> Vector Value
queryQQ Query
parsedQuery Value
root
queryQQ :: Query -> Value -> Vector Value
queryQQ :: Query -> Value -> Vector Value
queryQQ Query
q Value
root = Query -> Value -> Value -> Vector Value
forall a. Queryable a => a -> Value -> Value -> Vector Value
query' Query
q Value
root Value
root
queryLocated :: String -> Value -> Either P.ParseError (Vector (String, Value))
queryLocated :: String -> Value -> Either ParseError (Vector (String, Value))
queryLocated String
q Value
root = do
Query
parsedQuery <- Parsec String () Query
-> String -> String -> Either ParseError Query
forall s t a.
Stream s Identity t =>
Parsec s () a -> String -> s -> Either ParseError a
P.parse Parsec String () Query
pQuery (String
"failed to parse query: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
q) String
q
Vector (String, Value)
-> Either ParseError (Vector (String, Value))
forall a. a -> Either ParseError a
forall (m :: * -> *) a. Monad m => a -> m a
return (Vector (String, Value)
-> Either ParseError (Vector (String, Value)))
-> Vector (String, Value)
-> Either ParseError (Vector (String, Value))
forall a b. (a -> b) -> a -> b
$ Query -> Value -> Vector (String, Value)
queryLocatedQQ Query
parsedQuery Value
root
queryLocatedQQ :: Query -> Value -> Vector (String, Value)
queryLocatedQQ :: Query -> Value -> Vector (String, Value)
queryLocatedQQ Query
q Value
root = Query -> Value -> Value -> String -> Vector (String, Value)
forall a.
Queryable a =>
a -> Value -> Value -> String -> Vector (String, Value)
queryLocated' Query
q Value
root Value
root String
"$"