use ::prost::Message;
use reqwest;
use reqwest::Client;
use crate::error::VssError;
use crate::types::{
DeleteObjectRequest, DeleteObjectResponse, GetObjectRequest, GetObjectResponse, ListKeyVersionsRequest,
ListKeyVersionsResponse, PutObjectRequest, PutObjectResponse,
};
#[derive(Clone)]
pub struct VssClient {
base_url: String,
client: Client,
}
impl VssClient {
pub fn new(base_url: &str) -> Self {
let client = Client::new();
Self { base_url: String::from(base_url), client }
}
pub async fn get_object(&self, request: &GetObjectRequest) -> Result<GetObjectResponse, VssError> {
let url = format!("{}/getObject", self.base_url);
let raw_response = self.client.post(url).body(request.encode_to_vec()).send().await?;
let status = raw_response.status();
let payload = raw_response.bytes().await?;
if status.is_success() {
let response = GetObjectResponse::decode(&payload[..])?;
if response.value.is_none() {
return Err(VssError::InternalServerError(
"VSS Server API Violation, expected value in GetObjectResponse but found none".to_string(),
));
}
Ok(response)
} else {
Err(VssError::new(status, payload))
}
}
pub async fn put_object(&self, request: &PutObjectRequest) -> Result<PutObjectResponse, VssError> {
let url = format!("{}/putObjects", self.base_url);
let response_raw = self.client.post(url).body(request.encode_to_vec()).send().await?;
let status = response_raw.status();
let payload = response_raw.bytes().await?;
if status.is_success() {
let response = PutObjectResponse::decode(&payload[..])?;
Ok(response)
} else {
Err(VssError::new(status, payload))
}
}
pub async fn delete_object(&self, request: &DeleteObjectRequest) -> Result<DeleteObjectResponse, VssError> {
let url = format!("{}/deleteObject", self.base_url);
let response_raw = self.client.post(url).body(request.encode_to_vec()).send().await?;
let status = response_raw.status();
let payload = response_raw.bytes().await?;
if status.is_success() {
let response = DeleteObjectResponse::decode(&payload[..])?;
Ok(response)
} else {
Err(VssError::new(status, payload))
}
}
pub async fn list_key_versions(
&self, request: &ListKeyVersionsRequest,
) -> Result<ListKeyVersionsResponse, VssError> {
let url = format!("{}/listKeyVersions", self.base_url);
let response_raw = self.client.post(url).body(request.encode_to_vec()).send().await?;
let status = response_raw.status();
let payload = response_raw.bytes().await?;
if status.is_success() {
let response = ListKeyVersionsResponse::decode(&payload[..])?;
Ok(response)
} else {
Err(VssError::new(status, payload))
}
}
}