module Web.Twitter.Enumerator.Api
( api
, endpoint
, endpointSearch
, UserParam(..)
, ListParam(..)
, mkUserParam
, mkListParam
) where
import Web.Twitter.Enumerator.Types
import Web.Twitter.Enumerator.Monad
import Web.Twitter.Enumerator.Utils
import Network.HTTP.Enumerator
import qualified Network.HTTP.Types as HT
import Data.Enumerator (Iteratee, throwError, liftTrans)
import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as B8
import Control.Monad.Trans.Class
import Control.Monad.IO.Class (MonadIO (liftIO))
endpoint :: String
endpoint = "https://api.twitter.com/1/"
endpointSearch :: String
endpointSearch = "http://search.twitter.com/"
api :: Bool
-> ByteString
-> String
-> HT.Query
-> Iteratee ByteString IO a
-> Iteratee ByteString TW a
api toOAuth m url query iter = do
req <- lift $ apiRequest toOAuth m url query
httpMgr req (handleError iter)
where
handleError iter' st@(HT.Status sc _) _ =
if 200 <= sc && sc < 300
then iter'
else throwError $ HTTPStatusCodeException st
httpMgr :: Request IO
-> (HT.Status
-> HT.ResponseHeaders
-> Iteratee ByteString IO a)
-> Iteratee ByteString TW a
httpMgr req iterf = do
mgr <- lift getManager
liftTrans $ http req iterf mgr
apiRequest :: Bool -> ByteString -> String -> HT.Query -> TW (Request IO)
apiRequest toOAuth m uri query = do
p <- getProxy
req <- liftIO $ parseUrl uri >>= \r ->
return $ r { method = m, queryString = query, proxy = p }
if toOAuth then signOAuthTW req
else return req
data UserParam = UserIdParam UserId | ScreenNameParam String
deriving (Show, Eq)
data ListParam = ListIdParam Integer | ListNameParam String
deriving (Show, Eq)
mkUserParam :: UserParam -> HT.Query
mkUserParam (UserIdParam uid) = [("user_id", toMaybeByteString uid)]
mkUserParam (ScreenNameParam sn) = [("screen_name", Just . B8.pack $ sn)]
mkListParam :: ListParam -> HT.Query
mkListParam (ListIdParam lid) = [("list_id", toMaybeByteString lid)]
mkListParam (ListNameParam listname) =
[("slug", Just . B8.pack $ lstName),
("owner_screen_name", Just . B8.pack $ screenName)]
where
(screenName, ln) = span (/= '/') listname
lstName = drop 1 ln