packages feed

atlassian-connect-descriptor-0.2.0.0: tests/ValueExtractors.hs

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"