kubernetes-client-0.2.0.0: src/Kubernetes/Data/K8sJSONPath.hs
{-# LANGUAGE OverloadedStrings #-}
module Kubernetes.Data.K8sJSONPath where
import Data.Aeson
import Data.Aeson.Text
import Data.JSONPath
import Data.Monoid ((<>))
import Data.Text as Text
import Control.Applicative ((<|>))
import Data.Attoparsec.Text
import Data.Text.Lazy (toStrict)
data K8sPathElement = PlainText Text
| JSONPath [JSONPathElement]
deriving (Show, Eq)
k8sJSONPath :: Parser [K8sPathElement]
k8sJSONPath = many1 pathElementParser
pathElementParser :: Parser K8sPathElement
pathElementParser = jsonpathParser <|> plainTextParser
plainTextParser :: Parser K8sPathElement
plainTextParser = PlainText <$> takeWhile1 (/= '{')
jsonpathParser :: Parser K8sPathElement
jsonpathParser = JSONPath <$> (char '{' *> jsonPath <* char '}')
runJSONPath :: [K8sPathElement] -> Value -> Either String Text
runJSONPath [] _ = pure ""
runJSONPath (e:es) v = do
res <- runPathElement e v
rest <- runJSONPath es v
pure $ res <> rest
runPathElement :: K8sPathElement -> Value -> Either String Text
runPathElement (PlainText t) _ = pure t
runPathElement (JSONPath p) v = encodeResult $ executeJSONPath p v
encodeResult :: ExecutionResult Value -> Either String Text
encodeResult (ResultValue val) = return $ jsonToText val
encodeResult (ResultList vals) = return $ (intercalate " " $ Prelude.map jsonToText vals)
encodeResult (ResultError err) = Left err
jsonToText :: Value -> Text
jsonToText (String t) = t
jsonToText x = toStrict $ encodeToLazyText x