boxxkite_client/
volumes.rs1use reqwest::Method;
6use serde::{Deserialize, Serialize};
7
8use crate::client::Client;
9use crate::error::BoxxkiteError;
10
11#[derive(Debug, Clone, Default, Serialize)]
13pub struct CreateVolumeOptions {
14 #[serde(skip_serializing_if = "Option::is_none")]
15 label: Option<String>,
16}
17
18impl CreateVolumeOptions {
19 pub fn new() -> Self {
20 Self::default()
21 }
22
23 pub fn label(mut self, label: impl Into<String>) -> Self {
24 self.label = Some(label.into());
25 self
26 }
27}
28
29#[derive(Debug, Clone, Deserialize)]
35pub struct Volume {
36 pub id: String,
37 pub label: Option<String>,
38 #[serde(default)]
39 pub size_gb: f64,
40 pub status: String,
42 pub pvc_name: Option<String>,
43 pub failure_reason: Option<String>,
44 pub created_at: String,
45}
46
47impl Client {
48 pub async fn create_volume(
54 &self,
55 size_gb: f64,
56 options: CreateVolumeOptions,
57 ) -> Result<Volume, BoxxkiteError> {
58 #[derive(Serialize)]
59 struct Body<'a> {
60 size_gb: f64,
61 #[serde(skip_serializing_if = "Option::is_none")]
62 label: Option<&'a str>,
63 }
64 let body = Body {
65 size_gb,
66 label: options.label.as_deref(),
67 };
68 let builder = self.request(Method::POST, "/v1/volumes").json(&body);
69 self.send(builder).await
70 }
71
72 pub async fn get_volume(&self, volume_id: &str) -> Result<Volume, BoxxkiteError> {
74 let builder = self.request(Method::GET, &format!("/v1/volumes/{volume_id}"));
75 self.send(builder).await
76 }
77
78 pub async fn list_volumes(&self) -> Result<Vec<Volume>, BoxxkiteError> {
80 let builder = self.request(Method::GET, "/v1/volumes");
81 self.send_or_default(builder).await
82 }
83
84 pub async fn delete_volume(&self, volume_id: &str) -> Result<(), BoxxkiteError> {
86 let builder = self.request(Method::DELETE, &format!("/v1/volumes/{volume_id}"));
87 self.send_no_content(builder).await
88 }
89}