use alloy::signers::gcp::{
GcpKeyRingRef, GcpSigner, GcpSignerError, KeySpecifier,
gcloud_sdk::{
self, GoogleApi,
google::cloud::kms::v1::key_management_service_client::KeyManagementServiceClient,
},
};
use serde::Deserialize;
use thiserror::Error;
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum GcpSignerConfigError {
#[error("failed to build GCP Cloud KMS client: {0}")]
GCloudSdk(#[from] gcloud_sdk::error::Error),
#[error("failed to create GCP signer: {0}")]
Signer(#[from] GcpSignerError),
}
#[derive(Debug, Clone, Deserialize)]
#[non_exhaustive]
pub struct GcpSignerConfig {
pub project_id: String,
pub location: String,
pub keyring: String,
pub key_name: String,
pub key_version: u64,
pub chain_id: Option<u64>,
}
impl GcpSignerConfig {
pub async fn into_signer(self) -> Result<GcpSigner, GcpSignerConfigError> {
let keyring = GcpKeyRingRef::new(&self.project_id, &self.location, &self.keyring);
let client = GoogleApi::from_function(
KeyManagementServiceClient::new,
"https://cloudkms.googleapis.com",
None,
)
.await?;
let specifier = KeySpecifier::new(keyring, &self.key_name, self.key_version);
let signer = GcpSigner::new(client, specifier, self.chain_id).await?;
Ok(signer)
}
}