modio/request/games/
add_game_media.rs

1use std::future::IntoFuture;
2use std::path::Path;
3
4use crate::client::Client;
5use crate::request::multipart::{Form, Part};
6use crate::request::{Output, RequestBuilder, Route};
7use crate::response::ResponseFuture;
8use crate::types::id::GameId;
9use crate::types::Message;
10
11/// Update new media to a game.
12pub struct AddGameMedia<'a> {
13    http: &'a Client,
14    game_id: GameId,
15    logo: Option<Part>,
16    icon: Option<Part>,
17    header: Option<Part>,
18}
19
20impl<'a> AddGameMedia<'a> {
21    pub(crate) const fn new(http: &'a Client, game_id: GameId) -> Self {
22        Self {
23            http,
24            game_id,
25            logo: None,
26            icon: None,
27            header: None,
28        }
29    }
30
31    pub fn logo<P: AsRef<Path>>(mut self, file: P) -> Self {
32        let part = Part::file(file, "logo.png").mime(mime::IMAGE_STAR);
33        self.logo = Some(part);
34        self
35    }
36
37    pub fn icon<P: AsRef<Path>>(mut self, file: P) -> Self {
38        let part = Part::file(file, "icon.png").mime(mime::IMAGE_STAR);
39        self.icon = Some(part);
40        self
41    }
42
43    pub fn header<P: AsRef<Path>>(mut self, file: P) -> Self {
44        let part = Part::file(file, "header.png").mime(mime::IMAGE_STAR);
45        self.header = Some(part);
46        self
47    }
48}
49
50impl IntoFuture for AddGameMedia<'_> {
51    type Output = Output<Message>;
52    type IntoFuture = ResponseFuture<Message>;
53
54    fn into_future(self) -> Self::IntoFuture {
55        let route = Route::AddGameMedia {
56            game_id: self.game_id,
57        };
58
59        let mut form = Form::new();
60        if let Some(value) = self.logo {
61            form = form.part("logo", value);
62        }
63        if let Some(value) = self.icon {
64            form = form.part("icon", value);
65        }
66        if let Some(value) = self.header {
67            form = form.part("header", value);
68        }
69
70        match RequestBuilder::from_route(&route).multipart(form) {
71            Ok(req) => self.http.request(req),
72            Err(err) => ResponseFuture::failed(err),
73        }
74    }
75}