module ValueExtractors where import Control.Applicative import Data.Aeson import qualified Data.HashMap.Strict as M import Data.Maybe (isJust) import qualified Data.Scientific as S import qualified Data.Text as T import qualified Data.Vector as V get :: T.Text -> Value -> IO Value get key (Object o) = maybe notFound return $ M.lookup key o where notFound = fail $ "Could not find a value in object with key: " ++ T.unpack key get key _ = fail $ "The value was not an object when looking for: " ++ T.unpack key fieldIsPresent :: T.Text -> Value -> IO Bool fieldIsPresent key (Object o) = return . isJust $ M.lookup key o fieldIsPresent key _ = fail $ "The value was not an object when looking for: " ++ T.unpack key fieldIsNotPresent :: T.Text -> Value -> IO Bool fieldIsNotPresent key value = not <$> fieldIsPresent key value getArray :: Value -> IO [Value] getArray (Array v) = return . V.toList $ v getArray v = fail $ "Value is not an array. It is a: " ++ valueAsString v getString :: Value -> IO T.Text getString (String s) = return s getString v = fail $ "Value is not a string value. It is a: " ++ valueAsString v getBool :: Value -> IO Bool getBool (Bool b) = return b getBool v = fail $ "Value is not a boolean. It is a: " ++ valueAsString v isObject :: Value -> Bool isObject (Object _) = True isObject _ = False isArray :: Value -> Bool isArray (Array _) = True isArray _ = False getNumber :: Value -> IO S.Scientific getNumber (Number n) = return n getNumber v = fail $ "Value is not a number. It is a: " ++ valueAsString v valueAsString :: Value -> String valueAsString (Object _) = "Object" valueAsString (Array _) = "Array" valueAsString (Bool _) = "Bool" valueAsString (String _) = "String" valueAsString (Number _) = "Number" valueAsString Null = "Null"