module Network.Factual.API
(
makeRequest
, generateToken
, Token(..)
) where
import Data.Maybe (fromJust)
import Network.OAuth.Consumer
import Network.OAuth.Http.Request (Request(..), parseURL, fromList)
import Network.OAuth.Http.Response (Response(..))
import Network.OAuth.Http.CurlHttpClient (CurlClient(..))
import Data.Aeson (Value, decode)
import Data.Factual.Query
import Data.Factual.Credentials
import qualified Data.Factual.Response as F
makeRequest :: (Query query) => Token -> query -> IO F.Response
makeRequest token query = do
let fullpath = "http://api.v3.factual.com" ++ toPath query
let request = generateRequest fullpath
response <- runOAuthM token $ setupOAuth request
return $ F.fromValue $ extractJSON response
generateToken :: Credentials -> Token
generateToken (Credentials key secret) = fromApplication $ Application key secret OOB
generateRequest :: String -> Request
generateRequest url = (fromJust $ parseURL url) { reqHeaders = (fromList headersList) }
setupOAuth :: Request -> OAuthMonadT IO Response
setupOAuth request = do
oauthRequest <- signRq2 HMACSHA1 Nothing request
serviceRequest CurlClient oauthRequest
extractJSON :: Response -> Value
extractJSON = fromJust . decode . rspPayload
headersList :: [(String, String)]
headersList = [("X-Factual-Lib", "factual-haskell-driver-0.1.2")]