digitalocean/api/
region.rs1use super::{ApiLinks, ApiMeta};
2use super::{HasPagination, HasResponse, HasValue};
3use crate::method::List;
4use crate::request::RegionRequest;
5use crate::request::Request;
6use crate::{ROOT_URL, STATIC_URL_ERROR};
7use getset::{Getters, Setters};
8use url::Url;
9
10const REGIONS_SEGMENT: &str = "regions";
11
12#[derive(Deserialize, Serialize, Debug, Clone, Getters, Setters)]
21#[get = "pub"]
22pub struct Region {
23 name: String,
26
27 slug: String,
30
31 sizes: Vec<String>,
34
35 available: bool,
38
39 features: Vec<String>,
42}
43
44impl Region {
45 pub fn list() -> RegionRequest<List, Vec<Region>> {
47 let mut url = ROOT_URL.clone();
48 url.path_segments_mut()
49 .expect(STATIC_URL_ERROR)
50 .push(REGIONS_SEGMENT);
51
52 Request::new(url)
53 }
54}
55
56#[derive(Deserialize, Serialize, Debug, Clone)]
58pub struct RegionListResponse {
59 regions: Vec<Region>,
60 links: ApiLinks,
61 meta: ApiMeta
62}
63
64impl HasResponse for Vec<Region> {
65 type Response = RegionListResponse;
66}
67
68impl HasPagination for RegionListResponse {
69 fn next_page(&self) -> Option<Url> {
70 self.links.next()
71 }
72}
73
74impl HasValue for RegionListResponse {
75 type Value = Vec<Region>;
76
77 fn value(self) -> Vec<Region> {
78 self.regions
79 }
80}