dash_sdk/platform/
fetch_unproved.rsuse super::{types::evonode::EvoNode, Query};
use crate::mock::MockResponse;
use crate::Sdk;
use crate::{error::Error, sync::retry};
use dapi_grpc::platform::v0::{
    self as platform_proto, GetStatusRequest, GetStatusResponse, ResponseMetadata,
};
use dpp::{dashcore::Network, version::PlatformVersion};
use drive_proof_verifier::types::EvoNodeStatus;
use drive_proof_verifier::unproved::FromUnproved;
use rs_dapi_client::{transport::TransportRequest, DapiRequest, RequestSettings};
use rs_dapi_client::{ExecutionError, ExecutionResponse, InnerInto, IntoInner};
use std::fmt::Debug;
#[async_trait::async_trait]
pub trait FetchUnproved
where
    Self: Sized + Debug + MockResponse,
{
    type Request: TransportRequest;
    async fn fetch_unproved<Q: Query<<Self as FetchUnproved>::Request>>(
        sdk: &Sdk,
        query: Q,
    ) -> Result<Option<Self>, Error>
    where
        Self: FromUnproved<
            <Self as FetchUnproved>::Request,
            Request = <Self as FetchUnproved>::Request,
            Response = <<Self as FetchUnproved>::Request as TransportRequest>::Response,
        >,
    {
        let (obj, _mtd) =
            Self::fetch_unproved_with_settings(sdk, query, RequestSettings::default()).await?;
        Ok(obj)
    }
    async fn fetch_unproved_with_settings<Q: Query<<Self as FetchUnproved>::Request>>(
        sdk: &Sdk,
        query: Q,
        settings: RequestSettings,
    ) -> Result<(Option<Self>, ResponseMetadata), Error>
    where
        Self: FromUnproved<
            <Self as FetchUnproved>::Request,
            Request = <Self as FetchUnproved>::Request,
            Response = <<Self as FetchUnproved>::Request as TransportRequest>::Response,
        >,
    {
        let request: &<Self as FetchUnproved>::Request = &query.query(false)?;
        let closure = move |local_settings: RequestSettings| async move {
            let ExecutionResponse {
                inner: response,
                address,
                retries,
            } = request
                .clone()
                .execute(sdk, local_settings)
                .await
                .map_err(|e| e.inner_into())?;
            let (object, metadata): (Option<Self>, platform_proto::ResponseMetadata) =
                Self::maybe_from_unproved_with_metadata(
                    request.clone(),
                    response,
                    sdk.network,
                    sdk.version(),
                )
                .map_err(|e| ExecutionError {
                    inner: e.into(),
                    address: Some(address.clone()),
                    retries,
                })?;
            Ok(ExecutionResponse {
                inner: (object, metadata),
                address,
                retries,
            })
        };
        let settings = sdk.dapi_client_settings.override_by(settings);
        retry(sdk.address_list(), settings, closure)
            .await
            .into_inner()
    }
}
impl FetchUnproved for drive_proof_verifier::types::CurrentQuorumsInfo {
    type Request = platform_proto::GetCurrentQuorumsInfoRequest;
}
impl FetchUnproved for EvoNodeStatus {
    type Request = EvoNode;
}
#[async_trait::async_trait]
impl FromUnproved<EvoNode> for EvoNodeStatus {
    type Request = EvoNode;
    type Response = GetStatusResponse;
    fn maybe_from_unproved_with_metadata<I: Into<Self::Request>, O: Into<Self::Response>>(
        request: I,
        response: O,
        network: Network,
        platform_version: &PlatformVersion,
    ) -> Result<(Option<Self>, ResponseMetadata), drive_proof_verifier::Error>
    where
        Self: Sized,
    {
        <Self as FromUnproved<GetStatusRequest>>::maybe_from_unproved_with_metadata(
            request.into(),
            response,
            network,
            platform_version,
        )
    }
}