modio/request/mods/
get_mods.rs

1use std::future::IntoFuture;
2
3use crate::client::Client;
4use crate::request::{Filter, Output, RequestBuilder, Route};
5use crate::response::ResponseFuture;
6use crate::types::id::GameId;
7use crate::types::mods::Mod;
8use crate::types::List;
9use crate::util::{Paginate, Paginator};
10
11/// Get all mods for a game.
12pub struct GetMods<'a> {
13    http: &'a Client,
14    game_id: GameId,
15    filter: Option<Filter>,
16}
17
18impl<'a> GetMods<'a> {
19    pub(crate) const fn new(http: &'a Client, game_id: GameId) -> Self {
20        Self {
21            http,
22            game_id,
23            filter: None,
24        }
25    }
26
27    /// Set the filter for the request.
28    ///
29    /// See [Filters and sorting](super::filters).
30    pub fn filter(mut self, filter: Filter) -> Self {
31        self.filter = Some(filter);
32        self
33    }
34}
35
36impl IntoFuture for GetMods<'_> {
37    type Output = Output<List<Mod>>;
38    type IntoFuture = ResponseFuture<List<Mod>>;
39
40    fn into_future(self) -> Self::IntoFuture {
41        let route = Route::GetMods {
42            game_id: self.game_id,
43        };
44        let mut builder = RequestBuilder::from_route(&route);
45        if let Some(filter) = self.filter {
46            builder = builder.filter(filter);
47        }
48        match builder.empty() {
49            Ok(req) => self.http.request(req),
50            Err(err) => ResponseFuture::failed(err),
51        }
52    }
53}
54
55impl<'a> Paginate<'a> for GetMods<'a> {
56    type Output = Mod;
57
58    fn paged(&'a self) -> Paginator<'a, Self::Output> {
59        let route = Route::GetMods {
60            game_id: self.game_id,
61        };
62        Paginator::new(self.http, route, self.filter.clone())
63    }
64}