use super::{
account_transactions::{
fetch_account_transaction_page_async, fetch_complete_account_transactions_async,
},
fetch::{
fetch_allowance_async, fetch_archives_async, fetch_balance_async, fetch_block_types_async,
fetch_capabilities_async, fetch_index_async, fetch_tip_certificate_async,
fetch_token_async, fetch_transactions_async,
},
};
use crate::{
QueryProgress,
icrc::model::{
IcrcAccountTransactionCollectionData, IcrcAccountTransactionError,
IcrcAccountTransactionPageData, IcrcAccountTransactionPageRequest,
IcrcAccountTransactionRefreshRequest, IcrcAllowanceData, IcrcAllowanceRequest,
IcrcArchivesData, IcrcArchivesRequest, IcrcBalanceData, IcrcBalanceRequest,
IcrcBlockTypesData, IcrcCapabilitiesData, IcrcError, IcrcIndexData, IcrcLedgerRequest,
IcrcTipCertificateData, IcrcTokenData, IcrcTransactionsData, IcrcTransactionsRequest,
},
};
pub trait IcrcTokenSource: Sync {
fn fetch_token<'a>(
&'a self,
request: &'a IcrcLedgerRequest,
) -> crate::report::SourceFuture<'a, Result<IcrcTokenData, IcrcError>>;
}
pub trait IcrcBalanceSource: Sync {
fn fetch_balance<'a>(
&'a self,
request: &'a IcrcBalanceRequest,
) -> crate::report::SourceFuture<'a, Result<IcrcBalanceData, IcrcError>>;
}
pub trait IcrcAllowanceSource: Sync {
fn fetch_allowance<'a>(
&'a self,
request: &'a IcrcAllowanceRequest,
) -> crate::report::SourceFuture<'a, Result<IcrcAllowanceData, IcrcError>>;
}
pub trait IcrcIndexSource: Sync {
fn fetch_index<'a>(
&'a self,
request: &'a IcrcLedgerRequest,
) -> crate::report::SourceFuture<'a, Result<IcrcIndexData, IcrcError>>;
}
pub trait IcrcTransactionsSource: Sync {
fn fetch_transactions<'a>(
&'a self,
request: &'a IcrcTransactionsRequest,
) -> crate::report::SourceFuture<'a, Result<IcrcTransactionsData, IcrcError>>;
}
pub trait IcrcBlockTypesSource: Sync {
fn fetch_block_types<'a>(
&'a self,
request: &'a IcrcLedgerRequest,
) -> crate::report::SourceFuture<'a, Result<IcrcBlockTypesData, IcrcError>>;
}
pub trait IcrcArchivesSource: Sync {
fn fetch_archives<'a>(
&'a self,
request: &'a IcrcArchivesRequest,
) -> crate::report::SourceFuture<'a, Result<IcrcArchivesData, IcrcError>>;
}
pub trait IcrcTipCertificateSource: Sync {
fn fetch_tip_certificate<'a>(
&'a self,
request: &'a IcrcLedgerRequest,
) -> crate::report::SourceFuture<'a, Result<IcrcTipCertificateData, IcrcError>>;
}
pub trait IcrcCapabilitiesSource: Sync {
fn fetch_capabilities<'a>(
&'a self,
request: &'a IcrcLedgerRequest,
) -> crate::report::SourceFuture<'a, Result<IcrcCapabilitiesData, IcrcError>>;
}
pub trait IcrcAccountTransactionPageSource: Sync {
fn fetch_account_transaction_page<'a>(
&'a self,
request: &'a IcrcAccountTransactionPageRequest,
) -> crate::report::SourceFuture<
'a,
Result<IcrcAccountTransactionPageData, IcrcAccountTransactionError>,
>;
}
pub trait IcrcAccountTransactionCollectionSource: Sync {
fn fetch_complete_account_transactions<'a>(
&'a self,
request: &'a IcrcAccountTransactionRefreshRequest,
progress: &'a mut (dyn QueryProgress + Send),
) -> crate::report::SourceFuture<
'a,
Result<IcrcAccountTransactionCollectionData, IcrcAccountTransactionError>,
>;
}
#[derive(Clone, Debug, Default)]
pub struct LiveIcrcSource {
pub(crate) agent: crate::agent::EndpointAgent,
}
impl IcrcTokenSource for LiveIcrcSource {
fn fetch_token<'a>(
&'a self,
request: &'a IcrcLedgerRequest,
) -> crate::report::SourceFuture<'a, Result<IcrcTokenData, IcrcError>> {
Box::pin(async move { fetch_token_async(self, request).await })
}
}
impl IcrcBalanceSource for LiveIcrcSource {
fn fetch_balance<'a>(
&'a self,
request: &'a IcrcBalanceRequest,
) -> crate::report::SourceFuture<'a, Result<IcrcBalanceData, IcrcError>> {
Box::pin(async move { fetch_balance_async(self, request).await })
}
}
impl IcrcAllowanceSource for LiveIcrcSource {
fn fetch_allowance<'a>(
&'a self,
request: &'a IcrcAllowanceRequest,
) -> crate::report::SourceFuture<'a, Result<IcrcAllowanceData, IcrcError>> {
Box::pin(async move { fetch_allowance_async(self, request).await })
}
}
impl IcrcIndexSource for LiveIcrcSource {
fn fetch_index<'a>(
&'a self,
request: &'a IcrcLedgerRequest,
) -> crate::report::SourceFuture<'a, Result<IcrcIndexData, IcrcError>> {
Box::pin(async move { fetch_index_async(self, request).await })
}
}
impl IcrcTransactionsSource for LiveIcrcSource {
fn fetch_transactions<'a>(
&'a self,
request: &'a IcrcTransactionsRequest,
) -> crate::report::SourceFuture<'a, Result<IcrcTransactionsData, IcrcError>> {
Box::pin(async move { fetch_transactions_async(self, request).await })
}
}
impl IcrcBlockTypesSource for LiveIcrcSource {
fn fetch_block_types<'a>(
&'a self,
request: &'a IcrcLedgerRequest,
) -> crate::report::SourceFuture<'a, Result<IcrcBlockTypesData, IcrcError>> {
Box::pin(async move { fetch_block_types_async(self, request).await })
}
}
impl IcrcArchivesSource for LiveIcrcSource {
fn fetch_archives<'a>(
&'a self,
request: &'a IcrcArchivesRequest,
) -> crate::report::SourceFuture<'a, Result<IcrcArchivesData, IcrcError>> {
Box::pin(async move { fetch_archives_async(self, request).await })
}
}
impl IcrcTipCertificateSource for LiveIcrcSource {
fn fetch_tip_certificate<'a>(
&'a self,
request: &'a IcrcLedgerRequest,
) -> crate::report::SourceFuture<'a, Result<IcrcTipCertificateData, IcrcError>> {
Box::pin(async move { fetch_tip_certificate_async(self, request).await })
}
}
impl IcrcCapabilitiesSource for LiveIcrcSource {
fn fetch_capabilities<'a>(
&'a self,
request: &'a IcrcLedgerRequest,
) -> crate::report::SourceFuture<'a, Result<IcrcCapabilitiesData, IcrcError>> {
Box::pin(async move { fetch_capabilities_async(self, request).await })
}
}
impl IcrcAccountTransactionPageSource for LiveIcrcSource {
fn fetch_account_transaction_page<'a>(
&'a self,
request: &'a IcrcAccountTransactionPageRequest,
) -> crate::report::SourceFuture<
'a,
Result<IcrcAccountTransactionPageData, IcrcAccountTransactionError>,
> {
Box::pin(async move { fetch_account_transaction_page_async(self, request).await })
}
}
impl IcrcAccountTransactionCollectionSource for LiveIcrcSource {
fn fetch_complete_account_transactions<'a>(
&'a self,
request: &'a IcrcAccountTransactionRefreshRequest,
progress: &'a mut (dyn QueryProgress + Send),
) -> crate::report::SourceFuture<
'a,
Result<IcrcAccountTransactionCollectionData, IcrcAccountTransactionError>,
> {
Box::pin(
async move { fetch_complete_account_transactions_async(self, request, progress).await },
)
}
}