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}