mod builder;
mod response;
mod types;
pub use builder::{CreatePollBuilder, GetPollsBuilder};
pub use response::PollsResponse;
pub use types::{EndPollStatus, Poll, PollStatus};
use types::EndPollBody;
use crate::{
request::TwitchAPIRequest,
types::{constants::POLLS, BroadcasterId, PollId, Title},
TwitchAPI,
};
pub trait PollsAPI {
fn get_polls<'a>(&'a self, broadcaster_id: &'a BroadcasterId) -> GetPollsBuilder<'a>;
fn create_poll<'a>(
&'a self,
broadcaster_id: &'a BroadcasterId,
title: &'a str,
choices: &'a [Title],
duration: u16,
) -> CreatePollBuilder<'a>;
fn end_poll(
&self,
broadcaster_id: &BroadcasterId,
id: &PollId,
status: EndPollStatus,
) -> TwitchAPIRequest<PollsResponse>;
}
impl PollsAPI for TwitchAPI {
fn get_polls<'a>(&'a self, broadcaster_id: &'a BroadcasterId) -> GetPollsBuilder<'a> {
GetPollsBuilder::new(self, broadcaster_id)
}
fn create_poll<'a>(
&'a self,
broadcaster_id: &'a BroadcasterId,
title: &'a str,
choices: &'a [Title],
duration: u16,
) -> CreatePollBuilder<'a> {
CreatePollBuilder::new(self, broadcaster_id, title, choices, duration)
}
fn end_poll(
&self,
broadcaster_id: &BroadcasterId,
id: &PollId,
status: EndPollStatus,
) -> TwitchAPIRequest<PollsResponse> {
let mut url = self.build_url();
url.path_segments_mut().unwrap().extend(&[POLLS]);
let body = serde_json::to_string(&EndPollBody {
broadcaster_id,
id,
status,
})
.ok();
TwitchAPIRequest::new(
crate::request::EndpointType::EndPoll,
url,
reqwest::Method::PATCH,
self.header_json(),
body,
self.client.clone(),
)
}
}