use crate::{ ClientError, Config, EventContext, EventUnsubscriber, Program, ProgramAccountsIterator, RequestBuilder, }; use anchor_lang::{prelude::Pubkey, AccountDeserialize, Discriminator}; use solana_client::{rpc_config::RpcSendTransactionConfig, rpc_filter::RpcFilterType}; use solana_sdk::{ commitment_config::CommitmentConfig, signature::Signature, signer::Signer, transaction::Transaction, }; use std::{marker::PhantomData, ops::Deref, sync::Arc}; use tokio::sync::RwLock; impl<'a> EventUnsubscriber<'a> { /// Unsubscribe gracefully. pub async fn unsubscribe(self) { self.unsubscribe_internal().await } } impl + Clone> Program { pub fn new(program_id: Pubkey, cfg: Config) -> Result { Ok(Self { program_id, cfg, sub_client: Arc::new(RwLock::new(None)), }) } /// Returns the account at the given address. pub async fn account(&self, address: Pubkey) -> Result { self.account_internal(address).await } /// Returns all program accounts of the given type matching the given filters pub async fn accounts( &self, filters: Vec, ) -> Result, ClientError> { self.accounts_lazy(filters).await?.collect() } /// Returns all program accounts of the given type matching the given filters as an iterator /// Deserialization is executed lazily pub async fn accounts_lazy( &self, filters: Vec, ) -> Result, ClientError> { self.accounts_lazy_internal(filters).await } /// Subscribe to program logs. /// /// Returns an [`EventUnsubscriber`] to unsubscribe and close connection gracefully. pub async fn on( &self, f: impl Fn(&EventContext, T) + Send + 'static, ) -> Result { let (handle, rx) = self.on_internal(f).await?; Ok(EventUnsubscriber { handle, rx, _lifetime_marker: PhantomData, }) } } impl<'a, C: Deref + Clone> RequestBuilder<'a, C> { pub fn from( program_id: Pubkey, cluster: &str, payer: C, options: Option, ) -> Self { Self { program_id, payer, cluster: cluster.to_string(), accounts: Vec::new(), options: options.unwrap_or_default(), instructions: Vec::new(), instruction_data: None, signers: Vec::new(), } } pub async fn signed_transaction(&self) -> Result { self.signed_transaction_internal().await } pub async fn send(self) -> Result { self.send_internal().await } pub async fn send_with_spinner_and_config( self, config: RpcSendTransactionConfig, ) -> Result { self.send_with_spinner_and_config_internal(config).await } }