mod builder;
mod response;
mod types;
pub use builder::{
GetFollowedStreamsBuilder, GetStermaMarkersBuilder, GetStreamsBuilder, StreamMarkerSelect,
};
pub use response::{
CreateStreamMarkerResponse, GetStreamMarkersResponse, StreamKeyResponse, StreamsResponse,
};
pub use types::{Marker, Stream, StreamKey, StreamMarker, StreamVideos};
use types::CreateStrseamMarkerBody;
use crate::{
request::TwitchAPIRequest,
types::{
constants::{BROADCASTER_ID, KEY, MARKERS, STREAMS},
BroadcasterId, UserId, VideoId,
},
TwitchAPI,
};
pub trait StreamsAPI {
fn get_stream_key(&self, broadcaster_id: &BroadcasterId)
-> TwitchAPIRequest<StreamKeyResponse>;
fn get_streams<'a>(&'a self) -> GetStreamsBuilder<'a>;
fn get_followed_streams<'a>(&'a self, user_id: &'a UserId) -> GetFollowedStreamsBuilder<'a>;
fn create_stream_marker(
&self,
user_id: &UserId,
description: Option<&str>,
) -> TwitchAPIRequest<CreateStreamMarkerResponse>;
fn get_stream_markers_by_user_id<'a>(
&'a self,
user_id: &'a UserId,
) -> GetStermaMarkersBuilder<'a>;
fn get_stream_markers_by_video_id<'a>(
&'a self,
video_id: &'a VideoId,
) -> GetStermaMarkersBuilder<'a>;
}
impl StreamsAPI for TwitchAPI {
fn get_stream_key(
&self,
broadcaster_id: &BroadcasterId,
) -> TwitchAPIRequest<StreamKeyResponse> {
let mut url = self.build_url();
url.path_segments_mut().unwrap().extend(&[STREAMS, KEY]);
let mut query = url.query_pairs_mut();
query.append_pair(BROADCASTER_ID, broadcaster_id);
drop(query);
TwitchAPIRequest::new(
crate::request::EndpointType::GetStreamKey,
url,
reqwest::Method::GET,
self.default_headers(),
None,
self.client.clone(),
)
}
fn get_streams<'a>(&'a self) -> GetStreamsBuilder<'a> {
GetStreamsBuilder::new(self)
}
fn get_followed_streams<'a>(&'a self, user_id: &'a UserId) -> GetFollowedStreamsBuilder<'a> {
GetFollowedStreamsBuilder::new(self, user_id)
}
fn create_stream_marker(
&self,
user_id: &UserId,
description: Option<&str>,
) -> TwitchAPIRequest<CreateStreamMarkerResponse> {
let mut url = self.build_url();
url.path_segments_mut().unwrap().extend(&[STREAMS, MARKERS]);
let body = serde_json::to_string(&CreateStrseamMarkerBody {
user_id,
description,
})
.ok();
TwitchAPIRequest::new(
crate::request::EndpointType::CreateStreamMarker,
url,
reqwest::Method::POST,
self.header_json(),
body,
self.client.clone(),
)
}
fn get_stream_markers_by_user_id<'a>(
&'a self,
user_id: &'a UserId,
) -> GetStermaMarkersBuilder<'a> {
GetStermaMarkersBuilder::user_id(self, user_id)
}
fn get_stream_markers_by_video_id<'a>(
&'a self,
video_id: &'a VideoId,
) -> GetStermaMarkersBuilder<'a> {
GetStermaMarkersBuilder::video_id(self, video_id)
}
}