module Web.Twitter.Conduit.Parameters
( Parameters (..)
, HasSinceIdParam (..)
, HasCountParam (..)
, HasMaxIdParam (..)
, HasPageParam (..)
, HasCursorParam (..)
, HasTrimUserParam (..)
, HasExcludeRepliesParam (..)
, HasContributorDetailsParam (..)
, HasIncludeEntitiesParam (..)
, HasIncludeUserEntitiesParam (..)
, HasIncludeRtsParam (..)
, HasIncludeMyRetweetParam (..)
, HasInReplyToStatusIdParam (..)
, HasDisplayCoordinatesParam (..)
, HasPossiblySensitiveParam (..)
, HasLangParam (..)
, HasLocaleParam (..)
, HasUntilParam (..)
, HasSkipStatusParam (..)
, HasFollowParam (..)
, HasMapParam (..)
, HasMediaIdsParam (..)
, UserParam(..)
, UserListParam(..)
, ListParam(..)
, mkUserParam
, mkUserListParam
, mkListParam
) where
import Prelude as P
import Web.Twitter.Conduit.Parameters.Internal
import Web.Twitter.Conduit.Parameters.TH
import Web.Twitter.Types
import Data.Time.Calendar (Day)
import Data.Text.Strict.Lens
import Data.Text (Text)
import Control.Lens
import qualified Network.HTTP.Types as HT
import qualified Data.ByteString.Char8 as S8
data UserParam = UserIdParam UserId | ScreenNameParam String
deriving (Show, Eq)
data UserListParam = UserIdListParam [UserId] | ScreenNameListParam [String]
deriving (Show, Eq)
data ListParam = ListIdParam Integer | ListNameParam String
deriving (Show, Eq)
defineHasParamClass "count" ''Integer 'readShow
defineHasParamClass "since_id" ''Integer 'readShow
defineHasParamClass "max_id" ''Integer 'readShow
defineHasParamClass "page" ''Integer 'readShow
defineHasParamClass "cursor" ''Integer 'readShow
defineHasParamClass "trim_user" ''Bool 'booleanQuery
defineHasParamClass "exclude_replies" ''Bool 'booleanQuery
defineHasParamClass "contributor_details" ''Bool 'booleanQuery
defineHasParamClass "include_entities" ''Bool 'booleanQuery
defineHasParamClass "include_user_entities" ''Bool 'booleanQuery
defineHasParamClass "include_rts" ''Bool 'booleanQuery
defineHasParamClass "include_my_retweet" ''Bool 'booleanQuery
defineHasParamClass "in_reply_to_status_id" ''StatusId 'readShow
defineHasParamClass "display_coordinates" ''Bool 'booleanQuery
defineHasParamClass "possibly_sensitive" ''Bool 'booleanQuery
defineHasParamClass "lang" ''Text 'utf8
defineHasParamClass "locale" ''Text 'utf8
defineHasParamClass "until" ''Day 'readShow
defineHasParamClass "skip_status" ''Bool 'booleanQuery
defineHasParamClass "follow" ''Bool 'booleanQuery
defineHasParamClass "map" ''Bool 'booleanQuery
defineHasParamClass' "media_ids" [t|[Integer]|] 'integerArrayQuery
mkUserParam :: UserParam -> HT.SimpleQuery
mkUserParam (UserIdParam uid) = [("user_id", readShow # uid)]
mkUserParam (ScreenNameParam sn) = [("screen_name", S8.pack sn)]
mkUserListParam :: UserListParam -> HT.SimpleQuery
mkUserListParam (UserIdListParam uids) = [("user_id", uids ^.. traversed . re readShow & S8.intercalate ",")]
mkUserListParam (ScreenNameListParam sns) = [("screen_name", S8.intercalate "," . P.map S8.pack $ sns)]
mkListParam :: ListParam -> HT.SimpleQuery
mkListParam (ListIdParam lid) = [("list_id", readShow # lid)]
mkListParam (ListNameParam listname) =
[("slug", S8.pack lstName),
("owner_screen_name", S8.pack screenName)]
where
(screenName, ln) = span (/= '/') listname
lstName = drop 1 ln