Skip to main content

mutiny_rs/http/
routing.rs

1use reqwest::Method;
2
3macro_rules! api_routes {
4    (
5        $(
6            $variant:ident
7            $( { $($arg:ident : $typ:ty),* $(,)? } )?
8            => $method:ident, $path:literal
9            $(, $fmt_arg:ident)*
10        );* $(;)?
11    ) => {
12        pub enum Route<'a> {
13            $(
14                $variant $( { $($arg: $typ),* } )?,
15            )*
16        }
17
18        impl<'a> Route<'a> {
19            #[allow(unused_variables)]
20            pub fn method(&self) -> Method {
21                match self {
22                    $(
23                        Self::$variant $( { $($arg),* } )? => Method::$method,
24                    )*
25                }
26            }
27
28            pub fn path(&self) -> String {
29                match self {
30                    $(
31                        Self::$variant $( { $($arg),* } )? => format!($path, $($fmt_arg),*),
32                    )*
33                }
34            }
35        }
36    };
37}
38api_routes! {
39    // --- Channel Operations ---
40    GetChannel      { channel_id: &'a str } => GET,    "/channels/{}", channel_id;
41    EditChannel     { channel_id: &'a str } => PATCH,  "/channels/{}", channel_id;
42    DeleteChannel   { channel_id: &'a str } => DELETE, "/channels/{}", channel_id;
43
44    // --- Invites & Recipients ---
45    CreateInvite    { channel_id: &'a str }
46                    => POST,   "/channels/{}/invites", channel_id;
47
48    AddRecipient    { channel_id: &'a str, user_id: &'a str }
49                    => PUT,    "/channels/{}/recipients/{}", channel_id, user_id;
50
51    RemoveRecipient { channel_id: &'a str, user_id: &'a str }
52                    => DELETE, "/channels/{}/recipients/{}", channel_id, user_id;
53
54    // --- Messages ---
55    SendMessage     { channel_id: &'a str }
56                    => POST,   "/channels/{}/messages", channel_id;
57
58    FetchMessages   { channel_id: &'a str }
59                    => GET,    "/channels/{}/messages", channel_id;
60
61    EditMessage     { channel_id: &'a str, message_id: &'a str }
62                    => PATCH,  "/channels/{}/messages/{}", channel_id, message_id;
63
64    MessageDelete   { channel_id: &'a str, message_id: &'a str }
65                    => DELETE, "/channels/{}/messages/{}", channel_id, message_id;
66
67    MessagePin      { channel_id: &'a str, message_id: &'a str }
68                    => POST,   "/channels/{}/messages/{}/pin", channel_id, message_id;
69
70    MessageUnpin    { channel_id: &'a str, message_id: &'a str }
71                    => DELETE, "/channels/{}/messages/{}/pin", channel_id, message_id;
72
73    // --- User Operations ---
74    FetchMe         => GET,    "/users/@me";
75    FetchDMs        => GET,    "/dms/";
76
77    FetchUser       { user_id: &'a str }    => GET,    "/users/{}", user_id;
78    EditUser        { user_id: &'a str }    => PATCH,  "/users/{}", user_id;
79}