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 GetCustomRewardRedemptionRequest<'a> {
#[cfg_attr(feature = "typed-builder", builder(setter(into)))]
#[cfg_attr(feature = "deser_borrow", serde(borrow = "'a"))]
pub broadcaster_id: Cow<'a, types::UserIdRef>,
#[cfg_attr(feature = "typed-builder", builder(setter(into)))]
#[cfg_attr(feature = "deser_borrow", serde(borrow = "'a"))]
pub reward_id: Option<Cow<'a, types::RewardIdRef>>,
#[cfg_attr(feature = "typed-builder", builder(default, setter(into)))]
pub status: Option<CustomRewardRedemptionStatus>,
#[cfg_attr(feature = "typed-builder", builder(setter(into), default))]
#[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::RedemptionId>,
#[cfg_attr(feature = "typed-builder", builder(default))]
pub sort: Option<GetCustomRewardRedemptionSortOrder>,
#[cfg_attr(feature = "typed-builder", builder(default))]
#[cfg_attr(feature = "deser_borrow", serde(borrow = "'a"))]
pub after: Option<Cow<'a, helix::CursorRef>>,
#[cfg_attr(feature = "typed-builder", builder(default, setter(into)))]
pub first: Option<usize>,
}
impl<'a> GetCustomRewardRedemptionRequest<'a> {
pub fn broadcaster_id(broadcaster_id: impl types::IntoCow<'a, types::UserIdRef> + 'a) -> Self {
Self {
broadcaster_id: broadcaster_id.into_cow(),
reward_id: None,
status: Default::default(),
after: Default::default(),
first: Default::default(),
id: Default::default(),
sort: None,
}
}
pub fn reward_id(
mut self,
reward_id: impl types::IntoCow<'a, types::RewardIdRef> + 'a,
) -> Self {
self.reward_id = Some(reward_id.into_cow());
self
}
pub fn status(mut self, status: impl Into<CustomRewardRedemptionStatus>) -> Self {
self.status = Some(status.into());
self
}
pub fn sort(mut self, sort: impl Into<GetCustomRewardRedemptionSortOrder>) -> Self {
self.sort = Some(sort.into());
self
}
pub fn ids(mut self, id: impl Into<types::Collection<'a, types::RedemptionId>>) -> Self {
self.id = id.into();
self
}
}
#[derive(PartialEq, Eq, Deserialize, Serialize, Clone, Debug)]
#[serde(rename_all = "UPPERCASE")]
#[non_exhaustive]
pub enum GetCustomRewardRedemptionSortOrder {
Oldest,
Newest,
}
#[derive(PartialEq, Eq, Deserialize, Serialize, Debug, Clone)]
#[cfg_attr(feature = "deny_unknown_fields", serde(deny_unknown_fields))]
#[non_exhaustive]
pub struct CustomRewardRedemption {
pub broadcaster_id: types::UserId,
pub broadcaster_name: types::DisplayName,
pub broadcaster_login: types::UserName,
pub id: types::RedemptionId,
pub user_id: types::UserId,
pub user_name: types::DisplayName,
pub user_login: types::UserName,
pub reward: Reward,
pub user_input: String,
pub status: CustomRewardRedemptionStatus,
pub redeemed_at: types::Timestamp,
}
#[derive(PartialEq, Eq, Deserialize, Serialize, Debug, Clone)]
#[cfg_attr(feature = "deny_unknown_fields", serde(deny_unknown_fields))]
#[non_exhaustive]
pub struct Reward {
pub id: types::RewardId,
pub title: String,
pub prompt: String,
pub cost: i64,
}
impl Request for GetCustomRewardRedemptionRequest<'_> {
type Response = Vec<CustomRewardRedemption>;
const PATH: &'static str = "channel_points/custom_rewards/redemptions";
#[cfg(feature = "twitch_oauth2")]
const SCOPE: twitch_oauth2::Validator = twitch_oauth2::validator![any(
twitch_oauth2::scopes::Scope::ChannelReadRedemptions,
twitch_oauth2::Scope::ChannelManageRedemptions
)];
}
impl RequestGet for GetCustomRewardRedemptionRequest<'_> {}
impl helix::Paginated for GetCustomRewardRedemptionRequest<'_> {
fn set_pagination(&mut self, cursor: Option<helix::Cursor>) {
self.after = cursor.map(|c| c.into_cow())
}
}
#[cfg(test)]
#[test]
fn test_request() {
use helix::*;
let req = GetCustomRewardRedemptionRequest::broadcaster_id("274637212")
.reward_id("92af127c-7326-4483-a52b-b0da0be61c01")
.status(CustomRewardRedemptionStatus::Canceled);
let data = br##"
{
"data": [
{
"broadcaster_name": "torpedo09",
"broadcaster_login": "torpedo09",
"broadcaster_id": "274637212",
"id": "17fa2df1-ad76-4804-bfa5-a40ef63efe63",
"user_login": "torpedo09",
"user_id": "274637212",
"user_name": "torpedo09",
"user_input": "",
"status": "CANCELED",
"redeemed_at": "2020-07-01T18:37:32Z",
"reward": {
"id": "92af127c-7326-4483-a52b-b0da0be61c01",
"title": "game analysis",
"prompt": "",
"cost": 50000
}
}
],
"pagination": {
"cursor": "eyJiIjpudWxsLCJhIjp7IkN1cnNvciI6Ik1UZG1ZVEprWmpFdFlXUTNOaTAwT0RBMExXSm1ZVFV0WVRRd1pXWTJNMlZtWlRZelgxOHlNREl3TFRBM0xUQXhWREU0T2pNM09qTXlMakl6TXpFeU56RTFOMW89In19"
}
}
"##
.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/channel_points/custom_rewards/redemptions?broadcaster_id=274637212&reward_id=92af127c-7326-4483-a52b-b0da0be61c01&status=CANCELED"
);
dbg!(GetCustomRewardRedemptionRequest::parse_response(Some(req), &uri, http_response).unwrap());
}