use reqwest::Method;
use serde::{Deserialize, Serialize};
use crate::client::Client;
use crate::error::BoxxkiteError;
#[derive(Debug, Clone, Default, Serialize)]
pub struct CreateVolumeOptions {
#[serde(skip_serializing_if = "Option::is_none")]
label: Option<String>,
}
impl CreateVolumeOptions {
pub fn new() -> Self {
Self::default()
}
pub fn label(mut self, label: impl Into<String>) -> Self {
self.label = Some(label.into());
self
}
}
#[derive(Debug, Clone, Deserialize)]
pub struct Volume {
pub id: String,
pub label: Option<String>,
#[serde(default)]
pub size_gb: f64,
pub status: String,
pub pvc_name: Option<String>,
pub failure_reason: Option<String>,
pub created_at: String,
}
impl Client {
pub async fn create_volume(
&self,
size_gb: f64,
options: CreateVolumeOptions,
) -> Result<Volume, BoxxkiteError> {
#[derive(Serialize)]
struct Body<'a> {
size_gb: f64,
#[serde(skip_serializing_if = "Option::is_none")]
label: Option<&'a str>,
}
let body = Body {
size_gb,
label: options.label.as_deref(),
};
let builder = self.request(Method::POST, "/v1/volumes").json(&body);
self.send(builder).await
}
pub async fn get_volume(&self, volume_id: &str) -> Result<Volume, BoxxkiteError> {
let builder = self.request(Method::GET, &format!("/v1/volumes/{volume_id}"));
self.send(builder).await
}
pub async fn list_volumes(&self) -> Result<Vec<Volume>, BoxxkiteError> {
let builder = self.request(Method::GET, "/v1/volumes");
self.send_or_default(builder).await
}
pub async fn delete_volume(&self, volume_id: &str) -> Result<(), BoxxkiteError> {
let builder = self.request(Method::DELETE, &format!("/v1/volumes/{volume_id}"));
self.send_no_content(builder).await
}
}