modio/request/mods/dependencies/
add_mod_dependencies.rs1use 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
11pub 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 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}