module Data.Factual.Response
(
Response(..)
, fromValue
, toList
, lookupNumber
, lookupString
, lookupValue
, lookupValueSafe
, Value
) where
import Data.Maybe (fromJust)
import Data.Aeson
import Data.Attoparsec.Number
import qualified Data.HashMap.Lazy as L
import qualified Data.Text as T
import qualified Data.Vector as V
data Response = Response { status :: String
, version :: Double
, response :: Value
, errorMessage :: Maybe String
, errorType :: Maybe String
} deriving (Eq, Show)
fromValue :: Value -> Response
fromValue value
| respStatus == "error" = formErrorResponse value
| otherwise = formValidResponse value
where respStatus = lookupString "status" value
toList :: Value -> [Value]
toList (Array a) = V.toList a
toList v = [v]
lookupNumber :: String -> Value -> Double
lookupNumber key hashmap = extractNumber $ lookupValue key hashmap
lookupString :: String -> Value -> String
lookupString key hashmap = extractString $ lookupValue key hashmap
lookupValue :: String -> Value -> Value
lookupValue key hashmap = fromJust $ lookupValueSafe key hashmap
lookupValueSafe :: String -> Value -> Maybe Value
lookupValueSafe key (Object x) = L.lookup (T.pack key) x
formErrorResponse :: Value -> Response
formErrorResponse value = Response { status = "error"
, version = lookupNumber "version" value
, response = Null
, errorMessage = Just $ lookupString "message" value
, errorType = Just $ lookupString "error_type" value }
formValidResponse :: Value -> Response
formValidResponse value = Response { status = "ok"
, version = lookupNumber "version" value
, response = lookupValue "response" value
, errorMessage = Nothing
, errorType = Nothing }
extractString :: Value -> String
extractString (String x) = T.unpack x
extractNumber :: Value -> Double
extractNumber (Number x) = toDouble x
toDouble :: Number -> Double
toDouble (I x) = fromIntegral x
toDouble (D x) = x