use std::convert::TryFrom;
use super::*;
use crate::common::RateLimit;
use crate::cursor::{CursorIter, ListCursor, UserCursor};
use crate::error::{Error::TwitterError, Result};
use crate::user::{TwitterUser, UserID};
use crate::{auth, links, tweet};
pub fn memberships<T: Into<UserID>>(user: T, token: &auth::Token) -> CursorIter<ListCursor> {
let params = ParamList::new().add_user_param(user.into());
CursorIter::new(links::lists::MEMBERSHIPS, token, Some(params), Some(20))
}
pub async fn list<'id, T: Into<UserID>>(
user: T,
owned_first: bool,
token: &auth::Token,
) -> Result<Response<Vec<List>>> {
let params = ParamList::new()
.add_user_param(user.into())
.add_param("reverse", owned_first.to_string());
let req = get(links::lists::LIST, token, Some(¶ms));
request_with_json_response(req).await
}
pub fn subscriptions<T: Into<UserID>>(user: T, token: &auth::Token) -> CursorIter<ListCursor> {
let params = ParamList::new().add_user_param(user.into());
CursorIter::new(links::lists::SUBSCRIPTIONS, token, Some(params), Some(20))
}
pub fn ownerships<T: Into<UserID>>(user: T, token: &auth::Token) -> CursorIter<ListCursor> {
let params = ParamList::new().add_user_param(user.into());
CursorIter::new(links::lists::OWNERSHIPS, token, Some(params), Some(20))
}
pub async fn show(list: ListID, token: &auth::Token) -> Result<Response<List>> {
let params = ParamList::new().add_list_param(list);
let req = get(links::lists::SHOW, token, Some(¶ms));
request_with_json_response(req).await
}
pub fn members<'a>(list: ListID, token: &auth::Token) -> CursorIter<UserCursor> {
let params = ParamList::new().add_list_param(list);
CursorIter::new(links::lists::MEMBERS, token, Some(params), Some(20))
}
pub fn subscribers<'a>(list: ListID, token: &auth::Token) -> CursorIter<UserCursor> {
let params = ParamList::new().add_list_param(list);
CursorIter::new(links::lists::SUBSCRIBERS, token, Some(params), Some(20))
}
pub async fn is_subscribed<'id, T: Into<UserID>>(
user: T,
list: ListID,
token: &auth::Token,
) -> Result<Response<bool>> {
let params = ParamList::new()
.add_list_param(list)
.add_user_param(user.into());
let req = get(links::lists::IS_SUBSCRIBER, token, Some(¶ms));
let out = request_with_json_response::<TwitterUser>(req).await;
match out {
Ok(user) => Ok(Response::map(user, |_| true)),
Err(TwitterError(headers, terrs)) => {
if terrs.errors.iter().any(|e| e.code == 109) {
Ok(Response::new(RateLimit::try_from(&headers)?, false))
} else {
Err(TwitterError(headers, terrs))
}
}
Err(err) => Err(err),
}
}
pub async fn is_member<'id, T: Into<UserID>>(
user: T,
list: ListID,
token: &auth::Token,
) -> Result<Response<bool>> {
let params = ParamList::new()
.add_list_param(list)
.add_user_param(user.into());
let req = get(links::lists::IS_MEMBER, token, Some(¶ms));
let out = request_with_json_response::<TwitterUser>(req).await;
match out {
Ok(resp) => Ok(Response::map(resp, |_| true)),
Err(TwitterError(headers, errors)) => {
if errors.errors.iter().any(|e| e.code == 109) {
Ok(Response::new(RateLimit::try_from(&headers)?, false))
} else {
Err(TwitterError(headers, errors))
}
}
Err(err) => Err(err),
}
}
pub fn statuses(list: ListID, with_rts: bool, token: &auth::Token) -> tweet::Timeline {
let params = ParamList::new()
.add_list_param(list)
.add_param("include_rts", with_rts.to_string());
tweet::Timeline::new(links::lists::STATUSES, Some(params), token)
}
pub async fn add_member<'id, T: Into<UserID>>(
list: ListID,
user: T,
token: &auth::Token,
) -> Result<Response<List>> {
let params = ParamList::new()
.add_list_param(list)
.add_user_param(user.into());
let req = post(links::lists::ADD, token, Some(¶ms));
request_with_json_response(req).await
}
pub async fn add_member_list<'id, T, I>(
members: I,
list: ListID,
token: &auth::Token,
) -> Result<Response<List>>
where
T: Into<UserID>,
I: IntoIterator<Item = T>,
{
let (id_param, name_param) = multiple_names_param(members);
let params = ParamList::new()
.add_list_param(list)
.add_opt_param(
"user_id",
if !id_param.is_empty() {
Some(id_param)
} else {
None
},
)
.add_opt_param(
"screen_name",
if !name_param.is_empty() {
Some(name_param)
} else {
None
},
);
let req = post(links::lists::ADD_LIST, token, Some(¶ms));
request_with_json_response(req).await
}
pub async fn remove_member<'id, T: Into<UserID>>(
list: ListID,
user: T,
token: &auth::Token,
) -> Result<Response<List>> {
let params = ParamList::new()
.add_list_param(list)
.add_user_param(user.into());
let req = post(links::lists::REMOVE_MEMBER, token, Some(¶ms));
request_with_json_response(req).await
}
pub async fn remove_member_list<T, I>(
members: I,
list: ListID,
token: &auth::Token,
) -> Result<Response<List>>
where
T: Into<UserID>,
I: IntoIterator<Item = T>,
{
let (id_param, name_param) = multiple_names_param(members);
let params = ParamList::new()
.add_list_param(list)
.add_opt_param(
"user_id",
if !id_param.is_empty() {
Some(id_param)
} else {
None
},
)
.add_opt_param(
"screen_name",
if !name_param.is_empty() {
Some(name_param)
} else {
None
},
);
let req = post(links::lists::REMOVE_LIST, token, Some(¶ms));
request_with_json_response(req).await
}
pub async fn create(
name: String,
public: bool,
desc: Option<String>,
token: &auth::Token,
) -> Result<Response<List>> {
let params = ParamList::new()
.add_param("name", name)
.add_param("mode", if public { "public" } else { "private" })
.add_opt_param("description", desc);
let req = post(links::lists::CREATE, token, Some(¶ms));
request_with_json_response(req).await
}
pub async fn delete(list: ListID, token: &auth::Token) -> Result<Response<List>> {
let params = ParamList::new().add_list_param(list);
let req = post(links::lists::DELETE, token, Some(¶ms));
request_with_json_response(req).await
}
pub async fn subscribe(list: ListID, token: &auth::Token) -> Result<Response<List>> {
let params = ParamList::new().add_list_param(list);
let req = post(links::lists::SUBSCRIBE, token, Some(¶ms));
request_with_json_response(req).await
}
pub async fn unsubscribe(list: ListID, token: &auth::Token) -> Result<Response<List>> {
let params = ParamList::new().add_list_param(list);
let req = post(links::lists::UNSUBSCRIBE, token, Some(¶ms));
request_with_json_response(req).await
}
pub fn update(list: ListID) -> ListUpdate {
ListUpdate {
list: list,
name: None,
public: None,
desc: None,
}
}