Skip to main content

stoat/ext/
role.rs

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}