devol_accounts_kit/account_readers/
dvl_readable.rs

1use std::error::Error;
2use async_trait::async_trait;
3use solana_program::pubkey::Pubkey;
4use crate::dvl_client::dvl_client::DvlClient;
5use crate::accounts::client::client_account::client_account::ClientAccount;
6use crate::accounts::client::client_account::signer_account_params::SignerAccountParams;
7use crate::accounts::devol_account::DevolAccount;
8
9pub struct DvlIndexParam {
10    pub id: u32,
11}
12
13pub struct DvlClientParam<'a> {
14    pub client_account: &'a ClientAccount,
15}
16
17pub struct DvlClientParams<'a> {
18    pub client_address: &'a Pubkey,
19    pub signer_account_params: Option<&'a SignerAccountParams<'a>>,
20}
21
22#[async_trait]
23pub trait DvlReadable {
24    type DvlReadParams<'a>;
25
26    async fn get_public_key<'a>(
27        client: &DvlClient,
28        params: &Self::DvlReadParams<'a>
29    ) -> Result<Box<Pubkey>, Box<dyn Error>>
30        where
31            Self: Sized;
32
33    async fn read<'a>(
34        client: &DvlClient,
35        params: &Self::DvlReadParams<'a>
36    ) -> Result<Box<Self>, Box<dyn Error>>
37        where
38            Self: Sized;
39
40    async fn read_by_public_key(
41        client: &DvlClient,
42        public_key: &Pubkey,
43    ) -> Result<Box<Self>, Box<dyn Error>>
44        where
45            Self: Sized + DevolAccount + Copy
46    {
47        let mut rpc_data = client.rpc_client.get_account(public_key).await?;
48        let account = Self::from_account_basic(
49            public_key,
50            &mut rpc_data,
51            &client.root_pda.key,
52            &client.program_id,
53        )?;
54
55        Ok(account)
56    }
57}