use yaserde_derive::{YaDeserialize, YaSerialize}; use yaserde::MaybeString; #[derive(Default, PartialEq, Debug, YaDeserialize, YaSerialize)] pub struct Interface { pub internal_dynamic: Option, #[yaserde(rename = "if")] pub physical_interface_name: String, pub descr: Option, pub mtu: Option, pub enable: MaybeString, pub lock: Option, #[yaserde(rename = "spoofmac")] pub spoof_mac: Option, pub mss: Option, pub ipaddr: Option, pub dhcphostname: Option, #[yaserde(rename = "alias-address")] pub alias_address: Option, #[yaserde(rename = "alias-subnet")] pub alias_subnet: Option, #[yaserde(rename = "blockpriv")] pub block_priv: Option, #[yaserde(rename = "blockbogons")] pub block_bogons: Option, #[yaserde(rename = "type")] pub r#type: Option, #[yaserde(rename = "virtual")] pub r#virtual: Option, pub subnet: Option, pub ipaddrv6: Option, #[yaserde(rename = "dhcp6-ia-pd-len")] pub dhcp6_ia_pd_len: Option, pub networks: Option, pub subnetv6: Option, pub gateway: Option, pub gatewayv6: Option, pub media: Option, pub mediaopt: Option, #[yaserde(rename = "track6-interface")] pub track6_interface: Option, #[yaserde(rename = "track6-prefix-id")] pub track6_prefix_id: Option, #[yaserde(rename = "dhcprejectfrom")] pub dhcprejectfrom: Option, pub adv_dhcp6_interface_statement_send_options: Option, pub adv_dhcp6_interface_statement_request_options: Option, pub adv_dhcp6_interface_statement_information_only_enable: Option, pub adv_dhcp6_interface_statement_script: Option, pub adv_dhcp6_id_assoc_statement_address_enable: Option, pub adv_dhcp6_id_assoc_statement_address: Option, pub adv_dhcp6_id_assoc_statement_address_id: Option, pub adv_dhcp6_id_assoc_statement_address_pltime: Option, pub adv_dhcp6_id_assoc_statement_address_vltime: Option, pub adv_dhcp6_id_assoc_statement_prefix_enable: Option, pub adv_dhcp6_id_assoc_statement_prefix: Option, pub adv_dhcp6_id_assoc_statement_prefix_id: Option, pub adv_dhcp6_id_assoc_statement_prefix_pltime: Option, pub adv_dhcp6_id_assoc_statement_prefix_vltime: Option, pub adv_dhcp6_prefix_interface_statement_sla_len: Option, pub adv_dhcp6_authentication_statement_authname: Option, pub adv_dhcp6_authentication_statement_protocol: Option, pub adv_dhcp6_authentication_statement_algorithm: Option, pub adv_dhcp6_authentication_statement_rdm: Option, pub adv_dhcp6_key_info_statement_keyname: Option, pub adv_dhcp6_key_info_statement_realm: Option, pub adv_dhcp6_key_info_statement_keyid: Option, pub adv_dhcp6_key_info_statement_secret: Option, pub adv_dhcp6_key_info_statement_expire: Option, pub adv_dhcp6_config_advanced: Option, pub adv_dhcp6_config_file_override: Option, pub adv_dhcp6_config_file_override_path: Option, pub adv_dhcp_pt_timeout: Option, pub adv_dhcp_pt_retry: Option, pub adv_dhcp_pt_select_timeout: Option, pub adv_dhcp_pt_reboot: Option, pub adv_dhcp_pt_backoff_cutoff: Option, pub adv_dhcp_pt_initial_interval: Option, pub adv_dhcp_pt_values: Option, pub adv_dhcp_send_options: Option, pub adv_dhcp_request_options: Option, pub adv_dhcp_required_options: Option, pub adv_dhcp_option_modifiers: Option, pub adv_dhcp_config_advanced: Option, pub adv_dhcp_config_file_override: Option, pub adv_dhcp_config_file_override_path: Option, } #[cfg(test)] mod test { use crate::xml_utils::to_xml_str; use super::*; use pretty_assertions::assert_eq; use yaserde::NamedList; #[derive(Default, PartialEq, Debug, YaDeserialize, YaSerialize)] pub struct InterfacesParent { foo: String, interfaces: NamedList, bar: String, } #[test] fn should_deserialize_interfaces() { let interfaces = yaserde::de::from_str::>(FULL_INTERFACES_XML).unwrap(); assert_eq!(interfaces.elements.len(), 6) } #[test] fn should_serialize_interfaces() { let named_list = NamedList { elements: vec![ (String::from("paul"), Interface::default()), (String::from("anotherpaul"), Interface::default()), (String::from("thirdone"), Interface::default()), (String::from("andgofor4"), Interface::default()), ], }; let parent = InterfacesParent { foo: String::from("foo"), interfaces: named_list, bar: String::from("foo"), }; assert_eq!( &to_xml_str(&parent).unwrap(), r#" foo foo "# ) } const FULL_INTERFACES_XML: &str = " em1 LAN 1 192.168.20.1 24 track6 0 pppoe0 WAN 1 1 1 1 pppoe 1 Loopback 1 lo0 127.0.0.1 ::1 8 128 none 1 em5 backup_sync 1 1 10.10.5.1 24 1 WireGuard (Group) wireguard 1 1 group 1 1 openvpn OpenVPN group 1 "; }