use reqwest::Method;
use serde::Serialize;
use serde::de::DeserializeOwned;
use wyrd_spec::error::WyrdError;
use wyrd_spec::gateway::{
ProviderCredentialView, ProviderCredentialWrite, ProviderDeploymentsApplied,
ProviderDeploymentsApply,
};
use wyrd_spec::ids::ProviderCredentialName;
use crate::WyrdClient;
use crate::gateway::{DEPLOYMENTS, credential_path};
#[derive(Debug, Clone)]
pub struct CredentialWriter {
client: WyrdClient,
}
impl CredentialWriter {
#[must_use]
pub fn new(client: WyrdClient) -> Self {
Self { client }
}
pub async fn put_credential(
&self,
write: &ProviderCredentialWrite,
) -> Result<ProviderCredentialView, WyrdError> {
self.send(Method::PUT, &credential_path(&write.name), Some(write))
.await
}
pub async fn apply_deployments(
&self,
apply: &ProviderDeploymentsApply,
) -> Result<ProviderDeploymentsApplied, WyrdError> {
self.send(Method::POST, DEPLOYMENTS, Some(apply)).await
}
pub async fn revoke_credential(
&self,
name: &ProviderCredentialName,
) -> Result<ProviderCredentialView, WyrdError> {
let path = format!("{}/revoke", credential_path(name));
self.send(Method::POST, &path, None::<&()>).await
}
pub async fn delete_credential(&self, name: &ProviderCredentialName) -> Result<(), WyrdError> {
self.send(Method::DELETE, &credential_path(name), None::<&()>)
.await
}
async fn send<S: Serialize, D: DeserializeOwned>(
&self,
method: Method,
path: &str,
body: Option<&S>,
) -> Result<D, WyrdError> {
self.client.http.request_json(method, path, body).await
}
}