unifly-api 0.8.0

Async Rust client, reactive data layer, and domain model for UniFi controller APIs
Documentation
use crate::command::{Command, CommandResult};
use crate::core_error::CoreError;

use super::super::{
    CommandContext, build_create_dns_policy_fields, build_update_dns_policy_fields,
    dns_policy_type_name, require_integration, require_uuid,
};

pub(super) async fn route(ctx: &CommandContext, cmd: Command) -> Result<CommandResult, CoreError> {
    let integration = ctx.integration.as_ref();
    let site_id = ctx.site_id;

    match cmd {
        Command::CreateDnsPolicy(req) => {
            let (ic, sid) = require_integration(integration, site_id, "CreateDnsPolicy")?;
            let policy_type_str = dns_policy_type_name(req.policy_type);
            let fields = build_create_dns_policy_fields(&req)?;
            let body = crate::integration_types::DnsPolicyCreateUpdate {
                policy_type: policy_type_str.to_owned(),
                enabled: req.enabled,
                fields,
            };
            ic.create_dns_policy(&sid, &body).await?;
            Ok(CommandResult::Ok)
        }
        Command::UpdateDnsPolicy { id, update } => {
            let (ic, sid) = require_integration(integration, site_id, "UpdateDnsPolicy")?;
            let uuid = require_uuid(&id)?;
            let existing = ic.get_dns_policy(&sid, &uuid).await?;
            let fields = build_update_dns_policy_fields(&existing, &update)?;

            let body = crate::integration_types::DnsPolicyCreateUpdate {
                policy_type: existing.policy_type,
                enabled: update.enabled.unwrap_or(existing.enabled),
                fields,
            };
            ic.update_dns_policy(&sid, &uuid, &body).await?;
            Ok(CommandResult::Ok)
        }
        Command::DeleteDnsPolicy { id } => {
            let (ic, sid) = require_integration(integration, site_id, "DeleteDnsPolicy")?;
            let uuid = require_uuid(&id)?;
            ic.delete_dns_policy(&sid, &uuid).await?;
            Ok(CommandResult::Ok)
        }
        _ => unreachable!("dns::route received non-dns command"),
    }
}