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