use super::{ApiLinks, ApiMeta};
use super::{HasPagination, HasResponse, HasValue};
use crate::method::{Delete, Get, List, Update};
use crate::request::ImageRequest;
use crate::request::Request;
use crate::{ROOT_URL, STATIC_URL_ERROR};
use chrono::{DateTime, Utc};
use getset::{Getters, Setters};
use serde::Serialize;
use std::fmt::Display;
use url::Url;
const IMAGES_SEGMENT: &str = "images";
#[derive(Deserialize, Serialize, Debug, Clone, Getters, Setters)]
#[get = "pub"]
pub struct Image {
id: usize,
name: String,
#[serde(rename = "type")]
kind: String,
distribution: String,
slug: Option<String>,
public: bool,
regions: Vec<String>,
min_disk_size: usize,
size_gigabytes: Option<f32>,
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: Display>(id: S) -> ImageRequest<Get, Image> {
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: Display>(id: S) -> ImageRequest<Update, Image> {
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: Display>(id: S) -> ImageRequest<Delete, ()> {
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: Display + Serialize>(mut self, val: S) -> ImageRequest<Update, Image> {
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
}
}