vultr 0.4.4

A pure Rust Vultr API binding.
Documentation
use crate::{VultrApi, VultrError};
use serde::Serialize;

/// Builder for updating an existing DNS record within a domain.
///
/// See the [Vultr API documentation](https://www.vultr.com/api/#tag/dns/operation/update-domain-record) for details.
pub struct VultrUpdateDnsRecordBuilder {
    api: VultrApi,
    domainname: String,
    record_id: String,
    config: UpdateDnsRecordConfig,
}

#[derive(Serialize, Debug)]
struct UpdateDnsRecordConfig {
    #[serde(skip_serializing_if = "Option::is_none")]
    name: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    data: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    ttl: Option<u64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    priority: Option<u64>,
}

impl VultrUpdateDnsRecordBuilder {
    pub fn new<S1: Into<String>, S2: Into<String>>(
        api: &VultrApi,
        domainname: S1,
        record_id: S2,
    ) -> Self {
        VultrUpdateDnsRecordBuilder {
            api: api.clone(),
            domainname: domainname.into(),
            record_id: record_id.into(),
            config: UpdateDnsRecordConfig {
                name: None,
                data: None,
                ttl: None,
                priority: None,
            },
        }
    }

    pub fn name<S: Into<String>>(mut self, b: S) -> VultrUpdateDnsRecordBuilder {
        self.config.name = Some(b.into());
        self
    }

    pub fn data<S: Into<String>>(mut self, data: S) -> VultrUpdateDnsRecordBuilder {
        self.config.data = Some(data.into());
        self
    }

    pub fn ttl(mut self, ttl: u64) -> VultrUpdateDnsRecordBuilder {
        self.config.ttl = Some(ttl);
        self
    }

    pub fn priority(mut self, priority: u64) -> VultrUpdateDnsRecordBuilder {
        self.config.priority = Some(priority);
        self
    }

    #[cfg(feature = "blocking")]
    pub fn run(self) -> Result<(), VultrError> {
        let url = format!(
            "https://api.vultr.com/v2/domains/{domainname}/records/{record_id}",
            domainname = self.domainname,
            record_id = self.record_id
        );
        self.api.patch(&url, self.config)?.error_for_status()?;
        Ok(())
    }

    pub async fn run_async(self) -> Result<(), VultrError> {
        let url = format!(
            "https://api.vultr.com/v2/domains/{domainname}/records/{record_id}",
            domainname = self.domainname,
            record_id = self.record_id
        );
        self.api
            .patch_async(&url, self.config)
            .await?
            .error_for_status()?;
        Ok(())
    }
}