use super::action::Action;
use super::volume::Volume;
use crate::method::{Create, Get, List};
use crate::request::Request;
use crate::request::{VolumeActionRequest, VolumeRequest};
use crate::{ROOT_URL, STATIC_URL_ERROR};
use serde::Serialize;
use std::fmt::Display;
const VOLUMES_SEGMENT: &str = "volumes";
const VOLUME_ACTIONS_SEGMENT: &str = "actions";
impl Volume {
pub fn attach<S>(volume_name: S, droplet: usize) -> VolumeActionRequest<Create, Action>
where S: AsRef<str> + Serialize + Display {
let mut url = ROOT_URL.clone();
url.path_segments_mut()
.expect(STATIC_URL_ERROR)
.push(VOLUMES_SEGMENT);
let mut req = Request::new(url);
req.set_body(json!({
"type": "attach",
"volume_name": volume_name,
"droplet_id": droplet,
}));
req
}
pub fn detach<S>(volume_name: S, droplet: usize) -> VolumeActionRequest<Create, Action>
where S: AsRef<str> + Serialize + Display {
let mut url = ROOT_URL.clone();
url.path_segments_mut()
.expect(STATIC_URL_ERROR)
.push(VOLUMES_SEGMENT);
let mut req = Request::new(url);
req.set_body(json!({
"type": "detach",
"volume_name": volume_name,
"droplet_id": droplet,
}));
req
}
}
impl VolumeRequest<Get, Volume> {
pub fn attach(mut self, droplet: usize) -> VolumeActionRequest<Create, Action> {
self.url_mut()
.path_segments_mut()
.expect(STATIC_URL_ERROR)
.push(VOLUME_ACTIONS_SEGMENT);
self.set_body(json!({
"type": "attach",
"droplet_id": droplet,
}));
self.transmute()
}
pub fn detach(mut self, droplet: usize) -> VolumeActionRequest<Create, Action> {
self.url_mut()
.path_segments_mut()
.expect(STATIC_URL_ERROR)
.push(VOLUME_ACTIONS_SEGMENT);
self.set_body(json!({
"type": "detach",
"droplet_id": droplet,
}));
self.transmute()
}
pub fn resize(mut self, size: usize) -> VolumeActionRequest<Create, Action> {
self.url_mut()
.path_segments_mut()
.expect(STATIC_URL_ERROR)
.push(VOLUME_ACTIONS_SEGMENT);
self.set_body(json!({
"type": "resize",
"size_gigabytes": size,
}));
self.transmute()
}
pub fn actions(mut self) -> VolumeActionRequest<List, Vec<Action>> {
self.url_mut()
.path_segments_mut()
.expect(STATIC_URL_ERROR)
.push(VOLUME_ACTIONS_SEGMENT);
self.transmute()
}
pub fn action(mut self, id: usize) -> VolumeActionRequest<Get, Action> {
self.url_mut()
.path_segments_mut()
.expect(STATIC_URL_ERROR)
.push(VOLUME_ACTIONS_SEGMENT)
.push(&id.to_string());
self.transmute()
}
}