novax-executor 0.2.12

Part of the NovaX framework, this crate facilitates the execution of transactions and queries against smart contracts on the blockchain.
use crate::error::executor::ExecutorError;
use crate::utils::events::decodable_event::DecodableEvent;
use crate::utils::events::query_events_options::EventQueryOptions;
use crate::utils::events::query_result::EventQueryResult;
use crate::IntoFilterTerms;
use async_trait::async_trait;
use novax_data::Address;
use std::sync::Arc;
use tokio::sync::Mutex;

#[async_trait]
pub trait QueryEventsExecutor: Send + Sync {
    async fn execute<EventReturn, FilterOptions>(
        &self,
        contract_address: &Address,
        event_identifier: &str,
        options: Option<EventQueryOptions>,
        filters: Option<FilterOptions>
    ) -> Result<Vec<EventQueryResult<EventReturn>>, ExecutorError>
    where
        EventReturn: DecodableEvent + Send + Sync,
        FilterOptions: IntoFilterTerms + Send + Sync;
}

#[async_trait]
impl<T: QueryEventsExecutor> QueryEventsExecutor for Arc<T> {
    async fn execute<EventReturn, FilterOptions>(
        &self,
        contract_address: &Address,
        event_identifier: &str,
        options: Option<EventQueryOptions>,
        filters: Option<FilterOptions>
    ) -> Result<Vec<EventQueryResult<EventReturn>>, ExecutorError>
    where
        EventReturn: DecodableEvent + Send + Sync,
        FilterOptions: IntoFilterTerms + Send + Sync,
    {
        T::execute::<EventReturn, FilterOptions>(
            self,
            contract_address,
            event_identifier,
            options,
            filters
        ).await
    }
}

#[async_trait]
impl<T: QueryEventsExecutor> QueryEventsExecutor for Arc<Mutex<T>> {
    async fn execute<EventReturn, FilterOptions>(
        &self,
        contract_address: &Address,
        event_identifier: &str,
        options: Option<EventQueryOptions>,
        filters: Option<FilterOptions>
    ) -> Result<Vec<EventQueryResult<EventReturn>>, ExecutorError>
    where
        EventReturn: DecodableEvent + Send + Sync,
        FilterOptions: IntoFilterTerms + Send + Sync,
    {
        {
            let executor = self.lock().await;
            executor.execute::<EventReturn, FilterOptions>(
                contract_address,
                event_identifier,
                options,
                filters
            ).await
        }
    }
}