module Text.EasyJson.Combinators where
import Data.Monoid
import Data.HashMap.Strict (HashMap)
import qualified Data.HashMap.Strict as H
import Data.String (IsString(..))
import Data.Text (Text)
import qualified Data.Text as T
import Data.Vector (Vector)
import qualified Data.Vector as V
import Text.EasyJson.AST
import Text.EasyJson.Parser
type JError = Text
type JReader = Either JError
showT :: Show a => a -> Text
showT = T.pack . show
json :: Text -> JReader Json
json s = case parseIt (T.unpack s) of
Left perr -> Left $ "Parse error: " <> showT perr
Right j -> return j
key :: Text -> Json -> JReader Json
key k j = case j of
Object o -> case H.lookup k o of
Just j -> return j
Nothing -> Left $ "No key '" <> k <> "'"
_ -> Left $ "Expected an object, but got " <> jsonType j
index :: Int -> Json -> JReader Json
index i j = case j of
Array a
| i < V.length a -> return $ a V.! i
| otherwise -> Left $ "Index " <> showT i <> " out of range"
_ -> Left $ "Expected an array, but got " <> jsonType j
letter :: Int -> Json -> JReader Char
letter i j = case j of
String s
| i < T.length s -> return $ T.index s i
| otherwise -> Left $ "Index " <> showT i <> " out of range"
_ -> Left $ "Expected a string, but got " <> jsonType j
array :: Json -> JReader (Vector Json)
array j = case j of
Array a -> return a
_ -> Left $ "Expected an array, but got " <> jsonType j
object :: Json -> JReader (HashMap Text Json)
object j = case j of
Object o -> return o
_ -> Left $ "Expected an object, but got " <> jsonType j
number :: Json -> JReader Double
number j = case j of
Number n -> return n
_ -> Left $ "Expected a number, but got " <> jsonType j
string :: Json -> JReader Text
string j = case j of
String s -> return s
_ -> Left $ "Expected a string, but got " <> jsonType j
bool :: Json -> JReader Bool
bool j = case j of
Bool b -> return b
_ -> Left $ "Expected a bool, but got " <> jsonType j
null :: Json -> JReader ()
null j = case j of
Null -> return ()
_ -> Left $ "Expected a null, but got " <> jsonType j