modio/request/mods/dependencies/
add_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::ResponseFuture;
8use crate::types::id::{GameId, ModId};
9use crate::types::Message;
10
11/// Add mod dependencies required by a mod.
12pub struct AddModDependencies<'a> {
13    http: &'a Client,
14    game_id: GameId,
15    mod_id: ModId,
16    fields: AddModDependenciesFields<'a>,
17}
18
19#[derive(Serialize)]
20struct AddModDependenciesFields<'a> {
21    #[serde(flatten)]
22    dependencies: ArrayParams<'a, ModId>,
23    #[serde(skip_serializing_if = "Option::is_none")]
24    sync: Option<bool>,
25}
26
27impl<'a> AddModDependenciesFields<'a> {
28    const fn new(deps: &'a [ModId]) -> Self {
29        Self {
30            dependencies: ArrayParams::new("dependencies[]", deps),
31            sync: None,
32        }
33    }
34}
35
36impl<'a> AddModDependencies<'a> {
37    pub(crate) const fn new(
38        http: &'a Client,
39        game_id: GameId,
40        mod_id: ModId,
41        deps: &'a [ModId],
42    ) -> Self {
43        Self {
44            http,
45            game_id,
46            mod_id,
47            fields: AddModDependenciesFields::new(deps),
48        }
49    }
50
51    /// Replace all existing dependencies with the new ones.
52    pub const fn replace(mut self, value: bool) -> Self {
53        self.fields.sync = Some(value);
54        self
55    }
56}
57
58impl IntoFuture for AddModDependencies<'_> {
59    type Output = Output<Message>;
60    type IntoFuture = ResponseFuture<Message>;
61
62    fn into_future(self) -> Self::IntoFuture {
63        let route = Route::AddModDependencies {
64            game_id: self.game_id,
65            mod_id: self.mod_id,
66        };
67        match RequestBuilder::from_route(&route).form(&self.fields) {
68            Ok(req) => self.http.request(req),
69            Err(err) => ResponseFuture::failed(err),
70        }
71    }
72}
73
74#[cfg(test)]
75mod tests {
76    use serde_test::{assert_ser_tokens, Token};
77
78    use super::{AddModDependenciesFields, ModId};
79
80    #[test]
81    pub fn serialize_fields() {
82        let deps = [ModId::new(1), ModId::new(2)];
83        let mut fields = AddModDependenciesFields::new(&deps);
84        fields.sync = Some(true);
85
86        assert_ser_tokens(
87            &fields,
88            &[
89                Token::Map { len: None },
90                Token::Str("dependencies[]"),
91                Token::U64(1),
92                Token::Str("dependencies[]"),
93                Token::U64(2),
94                Token::Str("sync"),
95                Token::Some,
96                Token::Bool(true),
97                Token::MapEnd,
98            ],
99        );
100
101        let qs = serde_urlencoded::to_string(&fields).unwrap();
102        assert_eq!("dependencies%5B%5D=1&dependencies%5B%5D=2&sync=true", qs);
103    }
104}