{-# OPTIONS_GHC -Wno-unused-do-bind #-}
module Data.Aeson.JSONPath.Parser
( JSPQuery (..)
, JSPSegment (..)
, JSPChildSegment (..)
, JSPSelector (..)
, JSPWildcardT (..)
, pJSPQuery
)
where
import qualified Text.ParserCombinators.Parsec as P
import Text.Read (read)
import Protolude
data JSPQuery
= JSPRoot [JSPSegment]
deriving (JSPQuery -> JSPQuery -> Bool
(JSPQuery -> JSPQuery -> Bool)
-> (JSPQuery -> JSPQuery -> Bool) -> Eq JSPQuery
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: JSPQuery -> JSPQuery -> Bool
== :: JSPQuery -> JSPQuery -> Bool
$c/= :: JSPQuery -> JSPQuery -> Bool
/= :: JSPQuery -> JSPQuery -> Bool
Eq, Int -> JSPQuery -> ShowS
[JSPQuery] -> ShowS
JSPQuery -> String
(Int -> JSPQuery -> ShowS)
-> (JSPQuery -> String) -> ([JSPQuery] -> ShowS) -> Show JSPQuery
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> JSPQuery -> ShowS
showsPrec :: Int -> JSPQuery -> ShowS
$cshow :: JSPQuery -> String
show :: JSPQuery -> String
$cshowList :: [JSPQuery] -> ShowS
showList :: [JSPQuery] -> ShowS
Show)
data JSPSegment
= JSPChildSeg JSPChildSegment
deriving (JSPSegment -> JSPSegment -> Bool
(JSPSegment -> JSPSegment -> Bool)
-> (JSPSegment -> JSPSegment -> Bool) -> Eq JSPSegment
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: JSPSegment -> JSPSegment -> Bool
== :: JSPSegment -> JSPSegment -> Bool
$c/= :: JSPSegment -> JSPSegment -> Bool
/= :: JSPSegment -> JSPSegment -> Bool
Eq, Int -> JSPSegment -> ShowS
[JSPSegment] -> ShowS
JSPSegment -> String
(Int -> JSPSegment -> ShowS)
-> (JSPSegment -> String)
-> ([JSPSegment] -> ShowS)
-> Show JSPSegment
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> JSPSegment -> ShowS
showsPrec :: Int -> JSPSegment -> ShowS
$cshow :: JSPSegment -> String
show :: JSPSegment -> String
$cshowList :: [JSPSegment] -> ShowS
showList :: [JSPSegment] -> ShowS
Show)
data JSPChildSegment
= JSPBracketed [JSPSelector]
| JSPMemberNameSH JSPNameSelector
| JSPSegWildcard JSPWildcardT
deriving (JSPChildSegment -> JSPChildSegment -> Bool
(JSPChildSegment -> JSPChildSegment -> Bool)
-> (JSPChildSegment -> JSPChildSegment -> Bool)
-> Eq JSPChildSegment
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: JSPChildSegment -> JSPChildSegment -> Bool
== :: JSPChildSegment -> JSPChildSegment -> Bool
$c/= :: JSPChildSegment -> JSPChildSegment -> Bool
/= :: JSPChildSegment -> JSPChildSegment -> Bool
Eq, Int -> JSPChildSegment -> ShowS
[JSPChildSegment] -> ShowS
JSPChildSegment -> String
(Int -> JSPChildSegment -> ShowS)
-> (JSPChildSegment -> String)
-> ([JSPChildSegment] -> ShowS)
-> Show JSPChildSegment
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> JSPChildSegment -> ShowS
showsPrec :: Int -> JSPChildSegment -> ShowS
$cshow :: JSPChildSegment -> String
show :: JSPChildSegment -> String
$cshowList :: [JSPChildSegment] -> ShowS
showList :: [JSPChildSegment] -> ShowS
Show)
data JSPSelector
= JSPNameSel JSPNameSelector
| JSPIndexSel JSPIndexSelector
| JSPSliceSel JSPSliceSelector
| JSPWildSel JSPWildcardT
deriving (JSPSelector -> JSPSelector -> Bool
(JSPSelector -> JSPSelector -> Bool)
-> (JSPSelector -> JSPSelector -> Bool) -> Eq JSPSelector
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: JSPSelector -> JSPSelector -> Bool
== :: JSPSelector -> JSPSelector -> Bool
$c/= :: JSPSelector -> JSPSelector -> Bool
/= :: JSPSelector -> JSPSelector -> Bool
Eq, Int -> JSPSelector -> ShowS
[JSPSelector] -> ShowS
JSPSelector -> String
(Int -> JSPSelector -> ShowS)
-> (JSPSelector -> String)
-> ([JSPSelector] -> ShowS)
-> Show JSPSelector
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> JSPSelector -> ShowS
showsPrec :: Int -> JSPSelector -> ShowS
$cshow :: JSPSelector -> String
show :: JSPSelector -> String
$cshowList :: [JSPSelector] -> ShowS
showList :: [JSPSelector] -> ShowS
Show)
data JSPWildcardT = JSPWildcard
deriving (JSPWildcardT -> JSPWildcardT -> Bool
(JSPWildcardT -> JSPWildcardT -> Bool)
-> (JSPWildcardT -> JSPWildcardT -> Bool) -> Eq JSPWildcardT
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: JSPWildcardT -> JSPWildcardT -> Bool
== :: JSPWildcardT -> JSPWildcardT -> Bool
$c/= :: JSPWildcardT -> JSPWildcardT -> Bool
/= :: JSPWildcardT -> JSPWildcardT -> Bool
Eq, Int -> JSPWildcardT -> ShowS
[JSPWildcardT] -> ShowS
JSPWildcardT -> String
(Int -> JSPWildcardT -> ShowS)
-> (JSPWildcardT -> String)
-> ([JSPWildcardT] -> ShowS)
-> Show JSPWildcardT
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> JSPWildcardT -> ShowS
showsPrec :: Int -> JSPWildcardT -> ShowS
$cshow :: JSPWildcardT -> String
show :: JSPWildcardT -> String
$cshowList :: [JSPWildcardT] -> ShowS
showList :: [JSPWildcardT] -> ShowS
Show)
type JSPNameSelector = Text
type JSPIndexSelector = Int
type JSPSliceSelector = (Maybe Int, Maybe Int, Int)
pJSPQuery :: P.Parser JSPQuery
pJSPQuery :: Parser JSPQuery
pJSPQuery = do
Char -> ParsecT String () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
P.char Char
'$'
[JSPSegment]
segs <- ParsecT String () Identity JSPSegment
-> ParsecT String () Identity [JSPSegment]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
P.many ParsecT String () Identity JSPSegment
pJSPSegment
JSPQuery -> Parser JSPQuery
forall a. a -> ParsecT String () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (JSPQuery -> Parser JSPQuery) -> JSPQuery -> Parser JSPQuery
forall a b. (a -> b) -> a -> b
$ [JSPSegment] -> JSPQuery
JSPRoot [JSPSegment]
segs
pJSPSelector :: P.Parser JSPSelector
pJSPSelector :: Parser JSPSelector
pJSPSelector = Parser JSPSelector -> Parser JSPSelector
forall tok st a. GenParser tok st a -> GenParser tok st a
P.try Parser JSPSelector
pJSPNameSel
Parser JSPSelector -> Parser JSPSelector -> Parser JSPSelector
forall a.
ParsecT String () Identity a
-> ParsecT String () Identity a -> ParsecT String () Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser JSPSelector -> Parser JSPSelector
forall tok st a. GenParser tok st a -> GenParser tok st a
P.try Parser JSPSelector
pJSPIndexSel
Parser JSPSelector -> Parser JSPSelector -> Parser JSPSelector
forall a.
ParsecT String () Identity a
-> ParsecT String () Identity a -> ParsecT String () Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser JSPSelector -> Parser JSPSelector
forall tok st a. GenParser tok st a -> GenParser tok st a
P.try Parser JSPSelector
pJSPSliceSel
Parser JSPSelector -> Parser JSPSelector -> Parser JSPSelector
forall a.
ParsecT String () Identity a
-> ParsecT String () Identity a -> ParsecT String () Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser JSPSelector -> Parser JSPSelector
forall tok st a. GenParser tok st a -> GenParser tok st a
P.try Parser JSPSelector
pJSPWildSel
pJSPNameSel :: P.Parser JSPSelector
pJSPNameSel :: Parser JSPSelector
pJSPNameSel = JSPNameSelector -> JSPSelector
JSPNameSel (JSPNameSelector -> JSPSelector)
-> (String -> JSPNameSelector) -> String -> JSPSelector
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> JSPNameSelector
forall a b. ConvertText a b => a -> b
toS (String -> JSPSelector)
-> ParsecT String () Identity String -> Parser JSPSelector
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Char -> ParsecT String () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
P.char Char
'"' ParsecT String () Identity Char
-> ParsecT String () Identity String
-> ParsecT String () Identity String
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT String () Identity Char
-> ParsecT String () Identity String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
P.many (String -> ParsecT String () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
P.noneOf String
"\"") ParsecT String () Identity String
-> ParsecT String () Identity Char
-> ParsecT String () Identity String
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> ParsecT String () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
P.char Char
'"')
pJSPIndexSel :: P.Parser JSPSelector
pJSPIndexSel :: Parser JSPSelector
pJSPIndexSel = do
Int
num <- Parser Int
pSignedInt
ParsecT String () Identity Char -> ParsecT String () Identity ()
forall s (m :: * -> *) t a u.
(Stream s m t, Show a) =>
ParsecT s u m a -> ParsecT s u m ()
P.notFollowedBy (ParsecT String () Identity Char -> ParsecT String () Identity ())
-> ParsecT String () Identity Char -> ParsecT String () Identity ()
forall a b. (a -> b) -> a -> b
$ Char -> ParsecT String () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
P.char Char
':'
JSPSelector -> Parser JSPSelector
forall a. a -> ParsecT String () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (JSPSelector -> Parser JSPSelector)
-> JSPSelector -> Parser JSPSelector
forall a b. (a -> b) -> a -> b
$ Int -> JSPSelector
JSPIndexSel Int
num
pJSPSliceSel :: P.Parser JSPSelector
pJSPSliceSel :: Parser JSPSelector
pJSPSliceSel = do
Maybe Int
start <- Parser Int -> ParsecT String () Identity (Maybe Int)
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m (Maybe a)
P.optionMaybe Parser Int
pSignedInt
Char -> ParsecT String () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
P.char Char
':'
Maybe Int
end <- Parser Int -> ParsecT String () Identity (Maybe Int)
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m (Maybe a)
P.optionMaybe Parser Int
pSignedInt
Maybe (Maybe Int)
step <- ParsecT String () Identity (Maybe Int)
-> ParsecT String () Identity (Maybe (Maybe Int))
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m (Maybe a)
P.optionMaybe (Char -> ParsecT String () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
P.char Char
':' ParsecT String () Identity Char
-> ParsecT String () Identity (Maybe Int)
-> ParsecT String () Identity (Maybe Int)
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Int -> ParsecT String () Identity (Maybe Int)
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m (Maybe a)
P.optionMaybe Parser Int
pSignedInt)
JSPSelector -> Parser JSPSelector
forall a. a -> ParsecT String () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (JSPSelector -> Parser JSPSelector)
-> JSPSelector -> Parser JSPSelector
forall a b. (a -> b) -> a -> b
$ JSPSliceSelector -> JSPSelector
JSPSliceSel (Maybe Int
start, Maybe Int
end, case Maybe (Maybe Int)
step of
Just (Just Int
n) -> Int
n
Maybe (Maybe Int)
_ -> Int
1)
pJSPWildSel :: P.Parser JSPSelector
pJSPWildSel :: Parser JSPSelector
pJSPWildSel = JSPWildcardT -> JSPSelector
JSPWildSel (JSPWildcardT -> JSPSelector)
-> ParsecT String () Identity JSPWildcardT -> Parser JSPSelector
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (String -> ParsecT String () Identity String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
P.string String
".*" ParsecT String () Identity String
-> JSPWildcardT -> ParsecT String () Identity JSPWildcardT
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> JSPWildcardT
JSPWildcard)
pJSPSegment :: P.Parser JSPSegment
pJSPSegment :: ParsecT String () Identity JSPSegment
pJSPSegment = ParsecT String () Identity JSPSegment
pJSPChildSegment
pJSPChildSegment :: P.Parser JSPSegment
pJSPChildSegment :: ParsecT String () Identity JSPSegment
pJSPChildSegment =
JSPChildSegment -> JSPSegment
JSPChildSeg (JSPChildSegment -> JSPSegment)
-> ParsecT String () Identity JSPChildSegment
-> ParsecT String () Identity JSPSegment
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (ParsecT String () Identity JSPChildSegment
-> ParsecT String () Identity JSPChildSegment
forall tok st a. GenParser tok st a -> GenParser tok st a
P.try ParsecT String () Identity JSPChildSegment
pJSPBracketed
ParsecT String () Identity JSPChildSegment
-> ParsecT String () Identity JSPChildSegment
-> ParsecT String () Identity JSPChildSegment
forall a.
ParsecT String () Identity a
-> ParsecT String () Identity a -> ParsecT String () Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ParsecT String () Identity JSPChildSegment
-> ParsecT String () Identity JSPChildSegment
forall tok st a. GenParser tok st a -> GenParser tok st a
P.try ParsecT String () Identity JSPChildSegment
pJSPMemberNameSH
ParsecT String () Identity JSPChildSegment
-> ParsecT String () Identity JSPChildSegment
-> ParsecT String () Identity JSPChildSegment
forall a.
ParsecT String () Identity a
-> ParsecT String () Identity a -> ParsecT String () Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ParsecT String () Identity JSPChildSegment
-> ParsecT String () Identity JSPChildSegment
forall tok st a. GenParser tok st a -> GenParser tok st a
P.try ParsecT String () Identity JSPChildSegment
pJSPWildSeg)
pJSPBracketed :: P.Parser JSPChildSegment
pJSPBracketed :: ParsecT String () Identity JSPChildSegment
pJSPBracketed = do
Char -> ParsecT String () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
P.char Char
'['
JSPSelector
sel <- Parser JSPSelector
pJSPSelector
[JSPSelector]
optionalSels <- Parser JSPSelector -> ParsecT String () Identity [JSPSelector]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
P.many Parser JSPSelector
pCommaSepSelectors
Char -> ParsecT String () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
P.char Char
']'
JSPChildSegment -> ParsecT String () Identity JSPChildSegment
forall a. a -> ParsecT String () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (JSPChildSegment -> ParsecT String () Identity JSPChildSegment)
-> JSPChildSegment -> ParsecT String () Identity JSPChildSegment
forall a b. (a -> b) -> a -> b
$ [JSPSelector] -> JSPChildSegment
JSPBracketed (JSPSelector
selJSPSelector -> [JSPSelector] -> [JSPSelector]
forall a. a -> [a] -> [a]
:[JSPSelector]
optionalSels)
where
pCommaSepSelectors :: P.Parser JSPSelector
pCommaSepSelectors :: Parser JSPSelector
pCommaSepSelectors = Char -> ParsecT String () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
P.char Char
',' ParsecT String () Identity Char
-> ParsecT String () Identity () -> ParsecT String () Identity ()
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT String () Identity ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
P.spaces ParsecT String () Identity ()
-> Parser JSPSelector -> Parser JSPSelector
forall a b.
ParsecT String () Identity a
-> ParsecT String () Identity b -> ParsecT String () Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser JSPSelector
pJSPSelector
pJSPMemberNameSH :: P.Parser JSPChildSegment
pJSPMemberNameSH :: ParsecT String () Identity JSPChildSegment
pJSPMemberNameSH = do
Char -> ParsecT String () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
P.char Char
'.'
JSPNameSelector
val <- String -> JSPNameSelector
forall a b. ConvertText a b => a -> b
toS (String -> JSPNameSelector)
-> ParsecT String () Identity String
-> ParsecT String () Identity JSPNameSelector
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT String () Identity Char
-> ParsecT String () Identity String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
P.many1 (ParsecT String () Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
P.alphaNum ParsecT String () Identity Char
-> ParsecT String () Identity Char
-> ParsecT String () Identity Char
forall a.
ParsecT String () Identity a
-> ParsecT String () Identity a -> ParsecT String () Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String -> ParsecT String () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
P.oneOf String
"_$@")
JSPChildSegment -> ParsecT String () Identity JSPChildSegment
forall a. a -> ParsecT String () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (JSPNameSelector -> JSPChildSegment
JSPMemberNameSH JSPNameSelector
val)
pJSPWildSeg :: P.Parser JSPChildSegment
pJSPWildSeg :: ParsecT String () Identity JSPChildSegment
pJSPWildSeg = JSPWildcardT -> JSPChildSegment
JSPSegWildcard (JSPWildcardT -> JSPChildSegment)
-> ParsecT String () Identity JSPWildcardT
-> ParsecT String () Identity JSPChildSegment
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (String -> ParsecT String () Identity String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
P.string String
".*" ParsecT String () Identity String
-> JSPWildcardT -> ParsecT String () Identity JSPWildcardT
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> JSPWildcardT
JSPWildcard)
pSignedInt :: P.Parser Int
pSignedInt :: Parser Int
pSignedInt = do
Maybe Char
sign <- ParsecT String () Identity Char
-> ParsecT String () Identity (Maybe Char)
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m (Maybe a)
P.optionMaybe (ParsecT String () Identity Char
-> ParsecT String () Identity (Maybe Char))
-> ParsecT String () Identity Char
-> ParsecT String () Identity (Maybe Char)
forall a b. (a -> b) -> a -> b
$ Char -> ParsecT String () Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
P.char Char
'-'
Int
num <- String -> Int
forall a. Read a => String -> a
read (String -> Int) -> ParsecT String () Identity String -> Parser Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT String () Identity Char
-> ParsecT String () Identity String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
P.many1 ParsecT String () Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
P.digit
Int -> Parser Int
forall a. a -> ParsecT String () Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (Int -> Parser Int) -> Int -> Parser Int
forall a b. (a -> b) -> a -> b
$
case Maybe Char
sign of
Just Char
_ -> -Int
1 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
num
Maybe Char
Nothing -> Int
num