modio/request/mods/media/
reorder_mod_media.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/// Reorder images, sketchfab or youtube links from a mod profile.
11pub struct ReorderModMedia<'a> {
12    http: &'a Client,
13    game_id: GameId,
14    mod_id: ModId,
15    fields: ReorderModMediaFields<'a>,
16}
17
18#[derive(Serialize)]
19struct ReorderModMediaFields<'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> ReorderModMediaFields<'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> ReorderModMedia<'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: ReorderModMediaFields {
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 ReorderModMedia<'_> {
73    type Output = Output<NoContent>;
74    type IntoFuture = ResponseFuture<NoContent>;
75
76    fn into_future(self) -> Self::IntoFuture {
77        let route = Route::ReorderModMedia {
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::ReorderModMediaFields;
93
94    #[test]
95    pub fn serialize_fields() {
96        let mut fields = ReorderModMediaFields {
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}