1use async_trait::async_trait;
2use stoat_models::v0::{DataSetServerRolePermission, Role};
3use stoat_permissions::Override;
4
5use crate::{Error, HttpClient, Identifiable, Result, builders::EditRoleBuilder};
6
7#[async_trait]
8pub trait RoleExt: Identifiable {
9 async fn edit(&self, http: impl AsRef<HttpClient> + Send, server_id: String)
10 -> EditRoleBuilder;
11 async fn delete(&self, http: impl AsRef<HttpClient> + Send, server_id: &str) -> Result<()>;
12 async fn set_permissions(
13 &self,
14 http: impl AsRef<HttpClient> + Send,
15 server_id: &str,
16 allow: u64,
17 deny: u64,
18 ) -> Result<Role>;
19}
20
21#[async_trait]
22impl RoleExt for Role {
23 async fn edit(
24 &self,
25 http: impl AsRef<HttpClient> + Send,
26 server_id: String,
27 ) -> EditRoleBuilder {
28 EditRoleBuilder::new(http.as_ref().clone(), server_id, self.id.clone())
29 }
30
31 async fn delete(&self, http: impl AsRef<HttpClient> + Send, server_id: &str) -> Result<()> {
32 http.as_ref().delete_role(server_id, &self.id).await?;
33
34 Ok(())
35 }
36
37 async fn set_permissions(
38 &self,
39 http: impl AsRef<HttpClient> + Send,
40 server_id: &str,
41 allow: u64,
42 deny: u64,
43 ) -> Result<Role> {
44 let mut server = http
45 .as_ref()
46 .set_role_server_permissions(
47 server_id,
48 &self.id,
49 &DataSetServerRolePermission {
50 permissions: Override { allow, deny },
51 },
52 )
53 .await?;
54
55 server.roles.remove(&self.id).ok_or(Error::InternalError)
56 }
57}
58
59impl Identifiable for Role {
60 fn id(&self) -> &str {
61 &self.id
62 }
63}