signer-remote 0.4.1

Signer remote communication package.
Documentation
use crate::{RemoteError, RemoteResult as Result};
use serde::{Deserialize, Serialize};
use signer_core::SignerError;

// 定义 AuthCodeDetail 和 AuthCodeStatus,与 signer-hub 保持一致
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq)]
pub enum AuthCodeStatus {
    Pending,
    Fetched,
    Expired,
    Completed,
}

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct AuthCodeDetail {
    pub code: String,
    pub state: String,
    pub status: AuthCodeStatus,
    pub expire_at: i64,
    pub jwt: Option<String>,
}

#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)]
pub struct PostAuthRequest {
    #[serde(rename = "jwt")]
    pub jwt: String,
    #[serde(rename = "state")]
    pub state: String,
}

impl PostAuthRequest {
    pub fn new(jwt: String, state: String) -> PostAuthRequest {
        PostAuthRequest { jwt, state }
    }
}

pub struct SignerRemoteAuth {
    pub base_url: String,
}

impl SignerRemoteAuth {
    pub fn from_url(url: String) -> Self {
        Self { base_url: url }
    }

    /// 获取认证详情,包含 state 等信息
    pub async fn get_auth_detail(&self, target: &str) -> Result<AuthCodeDetail> {
        let client = reqwest::Client::new();

        let response = client.get(target).send().await?;

        if !response.status().is_success() {
            return Err(RemoteError::Signer(SignerError::Msg(
                format!("获取认证详情失败: {}", response.status()),
            )));
        }

        let detail: AuthCodeDetail = response.json().await?;
        Ok(detail)
    }

    pub async fn post_auth(
        &self,
        target: String,
        state: String,
        jwt: String,
    ) -> Result<()> {
        let request = PostAuthRequest::new(jwt, state);

        // 使用原生 reqwest 发送请求到 target 地址
        let client = reqwest::Client::new();

        let response = client.post(&target).json(&request).send().await?;

        if !response.status().is_success() {
            return Err(RemoteError::Signer(SignerError::Msg(
                format!("认证请求失败: {}", response.status()),
            )));
        }

        Ok(())
    }
}