modio/request/mods/dependencies/
delete_mod_dependencies.rs

1use std::future::IntoFuture;
2
3use serde_derive::Serialize;
4
5use crate::client::Client;
6use crate::request::{ArrayParams, Output, RequestBuilder, Route};
7use crate::response::{NoContent, ResponseFuture};
8use crate::types::id::{GameId, ModId};
9
10/// Delete mod dependencies a mod has selected.
11pub struct DeleteModDependencies<'a> {
12    http: &'a Client,
13    game_id: GameId,
14    mod_id: ModId,
15    fields: DeleteModDependenciesFields<'a>,
16}
17
18#[derive(Serialize)]
19struct DeleteModDependenciesFields<'a> {
20    #[serde(flatten)]
21    dependencies: ArrayParams<'a, ModId>,
22}
23
24impl<'a> DeleteModDependenciesFields<'a> {
25    const fn new(deps: &'a [ModId]) -> Self {
26        Self {
27            dependencies: ArrayParams::new("dependencies[]", deps),
28        }
29    }
30}
31
32impl<'a> DeleteModDependencies<'a> {
33    pub(crate) const fn new(
34        http: &'a Client,
35        game_id: GameId,
36        mod_id: ModId,
37        deps: &'a [ModId],
38    ) -> Self {
39        Self {
40            http,
41            game_id,
42            mod_id,
43            fields: DeleteModDependenciesFields::new(deps),
44        }
45    }
46}
47
48impl IntoFuture for DeleteModDependencies<'_> {
49    type Output = Output<NoContent>;
50    type IntoFuture = ResponseFuture<NoContent>;
51
52    fn into_future(self) -> Self::IntoFuture {
53        let route = Route::DeleteModDependencies {
54            game_id: self.game_id,
55            mod_id: self.mod_id,
56        };
57        match RequestBuilder::from_route(&route).form(&self.fields) {
58            Ok(req) => self.http.request(req),
59            Err(err) => ResponseFuture::failed(err),
60        }
61    }
62}
63
64#[cfg(test)]
65mod tests {
66    use serde_test::{assert_ser_tokens, Token};
67
68    use super::{DeleteModDependenciesFields, ModId};
69
70    #[test]
71    pub fn serialize_fields() {
72        let deps = [ModId::new(1), ModId::new(2)];
73        let fields = DeleteModDependenciesFields::new(&deps);
74
75        assert_ser_tokens(
76            &fields,
77            &[
78                Token::Map { len: None },
79                Token::Str("dependencies[]"),
80                Token::U64(1),
81                Token::Str("dependencies[]"),
82                Token::U64(2),
83                Token::MapEnd,
84            ],
85        );
86
87        let qs = serde_urlencoded::to_string(&fields).unwrap();
88        assert_eq!("dependencies%5B%5D=1&dependencies%5B%5D=2", qs);
89    }
90}