dg_network_manager 1.0.0

Network Manager DBUS API
Documentation
use zbus::zvariant::Value;

pub fn frequency_to_channel(freq: u32) -> Option<u32> {
    // Special case for channel 14 in the 2.4 GHz band.
    if freq == 2484 {
        return Some(14);
    }
    // 2.4 GHz band: channels 1-13.
    // Channel 1 is at 2412 MHz, and each subsequent channel increases by 5 MHz.
    if (2412..2484).contains(&freq) {
        return Some((freq - 2407) / 5);
    }
    // 5 GHz band: many channels are calculated using this formula.
    if (5000..6000).contains(&freq) {
        return Some((freq - 5000) / 5);
    }
    // Frequency did not match any known Wi-Fi band
    None
}

pub fn parse_dbus_variant(var: Value) -> String {
    match var {
        Value::U8(value) => value.to_string(),
        Value::Bool(value) => value.to_string(),
        Value::I16(value) => value.to_string(),
        Value::U16(value) => value.to_string(),
        Value::I32(value) => value.to_string(),
        Value::U32(value) => value.to_string(),
        Value::I64(value) => value.to_string(),
        Value::U64(value) => value.to_string(),
        Value::F64(value) => value.to_string(),
        Value::Str(value) => value.to_string(),
        Value::Signature(value) => value.to_string(),
        Value::ObjectPath(value) => value.to_string(),
        Value::Value(value) => value.to_string(),
        Value::Array(value) => {
            //Special case to check for values we can convert to string, within reasonable size
            let items: Vec<Value> = value.to_vec();
            let mut buffer = String::from("[");
            let mut do_pop = false;
            for item in items.into_iter() {
                do_pop = true;
                buffer.push(' ');
                buffer.push_str(&parse_dbus_variant(item));
                buffer.push(',');
            }
            if do_pop {
                buffer.pop();
            }
            buffer.push_str(" ]");
            buffer
        }
        Value::Dict(value) => {
            let mut buffer = String::from("{ ");
            let mut do_pop = false;
            for (key, value) in value {
                do_pop = true;
                let key = parse_dbus_variant(key);
                let value = parse_dbus_variant(value);
                buffer.push(' ');
                buffer.push_str(&key);
                buffer.push_str(": ");
                buffer.push_str(&value);
                buffer.push(',');
            }
            if do_pop {
                buffer.pop();
            }
            buffer.push('}');
            buffer
        }
        Value::Structure(structure) => structure.to_string(),
        Value::Fd(_) => "Unsupported".to_owned(),
    }
}