Skip to main content

neptunium_http/endpoints/invites/
create_channel_invite.rs

1use bon::Builder;
2use neptunium_model::{
3    id::{Id, marker::ChannelMarker},
4    invites::InviteWithMetadata,
5    time::duration::{Duration, representation::Seconds},
6};
7use reqwest::Method;
8use serde::Serialize;
9
10use crate::{endpoints::Endpoint, request::Request};
11
12#[derive(Serialize, Copy, Clone, Debug, Builder, Default)]
13pub struct CreateChannelInviteOptions {
14    /// 0-100, where 0 means unlimited.
15    #[serde(skip_serializing_if = "Option::is_none")]
16    pub max_uses: Option<u8>,
17    /// 0-604800, duration until the invite expires where 0 means never.
18    #[serde(skip_serializing_if = "Option::is_none")]
19    pub max_age: Option<Duration<Seconds>>,
20    /// Whether to create a unique invite or reuse an existing one.
21    #[serde(skip_serializing_if = "Option::is_none")]
22    pub unique: Option<bool>,
23    // TODO: Probably say that this only applies to voice channels?
24    /// Whether members that joined via this invite should be kicked after disconnecting.
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub temporary: Option<bool>,
27}
28
29#[derive(Builder, Copy, Clone, Debug)]
30pub struct CreateChannelInvite {
31    pub channel_id: Id<ChannelMarker>,
32    pub options: CreateChannelInviteOptions,
33}
34
35impl Endpoint for CreateChannelInvite {
36    type Response = InviteWithMetadata;
37
38    fn into_request(self) -> crate::request::Request {
39        Request::builder()
40            .method(Method::POST)
41            .body(serde_json::to_string(&self.options).unwrap())
42            .path(format!("/channels/{}/invites", self.channel_id))
43            .build()
44    }
45}