modio/request/mods/
edit_mod.rs

1use std::future::IntoFuture;
2
3use serde_derive::Serialize;
4
5use crate::client::Client;
6use crate::request::{Output, RequestBuilder, Route};
7use crate::response::ResponseFuture;
8use crate::types::id::{GameId, ModId};
9use crate::types::mods::{CommunityOptions, CreditOptions, MaturityOption, Mod};
10
11/// Edit details for a mod.
12pub struct EditMod<'a> {
13    http: &'a Client,
14    game_id: GameId,
15    mod_id: ModId,
16    fields: EditModFields<'a>,
17}
18
19#[derive(Serialize)]
20struct EditModFields<'a> {
21    #[serde(skip_serializing_if = "Option::is_none")]
22    status: Option<u8>,
23    #[serde(skip_serializing_if = "Option::is_none")]
24    visibility: Option<u8>,
25    #[serde(skip_serializing_if = "Option::is_none")]
26    name: Option<&'a str>,
27    #[serde(skip_serializing_if = "Option::is_none")]
28    name_id: Option<&'a str>,
29    #[serde(skip_serializing_if = "Option::is_none")]
30    summary: Option<&'a str>,
31    #[serde(skip_serializing_if = "Option::is_none")]
32    description: Option<&'a str>,
33    #[serde(skip_serializing_if = "Option::is_none")]
34    homepage_url: Option<&'a str>,
35    #[serde(skip_serializing_if = "Option::is_none")]
36    stock: Option<u32>,
37    #[serde(skip_serializing_if = "Option::is_none")]
38    maturity_option: Option<MaturityOption>,
39    #[serde(skip_serializing_if = "Option::is_none")]
40    community_options: Option<CommunityOptions>,
41    #[serde(skip_serializing_if = "Option::is_none")]
42    credit_options: Option<CreditOptions>,
43    #[serde(skip_serializing_if = "Option::is_none")]
44    metadata_blob: Option<&'a str>,
45    #[serde(skip_serializing_if = "Option::is_none")]
46    tags: Option<&'a [&'a str]>,
47}
48
49impl<'a> EditMod<'a> {
50    pub(crate) const fn new(http: &'a Client, game_id: GameId, mod_id: ModId) -> Self {
51        Self {
52            http,
53            game_id,
54            mod_id,
55            fields: EditModFields {
56                status: None,
57                visibility: None,
58                name: None,
59                name_id: None,
60                summary: None,
61                description: None,
62                homepage_url: None,
63                stock: None,
64                maturity_option: None,
65                community_options: None,
66                credit_options: None,
67                metadata_blob: None,
68                tags: None,
69            },
70        }
71    }
72
73    pub const fn name(mut self, name: &'a str) -> Self {
74        self.fields.name = Some(name);
75        self
76    }
77
78    pub const fn name_id(mut self, name_id: &'a str) -> Self {
79        self.fields.name_id = Some(name_id);
80        self
81    }
82
83    pub const fn summary(mut self, summary: &'a str) -> Self {
84        self.fields.summary = Some(summary);
85        self
86    }
87
88    pub const fn description(mut self, description: &'a str) -> Self {
89        self.fields.description = Some(description);
90        self
91    }
92
93    pub const fn homepage_url(mut self, homepage_url: &'a str) -> Self {
94        self.fields.homepage_url = Some(homepage_url);
95        self
96    }
97
98    pub const fn stock(mut self, stock: u32) -> Self {
99        self.fields.stock = Some(stock);
100        self
101    }
102
103    pub const fn maturity_option(mut self, option: MaturityOption) -> Self {
104        self.fields.maturity_option = Some(option);
105        self
106    }
107
108    pub const fn community_options(mut self, options: CommunityOptions) -> Self {
109        self.fields.community_options = Some(options);
110        self
111    }
112
113    pub const fn credit_options(mut self, options: CreditOptions) -> Self {
114        self.fields.credit_options = Some(options);
115        self
116    }
117
118    pub const fn metadata_blob(mut self, metadata: &'a str) -> Self {
119        self.fields.metadata_blob = Some(metadata);
120        self
121    }
122
123    pub const fn tags(mut self, tags: &'a [&'a str]) -> Self {
124        self.fields.tags = Some(tags);
125        self
126    }
127
128    pub const fn status(mut self, status: u8) -> Self {
129        self.fields.status = Some(status);
130        self
131    }
132
133    pub const fn visible(mut self, visible: bool) -> Self {
134        self.fields.visibility = Some(if visible { 1 } else { 0 });
135        self
136    }
137}
138
139impl IntoFuture for EditMod<'_> {
140    type Output = Output<Mod>;
141    type IntoFuture = ResponseFuture<Mod>;
142
143    fn into_future(self) -> Self::IntoFuture {
144        let route = Route::EditMod {
145            game_id: self.game_id,
146            mod_id: self.mod_id,
147        };
148        match RequestBuilder::from_route(&route).form(&self.fields) {
149            Ok(req) => self.http.request(req),
150            Err(err) => ResponseFuture::failed(err),
151        }
152    }
153}