vultr 0.4.2

A pure Rust Vultr API binding.
Documentation
use std::fmt::Display;

use serde::Deserialize;
use uuid::Uuid;

use crate::data::meta::VultrMeta;

#[derive(Deserialize, Debug)]
pub struct VultrFirewallGroupRoot {
    pub firewall_group: VultrFirewallGroup,
}

#[derive(Deserialize, Debug)]
pub struct VultrFirewallGroupsRoot {
    pub firewall_groups: Vec<VultrFirewallGroup>,
    pub meta: VultrMeta,
}

#[derive(Deserialize, Debug)]
pub struct VultrFirewallGroup {
    id: Uuid,
    description: String,
    date_created: String,
    date_modified: String,
    instance_count: Option<u32>,
    rule_count: Option<u32>,
    max_rule_count: Option<u32>,
}

impl VultrFirewallGroup {
    pub fn id(&self) -> Uuid {
        self.id
    }

    pub fn description(&self) -> &String {
        &self.description
    }

    pub fn date_created(&self) -> &String {
        &self.date_created
    }

    pub fn date_modified(&self) -> &String {
        &self.date_modified
    }
}

#[derive(Deserialize, Debug)]
pub struct VultrFirewallGroupRulesRoot {
    pub firewall_rules: Vec<VultrFirewallGroupRule>,
    pub meta: VultrMeta,
}

#[derive(Deserialize, Debug)]
pub struct VultrFirewallGroupRuleRoot {
    pub firewall_rule: VultrFirewallGroupRule,
}

#[derive(Deserialize, Debug)]
pub struct VultrFirewallGroupRule {
    id: u32,
    ip_type: VultrFirewallGroupRuleIpType,
    action: String,
    protocol: VultrFirewallGroupRuleProtocol,
    port: String,
    subnet: String,
    subnet_size: u32,
    source: String,
    notes: String,
}

impl VultrFirewallGroupRule {
    pub fn id(&self) -> u32 {
        self.id
    }

    pub fn ip_type(&self) -> &VultrFirewallGroupRuleIpType {
        &self.ip_type
    }

    pub fn protocol(&self) -> &VultrFirewallGroupRuleProtocol {
        &self.protocol
    }

    pub fn port(&self) -> &String {
        &self.port
    }

    pub fn subnet(&self) -> &String {
        &self.subnet
    }

    pub fn subnet_size(&self) -> u32 {
        self.subnet_size
    }

    pub fn source(&self) -> &String {
        &self.source
    }

    pub fn notes(&self) -> &String {
        &self.notes
    }
}

#[derive(Deserialize, Debug)]
pub enum VultrFirewallGroupRuleIpType {
    #[serde(rename = "v4")]
    V4,
    #[serde(rename = "v6")]
    V6,
}

impl Display for VultrFirewallGroupRuleIpType {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            VultrFirewallGroupRuleIpType::V4 => write!(f, "v4"),
            VultrFirewallGroupRuleIpType::V6 => write!(f, "v6"),
        }
    }
}

#[derive(Deserialize, Debug)]
pub enum VultrFirewallGroupRuleProtocol {
    #[serde(rename = "icmp")]
    ICMP,
    #[serde(rename = "tcp")]
    TCP,
    #[serde(rename = "udp")]
    UDP,
    #[serde(rename = "gre")]
    GRE,
    #[serde(rename = "esp")]
    ESP,
    #[serde(rename = "eh")]
    EH,
}

impl Display for VultrFirewallGroupRuleProtocol {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            VultrFirewallGroupRuleProtocol::ICMP => write!(f, "icmp"),
            VultrFirewallGroupRuleProtocol::TCP => write!(f, "tcp"),
            VultrFirewallGroupRuleProtocol::UDP => write!(f, "udp"),
            VultrFirewallGroupRuleProtocol::GRE => write!(f, "gre"),
            VultrFirewallGroupRuleProtocol::ESP => write!(f, "esp"),
            VultrFirewallGroupRuleProtocol::EH => write!(f, "eh"),
        }
    }
}