use super::{ApiLinks, ApiMeta};
use super::{HasPagination, HasResponse, HasValue};
use {ROOT_URL, STATIC_URL_ERROR};
use method::List;
use request::RegionRequest;
use request::Request;
use url::Url;
const REGIONS_SEGMENT: &'static str = "regions";
#[derive(Deserialize, Serialize, Debug, Clone, Getters, Setters)]
pub struct Region {
#[get = "pub"]
name: String,
#[get = "pub"]
slug: String,
#[get = "pub"]
sizes: Vec<String>,
#[get = "pub"]
available: bool,
#[get = "pub"]
features: Vec<String>,
}
impl Region {
pub fn list() -> RegionRequest<List, Vec<Region>> {
let mut url = ROOT_URL.clone();
url.path_segments_mut().expect(STATIC_URL_ERROR).push(
REGIONS_SEGMENT,
);
Request::new(url)
}
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct RegionListResponse {
regions: Vec<Region>,
links: ApiLinks,
meta: ApiMeta,
}
impl HasResponse for Vec<Region> {
type Response = RegionListResponse;
}
impl HasPagination for RegionListResponse {
fn next_page(&self) -> Option<Url> {
self.links.next()
}
}
impl HasValue for RegionListResponse {
type Value = Vec<Region>;
fn value(self) -> Vec<Region> {
self.regions
}
}