digitalocean_api/api/
volume_action.rs1use super::action::Action;
2use super::volume::Volume;
3use crate::method::{Create, Get, List};
4use crate::request::Request;
5use crate::request::{VolumeActionRequest, VolumeRequest};
6use crate::{ROOT_URL, STATIC_URL_ERROR};
7use serde::Serialize;
8use std::fmt::Display;
9
10const VOLUMES_SEGMENT: &str = "volumes";
11const VOLUME_ACTIONS_SEGMENT: &str = "actions";
12
13impl Volume {
14 pub fn attach<S>(volume_name: S, droplet: usize) -> VolumeActionRequest<Create, Action>
16 where
17 S: AsRef<str> + Serialize + Display,
18 {
19 let mut url = ROOT_URL.clone();
20 url.path_segments_mut()
21 .expect(STATIC_URL_ERROR)
22 .push(VOLUMES_SEGMENT);
23
24 let mut req = Request::new(url);
25 req.set_body(json!({
26 "type": "attach",
27 "volume_name": volume_name,
28 "droplet_id": droplet,
29 }));
30 req
31 }
32
33 pub fn detach<S>(volume_name: S, droplet: usize) -> VolumeActionRequest<Create, Action>
35 where
36 S: AsRef<str> + Serialize + Display,
37 {
38 let mut url = ROOT_URL.clone();
39 url.path_segments_mut()
40 .expect(STATIC_URL_ERROR)
41 .push(VOLUMES_SEGMENT);
42
43 let mut req = Request::new(url);
44 req.set_body(json!({
45 "type": "detach",
46 "volume_name": volume_name,
47 "droplet_id": droplet,
48 }));
49 req
50 }
51}
52
53impl VolumeRequest<Get, Volume> {
54 pub fn attach(mut self, droplet: usize) -> VolumeActionRequest<Create, Action> {
56 self.url_mut()
57 .path_segments_mut()
58 .expect(STATIC_URL_ERROR)
59 .push(VOLUME_ACTIONS_SEGMENT);
60
61 self.set_body(json!({
62 "type": "attach",
63 "droplet_id": droplet,
64 }));
65
66 self.transmute()
67 }
68
69 pub fn detach(mut self, droplet: usize) -> VolumeActionRequest<Create, Action> {
71 self.url_mut()
72 .path_segments_mut()
73 .expect(STATIC_URL_ERROR)
74 .push(VOLUME_ACTIONS_SEGMENT);
75
76 self.set_body(json!({
77 "type": "detach",
78 "droplet_id": droplet,
79 }));
80
81 self.transmute()
82 }
83
84 pub fn resize(mut self, size: usize) -> VolumeActionRequest<Create, Action> {
86 self.url_mut()
87 .path_segments_mut()
88 .expect(STATIC_URL_ERROR)
89 .push(VOLUME_ACTIONS_SEGMENT);
90
91 self.set_body(json!({
92 "type": "resize",
93 "size_gigabytes": size,
94 }));
95
96 self.transmute()
97 }
98
99 pub fn actions(mut self) -> VolumeActionRequest<List, Vec<Action>> {
101 self.url_mut()
102 .path_segments_mut()
103 .expect(STATIC_URL_ERROR)
104 .push(VOLUME_ACTIONS_SEGMENT);
105
106 self.transmute()
107 }
108
109 pub fn action(mut self, id: usize) -> VolumeActionRequest<Get, Action> {
111 self.url_mut()
112 .path_segments_mut()
113 .expect(STATIC_URL_ERROR)
114 .push(VOLUME_ACTIONS_SEGMENT)
115 .push(&id.to_string());
116
117 self.transmute()
118 }
119}