use super::{HasResponse, HasValue};
use crate::method::Create;
use crate::request::CustomImageRequest;
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;
const IMAGES_SEGMENT: &str = "images";
#[derive(Deserialize, Serialize, Debug, Clone, Getters, Setters)]
pub struct CustomImage {
id: usize,
name: String,
#[serde(rename = "type")]
kind: String,
distribution: String,
regions: Vec<String>,
tags: Vec<String>,
created_at: DateTime<Utc>,
description: String,
status: String
}
impl CustomImage {
pub fn create<S: AsRef<str> + Display + Serialize>(
name: S,
image_url: S,
region: S,
distribution: S,
desc: S,
tags: Vec<S>,
) -> CustomImageRequest<Create, CustomImage> {
let mut url = ROOT_URL.clone();
url.path_segments_mut()
.expect(STATIC_URL_ERROR)
.push(IMAGES_SEGMENT);
let mut req = Request::new(url);
req.set_body(json!({
"name": name,
"url": image_url,
"region": region,
"distribution": distribution,
"description": desc,
"tags": tags
}));
req
}
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct CustomImageResponse {
image: CustomImage
}
impl HasResponse for CustomImage {
type Response = CustomImageResponse;
}
impl HasValue for CustomImageResponse {
type Value = CustomImage;
fn value(self) -> CustomImage {
self.image
}
}