use iter::participants::ParticipantsIter;
use iter::permissions::PermissionsIter;
use iter::stages::StagesIter;
use iter::tournament_matches::TournamentMatchesIter;
use iter::videos::VideosIter;
use *;
#[derive(Debug, Copy, Clone)]
enum TournamentsIterFetch {
All,
My,
}
#[derive(Debug)]
pub struct TournamentsIter<'a> {
client: &'a Toornament,
with_streams: bool,
name: Option<String>,
fetch: TournamentsIterFetch,
}
impl<'a> TournamentsIter<'a> {
pub fn new(client: &'a Toornament) -> TournamentsIter {
TournamentsIter {
client,
with_streams: false,
name: None,
fetch: TournamentsIterFetch::All,
}
}
}
impl<'a> TournamentsIter<'a> {
pub fn with_name<S: Into<String>>(mut self, name: S) -> Self {
self.name = Some(name.into());
self
}
pub fn my(mut self) -> Self {
self.fetch = TournamentsIterFetch::My;
self
}
pub fn all(mut self) -> Self {
self.fetch = TournamentsIterFetch::All;
self
}
pub fn with_streams(mut self, with_streams: bool) -> Self {
self.with_streams = with_streams;
self
}
}
impl<'a> TournamentsIter<'a> {
pub fn with_id(self, id: TournamentId) -> TournamentIter<'a> {
TournamentIter::new(self.client, id).with_streams(self.with_streams)
}
pub fn create<F: 'static + FnMut() -> Tournament>(self, creator: F) -> TournamentCreator<'a> {
TournamentCreator {
client: self.client,
creator: Box::new(creator),
}
}
}
impl<'a> TournamentsIter<'a> {
pub fn collect<T: From<Tournaments>>(self) -> Result<T> {
let mut tournaments = match self.fetch {
TournamentsIterFetch::All => self.client.tournaments(None, self.with_streams),
TournamentsIterFetch::My => self.client.my_tournaments(),
}?;
if let Some(name) = self.name {
tournaments.0.retain(|t| t.name == name);
}
Ok(T::from(tournaments))
}
}
pub struct TournamentIter<'a> {
client: &'a Toornament,
id: TournamentId,
with_streams: bool,
}
impl<'a> TournamentIter<'a> {
pub fn new(client: &'a Toornament, id: TournamentId) -> TournamentIter {
TournamentIter {
client,
id,
with_streams: false,
}
}
}
impl<'a> TournamentIter<'a> {
pub fn with_streams(mut self, with_streams: bool) -> Self {
self.with_streams = with_streams;
self
}
pub fn with_id(mut self, id: TournamentId) -> Self {
self.id = id;
self
}
}
impl<'a> TournamentIter<'a> {
pub fn edit<F: 'static + FnMut(Tournament) -> Tournament>(
self,
editor: F,
) -> TournamentEditor<'a> {
TournamentEditor {
client: self.client,
id: self.id,
with_streams: self.with_streams,
editor: Box::new(editor),
}
}
pub fn participants(self) -> ParticipantsIter<'a> {
ParticipantsIter::new(self.client, self.id)
}
pub fn matches(self) -> TournamentMatchesIter<'a> {
TournamentMatchesIter::new(self.client, self.id)
}
pub fn permissions(self) -> PermissionsIter<'a> {
PermissionsIter::new(self.client, self.id)
}
pub fn stages(self) -> StagesIter<'a> {
StagesIter::new(self.client, self.id)
}
pub fn videos(self) -> VideosIter<'a> {
VideosIter::new(self.client, self.id)
}
}
impl<'a> TournamentIter<'a> {
pub fn collect<T: From<Tournament>>(self) -> Result<T> {
let tournaments = self
.client
.tournaments(Some(self.id.clone()), self.with_streams)?;
let tournament = match tournaments.0.first() {
Some(t) => t.to_owned(),
None => return Err(Error::Iter(IterError::NoSuchTournament(self.id))),
};
Ok(T::from(tournament))
}
pub fn delete(self) -> Result<()> {
self.client.delete_tournament(self.id)
}
}
pub struct TournamentEditor<'a> {
client: &'a Toornament,
id: TournamentId,
with_streams: bool,
editor: Box<dyn FnMut(Tournament) -> Tournament>,
}
impl<'a> TournamentEditor<'a> {
pub fn update(mut self) -> Result<Tournament> {
let tournaments = self
.client
.tournaments(Some(self.id.clone()), self.with_streams)?;
let original = match tournaments.0.first() {
Some(t) => t.to_owned(),
None => return Err(Error::Iter(IterError::NoSuchTournament(self.id))),
};
let edited = (self.editor)(original);
self.client.edit_tournament(edited)
}
pub fn update_iter(mut self) -> Result<TournamentIter<'a>> {
let tournaments = self
.client
.tournaments(Some(self.id.clone()), self.with_streams)?;
let original = match tournaments.0.first() {
Some(t) => t.to_owned(),
None => return Err(Error::Iter(IterError::NoSuchTournament(self.id))),
};
let edited = (self.editor)(original);
let _ = self.client.edit_tournament(edited)?;
Ok(TournamentIter {
client: self.client,
id: self.id,
with_streams: self.with_streams,
})
}
}
pub struct TournamentCreator<'a> {
client: &'a Toornament,
creator: Box<dyn FnMut() -> Tournament>,
}
impl<'a> TournamentCreator<'a> {
pub fn update(mut self) -> Result<Tournament> {
self.client.edit_tournament((self.creator)())
}
pub fn update_iter(mut self) -> Result<TournamentIter<'a>> {
let created = self.client.edit_tournament((self.creator)())?;
match created.id {
Some(id) => Ok(TournamentIter::new(self.client, id)),
None => Err(Error::Iter(IterError::NoTournamentId(Box::new(created)))),
}
}
}