twilight_http/request/guild/
create_guild_prune.rs1use crate::{
2 client::Client,
3 error::Error,
4 request::{self, AuditLogReason, Request, TryIntoRequest},
5 response::{Response, ResponseFuture},
6 routing::Route,
7};
8use std::future::IntoFuture;
9use twilight_model::{
10 guild::GuildPrune,
11 id::{
12 marker::{GuildMarker, RoleMarker},
13 Id,
14 },
15};
16use twilight_validate::request::{
17 audit_reason as validate_audit_reason, guild_prune_days as validate_guild_prune_days,
18 ValidationError,
19};
20
21struct CreateGuildPruneFields<'a> {
22 compute_prune_count: Option<bool>,
23 days: Option<u16>,
24 include_roles: &'a [Id<RoleMarker>],
25}
26
27#[must_use = "requests must be configured and executed"]
33pub struct CreateGuildPrune<'a> {
34 fields: Result<CreateGuildPruneFields<'a>, ValidationError>,
35 guild_id: Id<GuildMarker>,
36 http: &'a Client,
37 reason: Result<Option<&'a str>, ValidationError>,
38}
39
40impl<'a> CreateGuildPrune<'a> {
41 pub(crate) const fn new(http: &'a Client, guild_id: Id<GuildMarker>) -> Self {
42 Self {
43 fields: Ok(CreateGuildPruneFields {
44 compute_prune_count: None,
45 days: None,
46 include_roles: &[],
47 }),
48 guild_id,
49 http,
50 reason: Ok(None),
51 }
52 }
53
54 pub fn include_roles(mut self, roles: &'a [Id<RoleMarker>]) -> Self {
56 if let Ok(fields) = self.fields.as_mut() {
57 fields.include_roles = roles;
58 }
59
60 self
61 }
62
63 pub fn compute_prune_count(mut self, compute_prune_count: bool) -> Self {
65 if let Ok(fields) = self.fields.as_mut() {
66 fields.compute_prune_count = Some(compute_prune_count);
67 }
68
69 self
70 }
71
72 pub fn days(mut self, days: u16) -> Self {
83 self.fields = self.fields.and_then(|mut fields| {
84 validate_guild_prune_days(days)?;
85 fields.days = Some(days);
86
87 Ok(fields)
88 });
89
90 self
91 }
92}
93
94impl<'a> AuditLogReason<'a> for CreateGuildPrune<'a> {
95 fn reason(mut self, reason: &'a str) -> Self {
96 self.reason = validate_audit_reason(reason).and(Ok(Some(reason)));
97
98 self
99 }
100}
101
102impl IntoFuture for CreateGuildPrune<'_> {
103 type Output = Result<Response<GuildPrune>, Error>;
104
105 type IntoFuture = ResponseFuture<GuildPrune>;
106
107 fn into_future(self) -> Self::IntoFuture {
108 let http = self.http;
109
110 match self.try_into_request() {
111 Ok(request) => http.request(request),
112 Err(source) => ResponseFuture::error(source),
113 }
114 }
115}
116
117impl TryIntoRequest for CreateGuildPrune<'_> {
118 fn try_into_request(self) -> Result<Request, Error> {
119 let fields = self.fields.map_err(Error::validation)?;
120 let mut request = Request::builder(&Route::CreateGuildPrune {
121 compute_prune_count: fields.compute_prune_count,
122 days: fields.days,
123 guild_id: self.guild_id.get(),
124 include_roles: fields.include_roles,
125 });
126
127 if let Some(reason) = self.reason.map_err(Error::validation)? {
128 request = request.headers(request::audit_header(reason)?);
129 }
130
131 request.build()
132 }
133}