Skip to main content

stoat/ext/
stoat.rs

1use async_trait::async_trait;
2use stoat_models::v0::{Channel, FetchServerResponse, OptionsFetchServer, Server, User};
3
4use crate::{Client, Context, Error, HttpClient, LocalFile, Result, types::Tag};
5
6#[async_trait]
7pub trait StoatExt {
8    #[doc(hidden)]
9    fn _http(&self) -> &HttpClient;
10
11    async fn fetch_user(&self, user_id: &str) -> Result<User> {
12        self._http().fetch_user(user_id).await
13    }
14
15    async fn upload_file(&self, tag: Tag, file: LocalFile) -> Result<String> {
16        let response = self._http().upload_file(tag.as_str(), file).await?;
17
18        Ok(response.id)
19    }
20
21    async fn fetch_server(&self, server_id: &str) -> Result<Server> {
22        let FetchServerResponse::JustServer(server) = self
23            ._http()
24            .fetch_server(
25                server_id,
26                &OptionsFetchServer {
27                    include_channels: None,
28                },
29            )
30            .await?
31        else {
32            return Err(Error::InternalError);
33        };
34
35        Ok(server)
36    }
37
38    async fn fetch_server_with_channels(&self, server_id: &str) -> Result<(Server, Vec<Channel>)> {
39        let FetchServerResponse::ServerWithChannels { server, channels } = self
40            ._http()
41            .fetch_server(
42                server_id,
43                &OptionsFetchServer {
44                    include_channels: Some(true),
45                },
46            )
47            .await?
48        else {
49            return Err(Error::InternalError);
50        };
51
52        Ok((server, channels))
53    }
54
55    async fn fetch_dms(&self) -> Result<Vec<Channel>> {
56        self._http().fetch_dms().await
57    }
58    async fn fetch_self(&self) -> Result<User> {
59        self._http().fetch_self().await
60    }
61}
62
63impl StoatExt for Context {
64    fn _http(&self) -> &HttpClient {
65        &self.http
66    }
67}
68
69impl<H> StoatExt for Client<H> {
70    fn _http(&self) -> &HttpClient {
71        &self.http
72    }
73}