use crate::{
data::image::DigitalOceanImagesRoot, DigitalOceanApi, DigitalOceanError, DigitalOceanImage,
};
use serde::Serialize;
#[derive(Serialize, Debug)]
struct ListImagesConfig {
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "type")]
image_type: Option<ImageType>,
#[serde(skip_serializing_if = "Option::is_none")]
private: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
tag_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
per_page: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
page: Option<u32>,
}
pub struct ListImagesBuilder {
api: DigitalOceanApi,
config: ListImagesConfig,
}
#[derive(Serialize, Debug)]
#[serde(rename_all = "lowercase")]
pub enum ImageType {
Application,
Distribution,
}
impl ListImagesBuilder {
pub fn new(api: DigitalOceanApi) -> Self {
let instancebuilder = ListImagesBuilder {
api,
config: ListImagesConfig {
image_type: None,
private: None,
tag_name: None,
per_page: None,
page: None,
},
};
instancebuilder
}
pub fn image_type(mut self, image_type: ImageType) -> Self {
self.config.image_type = Some(image_type);
self
}
pub fn private(mut self, private: bool) -> Self {
self.config.private = Some(private);
self
}
pub fn tag_name(mut self, tag_name: &str) -> Self {
self.config.tag_name = Some(tag_name.to_string());
self
}
pub fn per_page(mut self, per_page: u32) -> Self {
self.config.per_page = Some(per_page);
self
}
pub fn page(mut self, page: u32) -> Self {
self.config.page = Some(page);
self
}
#[cfg(feature = "blocking")]
pub fn run(self) -> Result<Vec<DigitalOceanImage>, DigitalOceanError> {
let images = self
.api
.get("https://api.digitalocean.com/v2/images", self.config)?
.json::<DigitalOceanImagesRoot>()?
.images;
Ok(images)
}
pub async fn run_async(self) -> Result<Vec<DigitalOceanImage>, DigitalOceanError> {
let images = self
.api
.get_async("https://api.digitalocean.com/v2/images", self.config)
.await?
.json::<DigitalOceanImagesRoot>()
.await?
.images;
Ok(images)
}
}