modio/request/mods/media/
delete_mod_media.rs1use 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
10pub struct DeleteModMedia<'a> {
12 http: &'a Client,
13 game_id: GameId,
14 mod_id: ModId,
15 fields: DeleteModMediaFields<'a>,
16}
17
18#[derive(Serialize)]
19struct DeleteModMediaFields<'a> {
20 #[serde(flatten, skip_serializing_if = "Option::is_none")]
21 images: Option<ArrayParams<'a, &'a str>>,
22 #[serde(flatten, skip_serializing_if = "Option::is_none")]
23 youtube: Option<ArrayParams<'a, &'a str>>,
24 #[serde(flatten, skip_serializing_if = "Option::is_none")]
25 sketchfab: Option<ArrayParams<'a, &'a str>>,
26}
27
28impl<'a> DeleteModMediaFields<'a> {
29 const fn set_images(&mut self, images: &'a [&'a str]) {
30 self.images = Some(ArrayParams::new("images[]", images));
31 }
32
33 const fn set_youtube(&mut self, youtube: &'a [&'a str]) {
34 self.youtube = Some(ArrayParams::new("youtube[]", youtube));
35 }
36
37 const fn set_sketchfab(&mut self, sketchfab: &'a [&'a str]) {
38 self.sketchfab = Some(ArrayParams::new("sketchfab[]", sketchfab));
39 }
40}
41
42impl<'a> DeleteModMedia<'a> {
43 pub(crate) const fn new(http: &'a Client, game_id: GameId, mod_id: ModId) -> Self {
44 Self {
45 http,
46 game_id,
47 mod_id,
48 fields: DeleteModMediaFields {
49 images: None,
50 youtube: None,
51 sketchfab: None,
52 },
53 }
54 }
55
56 pub const fn images(mut self, images: &'a [&'a str]) -> Self {
57 self.fields.set_images(images);
58 self
59 }
60
61 pub const fn youtube(mut self, youtube: &'a [&'a str]) -> Self {
62 self.fields.set_youtube(youtube);
63 self
64 }
65
66 pub const fn sketchfab(mut self, sketchfab: &'a [&'a str]) -> Self {
67 self.fields.set_sketchfab(sketchfab);
68 self
69 }
70}
71
72impl IntoFuture for DeleteModMedia<'_> {
73 type Output = Output<NoContent>;
74 type IntoFuture = ResponseFuture<NoContent>;
75
76 fn into_future(self) -> Self::IntoFuture {
77 let route = Route::DeleteModMedia {
78 game_id: self.game_id,
79 mod_id: self.mod_id,
80 };
81 match RequestBuilder::from_route(&route).form(&self.fields) {
82 Ok(req) => self.http.request(req),
83 Err(err) => ResponseFuture::failed(err),
84 }
85 }
86}
87
88#[cfg(test)]
89mod tests {
90 use serde_test::{assert_ser_tokens, Token};
91
92 use super::DeleteModMediaFields;
93
94 #[test]
95 pub fn serialize_fields() {
96 let mut fields = DeleteModMediaFields {
97 images: None,
98 youtube: None,
99 sketchfab: None,
100 };
101 fields.set_images(&["aaa", "bbb"]);
102 fields.set_sketchfab(&["ccc", "ddd"]);
103
104 assert_ser_tokens(
105 &fields,
106 &[
107 Token::Map { len: None },
108 Token::Str("images[]"),
109 Token::Str("aaa"),
110 Token::Str("images[]"),
111 Token::Str("bbb"),
112 Token::Str("sketchfab[]"),
113 Token::Str("ccc"),
114 Token::Str("sketchfab[]"),
115 Token::Str("ddd"),
116 Token::MapEnd,
117 ],
118 );
119
120 let qs = serde_urlencoded::to_string(&fields).unwrap();
121 assert_eq!(
122 "images%5B%5D=aaa&images%5B%5D=bbb&sketchfab%5B%5D=ccc&sketchfab%5B%5D=ddd",
123 qs
124 );
125 }
126}