From 29550a9658d415da9102c5a3ef8dbddf1ad587ad Mon Sep 17 00:00:00 2001 From: Lucy Date: Wed, 12 Jan 2022 15:30:53 -0500 Subject: [PATCH] Add connectio nsettings types+builders --- Cargo.lock | 85 ++++++++++++++++++++++ networkmanager/Cargo.toml | 1 + networkmanager/src/settings/connection.rs | 86 +++++++++++++++++++++++ 3 files changed, 172 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index a3e6939..725402c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -153,9 +153,45 @@ name = "cosmic-dbus-networkmanager" version = "0.1.0" dependencies = [ "bitflags", + "derive_builder", "zbus", ] +[[package]] +name = "darling" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f2c43f534ea4b0b049015d00269734195e6d3f0f6635cb692251aca6f9f8b3c" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e91455b86830a1c21799d94524df0845183fa55bafd9aa137b01c7d1065fa36" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29b5acf0dea37a7f66f7b25d2c5e93fd46f8f6968b1a5d7a3e02e97768afc95a" +dependencies = [ + "darling_core", + "quote", + "syn", +] + [[package]] name = "derivative" version = "2.2.0" @@ -167,6 +203,37 @@ dependencies = [ "syn", ] +[[package]] +name = "derive_builder" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d13202debe11181040ae9063d739fa32cfcaaebe2275fe387703460ae2365b30" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66e616858f6187ed828df7c64a6d71720d83767a7f19740b2d1b6fe6327b36e5" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "derive_builder_macro" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58a94ace95092c5acb1e97a7e846b310cfbd499652f72297da7493f618a98d73" +dependencies = [ + "derive_builder_core", + "syn", +] + [[package]] name = "easy-parallel" version = "3.2.0" @@ -209,6 +276,12 @@ dependencies = [ "instant", ] +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + [[package]] name = "futures-core" version = "0.3.19" @@ -279,6 +352,12 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "instant" version = "0.1.12" @@ -528,6 +607,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "syn" version = "1.0.85" diff --git a/networkmanager/Cargo.toml b/networkmanager/Cargo.toml index 88be212..fbcd51c 100644 --- a/networkmanager/Cargo.toml +++ b/networkmanager/Cargo.toml @@ -6,6 +6,7 @@ license = "MPL-2.0" [dependencies] bitflags = "1.3.2" +derive_builder = "0.10.2" zbus = "2.0.0" [features] diff --git a/networkmanager/src/settings/connection.rs b/networkmanager/src/settings/connection.rs index 99e9f1b..1a3f53d 100644 --- a/networkmanager/src/settings/connection.rs +++ b/networkmanager/src/settings/connection.rs @@ -1,6 +1,7 @@ // SPDX-License-Identifier: MPL-2.0 use crate::interface::settings::connection::ConnectionSettingsProxy; +use derive_builder::Builder; use std::ops::Deref; pub struct Connection<'a>(ConnectionSettingsProxy<'a>); @@ -18,3 +19,88 @@ impl<'a> From> for Connection<'a> { Connection(conn) } } + +macro_rules! derive_value_build { + ($name:ident, $(($arg:ident: $arg_ty:ty)),*) => { + #[derive(Builder)] + pub struct $name { + $( + #[builder(setter(into, strip_option))] + $arg: Option<$arg_ty>, + )* + } + impl $name { + pub fn build<'a>(&'a self) -> std::collections::HashMap> { + let mut out = std::collections::HashMap::new(); + $( + if let Some(val) = &self.$arg { + out.insert(stringify!($arg).trim_end_matches("_").replace("_", "-"), zbus::zvariant::Value::from(val)); + } + )* + out + } + } + }; +} + +derive_value_build!( + ConnectionSettings, + (auth_retries: i32), + (autoconnect: bool), + (autoconnect_priority: i32), + (autoconnect_retries: i32), + (gateway_ping_timeout: u32), + (id: String), + (interface_name: String), + (lldp: i32), + (llmnr: i32), + (master: String), + (mdns: i32), + (mud_url: String), + (multi_connect: String), + (permissions: Vec), + (read_only: bool), + (secondaries: Vec), + (stable_id: String), + (type_: String), + (uuid: String), + (wait_device_timeout: i32), + (zone: String) +); + +derive_value_build!( + EthernetSettings, + (assigned_mac_address: String), + (auto_negotiate: bool), + (duplex: String), + (generate_mac_address_mask: String), + (mtu: u32), + (port: String), + (speed: u32), + (wake_on_lan: u32), + (wake_on_lan_password: String) +); + +derive_value_build!( + WifiSettings, + (assigned_mac_address: String), + (band: String), + (bssid: Vec), + (channel: u32), + (cloned_mac_address: Vec), + (generate_mac_address_mask: String), + (hidden: bool), + (mac_address: Vec), + (mac_address_blacklist: Vec), + (mac_address_randomization: u32), + (mode: String), + (mtu: u32), + (powersave: u32), + (rate: u32), + (seen_bssids: Vec), + (ssid: Vec), + (tx_power: u32), + (wake_on_wlan: u32) +); + +derive_value_build!(BluetoothSettings, (bdaddr: Vec), (type_: String));