use yaserde::{NamedList, YaDeserialize as YaDeserializeTrait, YaSerialize as YaSerializeTrait}; use yaserde_derive::{YaDeserialize, YaSerialize}; use yaserde::MaybeString; #[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)] pub struct Interfaces { pub interfaces: NamedList, } #[derive(Default, PartialEq, Debug, YaDeserialize, YaSerialize)] pub struct Interface { #[yaserde(rename = "if")] pub physical_interface_name: String, pub descr: String, pub enable: MaybeString, #[yaserde(rename = "spoofmac")] pub spoof_mac: Option, pub internal_dynamic: Option, pub ipaddr: Option, #[yaserde(rename = "blockpriv")] pub block_priv: Option, #[yaserde(rename = "blockbogons")] pub block_bogons: Option, pub lock: Option, #[yaserde(rename = "type")] pub r#type: Option, #[yaserde(rename = "virtual")] pub r#virtual: Option, pub subnet: Option, pub networks: Option, pub subnetv6: Option, pub ipaddrv6: Option, #[yaserde(rename = "track6-interface")] pub track6_interface: Option, #[yaserde(rename = "track6-prefix-id")] pub track6_prefix_id: Option, } pub trait MyDeserialize: YaDeserializeTrait {} pub trait MySerialize: YaSerializeTrait {} #[cfg(test)] mod test { use super::*; use pretty_assertions::assert_eq; #[derive(Default, PartialEq, Debug, YaDeserialize, YaSerialize)] pub struct TestStruct { foo: String, bar: String, } #[test] fn should_deserialize_interfaces() { let test_struct = yaserde::de::from_str::("aodisjbarbaba") .unwrap(); println!("test_struct : {:?}", test_struct); let interfaces = yaserde::de::from_str::(FULL_INTERFACES_XML).unwrap(); assert_eq!(interfaces.interfaces.elements.len(), 6) } 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 "; }