gmsol_sdk/client/ops/
role.rs

1use std::ops::Deref;
2
3use gmsol_programs::gmsol_store::client::{accounts, args};
4use gmsol_solana_utils::transaction_builder::TransactionBuilder;
5use solana_sdk::{pubkey::Pubkey, signer::Signer};
6
7/// Operations for role management.
8pub trait RoleOps<C> {
9    /// Enable a role.
10    fn enable_role(&self, store: &Pubkey, role: &str) -> TransactionBuilder<C>;
11
12    /// Disable a role.
13    fn disable_role(&self, store: &Pubkey, role: &str) -> TransactionBuilder<C>;
14
15    /// Grant a role to user.
16    fn grant_role(&self, store: &Pubkey, user: &Pubkey, role: &str) -> TransactionBuilder<C>;
17
18    /// Revoke a role from the user.
19    fn revoke_role(&self, store: &Pubkey, user: &Pubkey, role: &str) -> TransactionBuilder<C>;
20}
21
22impl<C: Deref<Target = impl Signer> + Clone> RoleOps<C> for crate::Client<C> {
23    fn enable_role(&self, store: &Pubkey, role: &str) -> TransactionBuilder<C> {
24        let authority = self.payer();
25        self.store_transaction()
26            .anchor_accounts(accounts::EnableRole {
27                authority,
28                store: *store,
29            })
30            .anchor_args(args::EnableRole {
31                role: role.to_string(),
32            })
33    }
34
35    fn disable_role(&self, store: &Pubkey, role: &str) -> TransactionBuilder<C> {
36        self.store_transaction()
37            .anchor_accounts(accounts::DisableRole {
38                authority: self.payer(),
39                store: *store,
40            })
41            .anchor_args(args::DisableRole {
42                role: role.to_string(),
43            })
44    }
45
46    fn grant_role(&self, store: &Pubkey, user: &Pubkey, role: &str) -> TransactionBuilder<C> {
47        let authority = self.payer();
48        self.store_transaction()
49            .anchor_accounts(accounts::GrantRole {
50                authority,
51                store: *store,
52            })
53            .anchor_args(args::GrantRole {
54                user: *user,
55                role: role.to_string(),
56            })
57    }
58
59    fn revoke_role(&self, store: &Pubkey, user: &Pubkey, role: &str) -> TransactionBuilder<C> {
60        self.store_transaction()
61            .anchor_args(args::RevokeRole {
62                user: *user,
63                role: role.to_string(),
64            })
65            .anchor_accounts(accounts::RevokeRole {
66                authority: self.payer(),
67                store: *store,
68            })
69    }
70}