twilight_http/request/template/
create_template.rs1use crate::{
2 client::Client,
3 error::Error,
4 request::{Request, TryIntoRequest},
5 response::{Response, ResponseFuture},
6 routing::Route,
7};
8use serde::Serialize;
9use std::future::IntoFuture;
10use twilight_model::{
11 guild::template::Template,
12 id::{marker::GuildMarker, Id},
13};
14use twilight_validate::request::{
15 template_description as validate_template_description, template_name as validate_template_name,
16 ValidationError,
17};
18
19#[derive(Serialize)]
20struct CreateTemplateFields<'a> {
21 name: &'a str,
22 description: Option<&'a str>,
23}
24
25#[must_use = "requests must be configured and executed"]
37pub struct CreateTemplate<'a> {
38 fields: Result<CreateTemplateFields<'a>, ValidationError>,
39 guild_id: Id<GuildMarker>,
40 http: &'a Client,
41}
42
43impl<'a> CreateTemplate<'a> {
44 pub(crate) fn new(http: &'a Client, guild_id: Id<GuildMarker>, name: &'a str) -> Self {
45 let fields = Ok(CreateTemplateFields {
46 name,
47 description: None,
48 })
49 .and_then(|fields| {
50 validate_template_name(name)?;
51
52 Ok(fields)
53 });
54
55 Self {
56 fields,
57 guild_id,
58 http,
59 }
60 }
61
62 pub fn description(mut self, description: &'a str) -> Self {
73 self.fields = self.fields.and_then(|mut fields| {
74 validate_template_description(description)?;
75
76 fields.description.replace(description);
77
78 Ok(fields)
79 });
80
81 self
82 }
83}
84
85impl IntoFuture for CreateTemplate<'_> {
86 type Output = Result<Response<Template>, Error>;
87
88 type IntoFuture = ResponseFuture<Template>;
89
90 fn into_future(self) -> Self::IntoFuture {
91 let http = self.http;
92
93 match self.try_into_request() {
94 Ok(request) => http.request(request),
95 Err(source) => ResponseFuture::error(source),
96 }
97 }
98}
99
100impl TryIntoRequest for CreateTemplate<'_> {
101 fn try_into_request(self) -> Result<Request, Error> {
102 let fields = self.fields.map_err(Error::validation)?;
103
104 Request::builder(&Route::CreateTemplate {
105 guild_id: self.guild_id.get(),
106 })
107 .json(&fields)
108 .build()
109 }
110}