use super::*;
use helix::RequestGet;
#[derive(PartialEq, Eq, Deserialize, Serialize, Clone, Debug)]
#[cfg_attr(feature = "typed-builder", derive(typed_builder::TypedBuilder))]
#[must_use]
#[non_exhaustive]
pub struct GetUsersRequest<'a> {
#[cfg_attr(
feature = "typed-builder",
builder(default_code = "types::Collection::default()", setter(into))
)]
#[cfg_attr(feature = "deser_borrow", serde(borrow = "'a"))]
#[cfg_attr(not(feature = "deser_borrow"), serde(bound(deserialize = "'de: 'a")))]
pub id: types::Collection<'a, types::UserId>,
#[cfg_attr(
feature = "typed-builder",
builder(default_code = "types::Collection::default()", setter(into))
)]
#[cfg_attr(feature = "deser_borrow", serde(borrow = "'a"))]
pub login: types::Collection<'a, types::UserName>,
}
impl<'a> GetUsersRequest<'a> {
pub fn logins(login: impl Into<types::Collection<'a, types::UserName>>) -> Self {
Self {
id: types::Collection::default(),
login: login.into(),
}
}
pub fn ids(ids: impl Into<types::Collection<'a, types::UserId>>) -> Self {
Self {
id: ids.into(),
login: types::Collection::default(),
}
}
pub fn new() -> Self {
Self {
id: types::Collection::default(),
login: types::Collection::default(),
}
}
}
#[derive(PartialEq, Eq, Deserialize, Serialize, Debug, Clone)]
#[cfg_attr(feature = "deny_unknown_fields", serde(deny_unknown_fields))]
#[non_exhaustive]
pub struct User {
pub broadcaster_type: Option<types::BroadcasterType>,
pub created_at: types::Timestamp,
pub description: Option<String>,
pub display_name: types::DisplayName,
pub email: Option<String>,
pub id: types::UserId,
pub login: types::UserName,
pub offline_image_url: Option<String>,
pub profile_image_url: Option<String>,
#[serde(rename = "type")]
pub type_: Option<types::UserType>,
#[deprecated(
since = "0.7.0",
note = "removed, see https://discuss.dev.twitch.tv/t/get-users-api-endpoint-view-count-deprecation/37777"
)]
#[serde(default)]
pub view_count: usize,
}
impl Request for GetUsersRequest<'_> {
type Response = Vec<User>;
#[cfg(feature = "twitch_oauth2")]
const OPT_SCOPE: &'static [twitch_oauth2::Scope] = &[twitch_oauth2::Scope::UserReadEmail];
const PATH: &'static str = "users";
#[cfg(feature = "twitch_oauth2")]
const SCOPE: twitch_oauth2::Validator = twitch_oauth2::validator![];
}
impl RequestGet for GetUsersRequest<'_> {}
#[cfg(test)]
#[test]
fn test_request() {
use helix::*;
let ids: &[&types::UserIdRef] = &["44322889".into()];
let req = GetUsersRequest::ids(ids);
let data = br#"
{
"data": [
{
"id": "141981764",
"login": "twitchdev",
"display_name": "TwitchDev",
"type": "",
"broadcaster_type": "partner",
"description": "Supporting third-party developers building Twitch integrations from chatbots to game integrations.",
"profile_image_url": "https://static-cdn.jtvnw.net/jtv_user_pictures/8a6381c7-d0c0-4576-b179-38bd5ce1d6af-profile_image-300x300.png",
"offline_image_url": "https://static-cdn.jtvnw.net/jtv_user_pictures/3f13ab61-ec78-4fe6-8481-8682cb3b0ac2-channel_offline_image-1920x1080.png",
"view_count": 5980557,
"email": "not-real@email.com",
"created_at": "2016-12-14T20:32:28.894263Z"
}
]
}
"#
.to_vec();
let http_response = http::Response::builder().body(data).unwrap();
let uri = req.get_uri().unwrap();
assert_eq!(
uri.to_string(),
"https://api.twitch.tv/helix/users?id=44322889"
);
dbg!(GetUsersRequest::parse_response(Some(req), &uri, http_response).unwrap());
}