made-client 0.7.8

Reusable operator client for MADE's public gRPC API.
Documentation
use made_proto::v1::{
    ApproveCeremonyGuardRequest, CancelCeremonyRequest, CeremonyInstanceState,
    EnforceCeremonyDeadlinesRequest, PauseCeremonyRequest, ResumeCeremonyRequest,
};

use crate::{MadeClient, MadeClientError};

impl MadeClient {
    pub async fn pause(
        &self,
        request: PauseCeremonyRequest,
    ) -> Result<CeremonyInstanceState, MadeClientError> {
        let response = self
            .rpc()
            .pause_ceremony(Self::request(
                &self.context(),
                "/underpass.made.v1.MadeService/PauseCeremony",
                request,
            ))
            .await
            .map_err(MadeClientError::from_status)?
            .into_inner();
        required_instance(response.instance, "pause")
    }

    pub async fn resume(
        &self,
        request: ResumeCeremonyRequest,
    ) -> Result<CeremonyInstanceState, MadeClientError> {
        let response = self
            .rpc()
            .resume_ceremony(Self::request(
                &self.context(),
                "/underpass.made.v1.MadeService/ResumeCeremony",
                request,
            ))
            .await
            .map_err(MadeClientError::from_status)?
            .into_inner();
        required_instance(response.instance, "resume")
    }

    pub async fn cancel(
        &self,
        request: CancelCeremonyRequest,
    ) -> Result<CeremonyInstanceState, MadeClientError> {
        let response = self
            .rpc()
            .cancel_ceremony(Self::request(
                &self.context(),
                "/underpass.made.v1.MadeService/CancelCeremony",
                request,
            ))
            .await
            .map_err(MadeClientError::from_status)?
            .into_inner();
        required_instance(response.instance, "cancel")
    }

    pub async fn enforce_deadlines(
        &self,
        ceremony_id: impl Into<String>,
    ) -> Result<CeremonyInstanceState, MadeClientError> {
        let response = self
            .rpc()
            .enforce_ceremony_deadlines(Self::request(
                &self.context(),
                "/underpass.made.v1.MadeService/EnforceCeremonyDeadlines",
                EnforceCeremonyDeadlinesRequest {
                    ceremony_id: ceremony_id.into(),
                },
            ))
            .await
            .map_err(MadeClientError::from_status)?
            .into_inner();
        required_instance(response.instance, "enforce deadlines")
    }

    pub async fn approve(
        &self,
        request: ApproveCeremonyGuardRequest,
    ) -> Result<CeremonyInstanceState, MadeClientError> {
        let response = self
            .rpc()
            .approve_ceremony_guard(Self::request(
                &self.context(),
                "/underpass.made.v1.MadeService/ApproveCeremonyGuard",
                request,
            ))
            .await
            .map_err(MadeClientError::from_status)?
            .into_inner();
        required_instance(response.instance, "approve guard")
    }
}

fn required_instance(
    instance: Option<CeremonyInstanceState>,
    operation: &str,
) -> Result<CeremonyInstanceState, MadeClientError> {
    instance.ok_or_else(|| {
        MadeClientError::ProtocolViolation(format!("{operation} response has no instance"))
    })
}