use std::collections::HashMap;
use super::*;
use helix::RequestGet;
use serde::{Deserialize, Serialize};
#[derive(PartialEq, Eq, Deserialize, Serialize, Clone, Debug, Default)]
#[cfg_attr(feature = "typed-builder", derive(typed_builder::TypedBuilder))]
#[must_use]
#[non_exhaustive]
pub struct GetUserActiveExtensionsRequest<'a> {
#[cfg_attr(feature = "typed-builder", builder(default, setter(into)))]
#[cfg_attr(feature = "deser_borrow", serde(borrow = "'a"))]
pub user_id: Option<Cow<'a, types::UserIdRef>>,
}
impl<'a> GetUserActiveExtensionsRequest<'a> {
pub fn new() -> Self { Self::default() }
pub fn user_id(user_id: impl types::IntoCow<'a, types::UserIdRef> + 'a) -> Self {
Self {
user_id: Some(user_id.into_cow()),
}
}
}
#[derive(PartialEq, Eq, Deserialize, Serialize, Debug, Clone)]
#[cfg_attr(feature = "deny_unknown_fields", serde(deny_unknown_fields))]
#[non_exhaustive]
pub struct ExtensionConfiguration {
pub panel: HashMap<String, ExtensionSlot<ActiveExtension>>,
pub overlay: HashMap<String, ExtensionSlot<ActiveExtension>>,
pub component: HashMap<String, ExtensionSlot<ActivePositionedExtension>>,
}
#[derive(PartialEq, Eq, Deserialize, Serialize, Debug, Clone)]
#[cfg_attr(feature = "deny_unknown_fields", serde(deny_unknown_fields))]
#[non_exhaustive]
pub struct ActiveExtension {
pub id: types::ExtensionId,
pub version: String,
pub name: String,
}
#[derive(PartialEq, Eq, Deserialize, Serialize, Debug, Clone)]
#[cfg_attr(feature = "deny_unknown_fields", serde(deny_unknown_fields))]
#[non_exhaustive]
pub struct ActivePositionedExtension {
pub id: types::ExtensionId,
pub version: String,
pub name: String,
pub x: i32,
pub y: i32,
}
impl Request for GetUserActiveExtensionsRequest<'_> {
type Response = ExtensionConfiguration;
#[cfg(feature = "twitch_oauth2")]
const OPT_SCOPE: &'static [twitch_oauth2::Scope] =
&[twitch_oauth2::Scope::UserReadBlockedUsers];
const PATH: &'static str = "users/extensions";
#[cfg(feature = "twitch_oauth2")]
const SCOPE: twitch_oauth2::Validator = twitch_oauth2::validator![any(
twitch_oauth2::Scope::UserReadBroadcast,
twitch_oauth2::Scope::UserEditBroadcast
)];
}
impl RequestGet for GetUserActiveExtensionsRequest<'_> {}
#[cfg(test)]
#[test]
fn test_request() {
use helix::*;
let req = GetUserActiveExtensionsRequest::new();
let data = br#"
{
"data": {
"panel": {
"1": {
"active": true,
"id": "rh6jq1q334hqc2rr1qlzqbvwlfl3x0",
"version": "1.1.0",
"name": "TopClip"
},
"2": {
"active": true,
"id": "wi08ebtatdc7oj83wtl9uxwz807l8b",
"version": "1.1.8",
"name": "Streamlabs Leaderboard"
},
"3": {
"active": true,
"id": "naty2zwfp7vecaivuve8ef1hohh6bo",
"version": "1.0.9",
"name": "Streamlabs Stream Schedule & Countdown"
}
},
"overlay": {
"1": {
"active": true,
"id": "zfh2irvx2jb4s60f02jq0ajm8vwgka",
"version": "1.0.19",
"name": "Streamlabs"
}
},
"component": {
"1": {
"active": true,
"id": "lqnf3zxk0rv0g7gq92mtmnirjz2cjj",
"version": "0.0.1",
"name": "Dev Experience Test",
"x": 0,
"y": 0
},
"2": {
"active": false
}
}
}
}
"#
.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/extensions?"
);
let res = GetUserActiveExtensionsRequest::parse_response(Some(req), &uri, http_response)
.unwrap()
.data;
assert_eq!(res.panel.len(), 3);
assert_eq!(res.overlay.len(), 1);
assert_eq!(res.component.len(), 2);
assert_eq!(
*res.overlay.get("1").unwrap(),
ExtensionSlot::Active(ActiveExtension {
id: "zfh2irvx2jb4s60f02jq0ajm8vwgka".into(),
version: "1.0.19".to_owned(),
name: "Streamlabs".to_owned(),
})
);
assert_eq!(
*res.component.get("1").unwrap(),
ExtensionSlot::Active(ActivePositionedExtension {
id: "lqnf3zxk0rv0g7gq92mtmnirjz2cjj".into(),
version: "0.0.1".to_owned(),
name: "Dev Experience Test".to_owned(),
x: 0,
y: 0,
})
);
assert_eq!(*res.component.get("2").unwrap(), ExtensionSlot::Inactive);
assert_eq!(
res,
serde_json::from_str(&serde_json::to_string(&res).unwrap()).unwrap()
);
}