use super::{ApiLinks, ApiMeta};
use super::{HasPagination, HasResponse, HasValue};
use crate::method::List;
use crate::request::Request;
use crate::request::SizeRequest;
use crate::{ROOT_URL, STATIC_URL_ERROR};
use getset::{Getters, Setters};
use url::Url;
const SIZES_SEGMENT: &str = "sizes";
#[derive(Deserialize, Serialize, Debug, Clone, Getters, Setters)]
#[get = "pub"]
pub struct Size {
slug: String,
available: bool,
transfer: f64,
price_monthly: f64,
price_hourly: f64,
memory: usize,
vcpus: usize,
disk: usize,
regions: Vec<String>
}
impl Size {
pub fn list() -> SizeRequest<List, Vec<Size>> {
let mut url = ROOT_URL.clone();
url.path_segments_mut()
.expect(STATIC_URL_ERROR)
.push(SIZES_SEGMENT);
Request::new(url)
}
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct SizeListResponse {
sizes: Vec<Size>,
links: ApiLinks,
meta: ApiMeta
}
impl HasResponse for Vec<Size> {
type Response = SizeListResponse;
}
impl HasPagination for SizeListResponse {
fn next_page(&self) -> Option<Url> {
self.links.next()
}
}
impl HasValue for SizeListResponse {
type Value = Vec<Size>;
fn value(self) -> Vec<Size> {
self.sizes
}
}