wip: Interfaces using NamedList helper type to handle dynamic interface names, some refactoring on top
This commit is contained in:
parent
65c395aeae
commit
cb1fea1eda
2711
harmony-rs/opnsense-config-xml/interfaces_expand.rs
Normal file
2711
harmony-rs/opnsense-config-xml/interfaces_expand.rs
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,6 @@
|
||||
use yaserde_derive::{YaDeserialize, YaSerialize};
|
||||
|
||||
use crate::xml_utils::MaybeString;
|
||||
use yaserde::MaybeString;
|
||||
|
||||
use super::opnsense::{NumberOption, Range, StaticMap};
|
||||
|
||||
|
||||
@ -1,14 +1,11 @@
|
||||
use xml::reader::XmlEvent;
|
||||
use yaserde::{YaDeserialize as YaDeserializeTrait, YaSerialize as YaSerializeTrait};
|
||||
use yaserde::{NamedList, YaDeserialize as YaDeserializeTrait, YaSerialize as YaSerializeTrait};
|
||||
use yaserde_derive::{YaDeserialize, YaSerialize};
|
||||
|
||||
use std::collections::HashMap;
|
||||
|
||||
use crate::xml_utils::MaybeString;
|
||||
use yaserde::MaybeString;
|
||||
|
||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||
pub struct Interfaces {
|
||||
pub interfaces: HashMap<String, Interface>,
|
||||
pub interfaces: NamedList<Interface>,
|
||||
}
|
||||
|
||||
#[derive(Default, PartialEq, Debug, YaDeserialize, YaSerialize)]
|
||||
@ -40,33 +37,32 @@ pub struct Interface {
|
||||
pub track6_prefix_id: Option<MaybeString>,
|
||||
}
|
||||
|
||||
pub trait MyDeserialize : YaDeserializeTrait {}
|
||||
pub trait MySerialize : YaSerializeTrait {}
|
||||
|
||||
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 interfaces = yaserde::de::from_str::<Interfaces>(FULL_INTERFACES_XML).unwrap();
|
||||
assert_eq!(interfaces.interfaces.len(), 6)
|
||||
let test_struct =
|
||||
yaserde::de::from_str::<TestStruct>("<xml><foo>aodisj</foo><bar>barbaba</bar></xml>")
|
||||
.unwrap();
|
||||
println!("test_struct : {:?}", test_struct);
|
||||
|
||||
let interfaces = yaserde::de::from_str::<Interfaces>(FULL_INTERFACES_XML).unwrap();
|
||||
assert_eq!(interfaces.interfaces.elements.len(), 6)
|
||||
}
|
||||
|
||||
const FULL_INTERFACES_XML: &str = "<interfaces>
|
||||
<wan>
|
||||
<if>pppoe0</if>
|
||||
<descr>WAN</descr>
|
||||
<enable>1</enable>
|
||||
<lock>1</lock>
|
||||
<spoofmac/>
|
||||
<blockpriv>1</blockpriv>
|
||||
<blockbogons>1</blockbogons>
|
||||
<ipaddr>pppoe</ipaddr>
|
||||
</wan>
|
||||
<lan>
|
||||
<if>em1</if>
|
||||
<descr>LAN</descr>
|
||||
@ -78,6 +74,16 @@ mod test {
|
||||
<track6-interface/>
|
||||
<track6-prefix-id>0</track6-prefix-id>
|
||||
</lan>
|
||||
<wan>
|
||||
<if>pppoe0</if>
|
||||
<descr>WAN</descr>
|
||||
<enable>1</enable>
|
||||
<lock>1</lock>
|
||||
<spoofmac/>
|
||||
<blockpriv>1</blockpriv>
|
||||
<blockbogons>1</blockbogons>
|
||||
<ipaddr>pppoe</ipaddr>
|
||||
</wan>
|
||||
<lo0>
|
||||
<internal_dynamic>1</internal_dynamic>
|
||||
<descr>Loopback</descr>
|
||||
@ -119,111 +125,3 @@ mod test {
|
||||
</openvpn>
|
||||
</interfaces>";
|
||||
}
|
||||
|
||||
|
||||
// impl YaSerializeTrait for Interfaces {
|
||||
// fn serialize<W: std::io::Write>(
|
||||
// &self,
|
||||
// writer: &mut yaserde::ser::Serializer<W>,
|
||||
// ) -> Result<(), String> {
|
||||
// writer.write("Interfaces serializer TODO").map_err(|e| e.to_string())
|
||||
// }
|
||||
//
|
||||
// fn serialize_attributes(
|
||||
// &self,
|
||||
// attributes: Vec<xml::attribute::OwnedAttribute>,
|
||||
// namespace: xml::namespace::Namespace,
|
||||
// ) -> Result<
|
||||
// (
|
||||
// Vec<xml::attribute::OwnedAttribute>,
|
||||
// xml::namespace::Namespace,
|
||||
// ),
|
||||
// String,
|
||||
// > {
|
||||
// todo!()
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// impl YaDeserializeTrait for Interfaces {
|
||||
// fn deserialize<R: std::io::Read>(
|
||||
// reader: &mut yaserde::de::Deserializer<R>,
|
||||
// ) -> Result<Self, String> {
|
||||
// let mut interfaces = Interfaces::default();
|
||||
// let mut current_interface_name = String::new();
|
||||
// let mut current_interface = Interface::default();
|
||||
//
|
||||
// let mut event = reader.next_event()?;
|
||||
// loop {
|
||||
// match event {
|
||||
// xml::reader::XmlEvent::EndElement { name } => {
|
||||
// println!(
|
||||
// "Handling EndElement {}, current_interface_name: {}",
|
||||
// name.local_name, current_interface_name
|
||||
// );
|
||||
// println!("Peeking after EndElement {:?}", reader.peek()?);
|
||||
// if name.local_name == "interfaces" {
|
||||
// break;
|
||||
// }
|
||||
// todo!("Should not hit here");
|
||||
// }
|
||||
// xml::reader::XmlEvent::StartElement { ref name, .. } => {
|
||||
// println!("Got start Element {:?}", name);
|
||||
// current_interface_name = name.local_name.clone();
|
||||
// println!("About to deserialize interface from name {:?}", name);
|
||||
// // TODO store names
|
||||
// 'inner_iface: loop {
|
||||
// let peek = reader.peek()?;
|
||||
// println!("Peeking before forcing next event {:?}", peek);
|
||||
//
|
||||
// if let XmlEvent::EndElement { name } = peek {
|
||||
// // TODO save the interface name and struct in the hashmap
|
||||
// println!("Forcing next_event");
|
||||
// reader.next_event()?;
|
||||
//
|
||||
// let peek = reader.peek()?;
|
||||
// println!("Peeking after next event deserializing {:?}", peek);
|
||||
// if let XmlEvent::EndElement { name } = peek {
|
||||
// println!("Got two EndElement in a row, breaking out of loop");
|
||||
// break 'inner_iface;
|
||||
// }
|
||||
// }
|
||||
// println!("Peeking before deserializing {:?}", reader.peek()?);
|
||||
// let interface = <Interface as yaserde::YaDeserialize>::deserialize(reader)?;
|
||||
// println!("Interface deserialized {:?}", interface);
|
||||
// println!("Peeking after deserializing {:?}", reader.peek()?);
|
||||
// }
|
||||
// println!(
|
||||
// "Done with inner interface, loop completed {:?}",
|
||||
// reader.peek()?
|
||||
// );
|
||||
// }
|
||||
// xml::reader::XmlEvent::EndDocument => break,
|
||||
// _ => {
|
||||
// return Err(
|
||||
// "This Interfaces Deserializer does not support all XmlEvent types".into(),
|
||||
// )
|
||||
// }
|
||||
// }
|
||||
// let peek = reader.peek()?;
|
||||
//
|
||||
// let read_next = true;
|
||||
// if let XmlEvent::EndElement { name } = peek {
|
||||
// if name.local_name == "interfaces" {
|
||||
// println!("Got endElement interfaces, not reading next event");
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// if read_next {
|
||||
// event = reader.next_event()?;
|
||||
// }
|
||||
// println!("Outer loop got event {:?}", event);
|
||||
// println!("Outer loop got peek {:?}", reader.peek()?);
|
||||
// }
|
||||
// println!("Done with interfaces {:?}", interfaces);
|
||||
// println!("reader peeking shows {:?}", reader.peek());
|
||||
//
|
||||
// Ok(interfaces)
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
use crate::data::dhcpd::Dhcpd;
|
||||
use crate::xml_utils::{MaybeString, RawXml};
|
||||
use yaserde::{MaybeString, RawXml};
|
||||
use log::error;
|
||||
use yaserde_derive::{YaDeserialize, YaSerialize};
|
||||
|
||||
|
||||
@ -79,6 +79,8 @@ impl YaDeserializeTrait for RawXml {
|
||||
}
|
||||
|
||||
println!("buffered events {buffer}");
|
||||
let next = reader.peek()?;
|
||||
println!("next : {:?}", &next);
|
||||
|
||||
Ok(RawXml(buffer))
|
||||
}
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
mod generic_xml;
|
||||
mod maybe_string;
|
||||
//mod generic_xml;
|
||||
//mod maybe_string;
|
||||
mod yaserde;
|
||||
pub use generic_xml::*;
|
||||
pub use maybe_string::*;
|
||||
//pub use generic_xml::*;
|
||||
//pub use maybe_string::*;
|
||||
pub use yaserde::*;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user