use super::{ApiLinks, ApiMeta};
use super::{HasPagination, HasResponse, HasValue};
use {ROOT_URL, STATIC_URL_ERROR};
use chrono::{DateTime, Utc};
use method::{Delete, Get, List, Update};
use request::ImageRequest;
use request::Request;
use serde::Serialize;
use std::fmt::Display;
use url::Url;
const IMAGES_SEGMENT: &'static str = "images";
#[derive(Deserialize, Serialize, Debug, Clone, Getters, Setters)]
pub struct Image {
#[get = "pub"]
id: usize,
#[get = "pub"]
name: String,
#[serde(rename = "type")]
#[get = "pub"]
kind: String, #[get = "pub"]
distribution: String,
#[get = "pub"]
slug: Option<String>,
#[get = "pub"]
public: bool,
#[get = "pub"]
regions: Vec<String>,
#[get = "pub"]
min_disk_size: usize,
#[get = "pub"]
size_gigabytes: f32,
#[get = "pub"]
created_at: DateTime<Utc>,
}
impl Image {
pub fn list() -> ImageRequest<List, Vec<Image>> {
let mut url = ROOT_URL.clone();
url.path_segments_mut().expect(STATIC_URL_ERROR).push(
IMAGES_SEGMENT,
);
Request::new(url)
}
pub fn distributions() -> ImageRequest<List, Vec<Image>> {
let mut url = ROOT_URL.clone();
url.path_segments_mut().expect(STATIC_URL_ERROR).push(
IMAGES_SEGMENT,
);
url.query_pairs_mut().append_pair("type", "distribution");
Request::new(url)
}
pub fn applications() -> ImageRequest<List, Vec<Image>> {
let mut url = ROOT_URL.clone();
url.path_segments_mut().expect(STATIC_URL_ERROR).push(
IMAGES_SEGMENT,
);
url.query_pairs_mut().append_pair("type", "application");
Request::new(url)
}
pub fn user() -> ImageRequest<List, Vec<Image>> {
let mut url = ROOT_URL.clone();
url.path_segments_mut().expect(STATIC_URL_ERROR).push(
IMAGES_SEGMENT,
);
url.query_pairs_mut().append_pair("private", "true");
Request::new(url)
}
pub fn get<S>(id: S) -> ImageRequest<Get, Image>
where
S: Display,
{
let mut url = ROOT_URL.clone();
url.path_segments_mut()
.expect(STATIC_URL_ERROR)
.push(IMAGES_SEGMENT)
.push(&format!("{}", id));
Request::new(url)
}
pub fn update<S>(id: S) -> ImageRequest<Update, Image>
where
S: Display,
{
let mut url = ROOT_URL.clone();
url.path_segments_mut()
.expect(STATIC_URL_ERROR)
.push(IMAGES_SEGMENT)
.push(&format!("{}", id));
Request::new(url)
}
pub fn delete<S>(id: S) -> ImageRequest<Delete, ()>
where
S: Display,
{
let mut url = ROOT_URL.clone();
url.path_segments_mut()
.expect(STATIC_URL_ERROR)
.push(IMAGES_SEGMENT)
.push(&format!("{}", id));
Request::new(url)
}
}
impl ImageRequest<Update, Image> {
pub fn name<S>(mut self, val: S) -> ImageRequest<Update, Image>
where
S: Display + Serialize,
{
self.body_mut()["name"] = json!(val);
self
}
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct ImageResponse {
image: Image,
}
impl HasResponse for Image {
type Response = ImageResponse;
}
impl HasValue for ImageResponse {
type Value = Image;
fn value(self) -> Image {
self.image
}
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct ImageListResponse {
images: Vec<Image>,
links: ApiLinks,
meta: ApiMeta,
}
impl HasResponse for Vec<Image> {
type Response = ImageListResponse;
}
impl HasPagination for ImageListResponse {
fn next_page(&self) -> Option<Url> {
self.links.next()
}
}
impl HasValue for ImageListResponse {
type Value = Vec<Image>;
fn value(self) -> Vec<Image> {
self.images
}
}