unifly-api 0.9.0

Async Rust client, reactive data layer, and domain model for UniFi controller APIs
Documentation
use crate::model::EntityId;

pub(in super::super) fn build_acl_filter_value(
    zone_id: &EntityId,
    port: Option<&str>,
    protocol: Option<&str>,
) -> serde_json::Value {
    let mut filter = serde_json::Map::new();
    filter.insert(
        "zoneId".into(),
        serde_json::Value::String(zone_id.to_string()),
    );
    if let Some(port) = port {
        filter.insert("port".into(), serde_json::Value::String(port.to_owned()));
    }
    if let Some(protocol) = protocol {
        filter.insert(
            "protocol".into(),
            serde_json::Value::String(protocol.to_owned()),
        );
    }
    serde_json::Value::Object(filter)
}

pub(in super::super) fn merge_acl_filter_value(
    existing: Option<serde_json::Value>,
    zone_id: Option<&EntityId>,
    port: Option<&str>,
    protocol: Option<&str>,
) -> Option<serde_json::Value> {
    let mut filter = match existing {
        Some(serde_json::Value::Object(filter)) => filter,
        Some(_) | None => serde_json::Map::new(),
    };

    if let Some(zone_id) = zone_id {
        filter.insert(
            "zoneId".into(),
            serde_json::Value::String(zone_id.to_string()),
        );
    }
    if let Some(port) = port {
        filter.insert("port".into(), serde_json::Value::String(port.to_owned()));
    }
    if let Some(protocol) = protocol {
        filter.insert(
            "protocol".into(),
            serde_json::Value::String(protocol.to_owned()),
        );
    }

    (!filter.is_empty()).then_some(serde_json::Value::Object(filter))
}