use crate::{
data::droplet::DigitalOceanDropletRoot, DigitalOceanApi, DigitalOceanDroplet, DigitalOceanError,
};
use serde::Serialize;
#[derive(Serialize, Debug)]
struct CreateInstanceConfig {
name: String,
size_id: String,
image_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
region: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
ssh_keys: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
backups: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
ipv6: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
monitoring: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
tags: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
user_data: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
volumes: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
vpc_uuid: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
with_droplet_agent: Option<bool>,
}
pub struct CreateDropletBuilder {
api: DigitalOceanApi,
config: CreateInstanceConfig,
}
impl CreateDropletBuilder {
pub fn new<S1, S2, S3>(api: DigitalOceanApi, name: S1, size_id: S2, image_id: S3) -> Self
where
S1: Into<String>,
S2: Into<String>,
S3: Into<String>,
{
let instancebuilder = CreateDropletBuilder {
api,
config: CreateInstanceConfig {
name: name.into(),
size_id: size_id.into(),
image_id: image_id.into(),
region: None,
ipv6: None,
ssh_keys: None,
backups: None,
monitoring: None,
tags: None,
user_data: None,
volumes: None,
vpc_uuid: None,
with_droplet_agent: None,
},
};
instancebuilder
}
pub fn region(mut self, region: &str) -> Self {
self.config.region = Some(region.to_string());
self
}
pub fn ssh_keys(mut self, ssh_keys: Vec<String>) -> Self {
self.config.ssh_keys = Some(ssh_keys);
self
}
pub fn backups(mut self, enable_backups: bool) -> Self {
self.config.backups = Some(enable_backups);
self
}
pub fn ipv6(mut self, enable_ipv6: bool) -> Self {
self.config.ipv6 = Some(enable_ipv6);
self
}
pub fn monitoring(mut self, enable_monitoring: bool) -> Self {
self.config.monitoring = Some(enable_monitoring);
self
}
pub fn tags(mut self, tags: Vec<String>) -> Self {
self.config.tags = Some(tags);
self
}
pub fn user_data(mut self, user_data: &str) -> Self {
self.config.user_data = Some(user_data.to_string());
self
}
pub fn volumes(mut self, volumes: Vec<String>) -> Self {
self.config.volumes = Some(volumes);
self
}
pub fn vpc_uuid(mut self, vpc_uuid: &str) -> Self {
self.config.vpc_uuid = Some(vpc_uuid.to_string());
self
}
pub fn with_droplet_agent(mut self, with_droplet_agent: bool) -> Self {
self.config.with_droplet_agent = Some(with_droplet_agent);
self
}
#[cfg(feature = "blocking")]
pub fn run(self) -> Result<DigitalOceanDroplet, DigitalOceanError> {
let url = format!("https://api.digitalocean.com/v2/droplets");
Ok(self
.api
.post(&url, self.config)?
.json::<DigitalOceanDropletRoot>()?
.droplet)
}
pub async fn run_async(self) -> Result<DigitalOceanDroplet, DigitalOceanError> {
let url = format!("https://api.digitalocean.com/v2/droplets");
Ok(self
.api
.post_async(&url, self.config)
.await?
.json::<DigitalOceanDropletRoot>()
.await?
.droplet)
}
}