feat: DhcpConfig can now effectively manage a config file to add a static map entry

This commit is contained in:
Jean-Gabriel Gill-Couture
2024-11-18 17:05:48 -05:00
parent cb1fea1eda
commit cc9bcb902c
13 changed files with 1595 additions and 1114 deletions

View File

@@ -1,586 +1,9 @@
mod interfaces {
use xml::reader::XmlEvent;
use yaserde::{
raw_xml::RawXml, YaDeserialize as YaDeserializeTrait,
YaSerialize as YaSerializeTrait,
NamedList, YaDeserialize as YaDeserializeTrait, YaSerialize as YaSerializeTrait,
};
use yaserde_derive::{YaDeserialize, YaSerialize};
use std::collections::HashMap;
use crate::xml_utils::MaybeString;
pub struct Interfaces {
pub testraw: RawXml,
pub interfaces: HashMap<String, Interface>,
}
#[automatically_derived]
impl ::core::default::Default for Interfaces {
#[inline]
fn default() -> Interfaces {
Interfaces {
testraw: ::core::default::Default::default(),
interfaces: ::core::default::Default::default(),
}
}
}
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for Interfaces {}
#[automatically_derived]
impl ::core::cmp::PartialEq for Interfaces {
#[inline]
fn eq(&self, other: &Interfaces) -> bool {
self.testraw == other.testraw && self.interfaces == other.interfaces
}
}
#[automatically_derived]
impl ::core::fmt::Debug for Interfaces {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(
f,
"Interfaces",
"testraw",
&self.testraw,
"interfaces",
&&self.interfaces,
)
}
}
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications)]
const _IMPL_YA_SERIALIZE_FOR_Interfaces: () = {
use ::std::str::FromStr as _;
impl ::yaserde::YaSerialize for Interfaces {
#[allow(unused_variables)]
fn serialize<W: ::std::io::Write>(
&self,
writer: &mut ::yaserde::ser::Serializer<W>,
) -> ::std::result::Result<(), ::std::string::String> {
let skip = writer.skip_start_end();
if !false && !skip {
let mut child_attributes = ::alloc::vec::Vec::new();
let mut child_attributes_namespace = ::yaserde::__xml::namespace::Namespace::empty();
let yaserde_label = writer
.get_start_event_name()
.unwrap_or_else(|| "Interfaces".to_string());
let struct_start_event = ::yaserde::__xml::writer::XmlEvent::start_element(
yaserde_label.as_ref(),
);
let event: ::yaserde::__xml::writer::events::XmlEvent = struct_start_event
.into();
if let ::yaserde::__xml::writer::events::XmlEvent::StartElement {
name,
attributes,
namespace,
} = event {
let mut attributes: ::std::vec::Vec<
::yaserde::__xml::attribute::OwnedAttribute,
> = attributes
.into_owned()
.to_vec()
.iter()
.map(|k| k.to_owned())
.collect();
attributes.extend(child_attributes);
let all_attributes = attributes
.iter()
.map(|ca| ca.borrow())
.collect();
let mut all_namespaces = namespace.into_owned();
all_namespaces.extend(&child_attributes_namespace);
writer
.write(::yaserde::__xml::writer::events::XmlEvent::StartElement {
name,
attributes: ::std::borrow::Cow::Owned(all_attributes),
namespace: ::std::borrow::Cow::Owned(all_namespaces),
})
.map_err(|e| e.to_string())?;
} else {
::core::panicking::panic(
"internal error: entered unreachable code",
)
}
}
if !false {
writer
.set_start_event_name(
::std::option::Option::Some("testraw".to_string()),
);
writer.set_skip_start_end(false);
::yaserde::YaSerialize::serialize(&self.testraw, writer)?;
}
if !false {
writer
.set_start_event_name(
::std::option::Option::Some("interfaces".to_string()),
);
writer.set_skip_start_end(false);
::yaserde::YaSerialize::serialize(&self.interfaces, writer)?;
}
if !false && !skip {
let struct_end_event = ::yaserde::__xml::writer::XmlEvent::end_element();
writer.write(struct_end_event).map_err(|e| e.to_string())?;
}
::std::result::Result::Ok(())
}
fn serialize_attributes(
&self,
mut source_attributes: ::std::vec::Vec<
::yaserde::__xml::attribute::OwnedAttribute,
>,
mut source_namespace: ::yaserde::__xml::namespace::Namespace,
) -> ::std::result::Result<
(
::std::vec::Vec<::yaserde::__xml::attribute::OwnedAttribute>,
::yaserde::__xml::namespace::Namespace,
),
::std::string::String,
> {
let mut child_attributes = ::std::vec::Vec::<
::yaserde::__xml::attribute::OwnedAttribute,
>::new();
let mut child_attributes_namespace = ::yaserde::__xml::namespace::Namespace::empty();
let struct_start_event = ::yaserde::__xml::writer::XmlEvent::start_element(
"temporary_element_to_generate_attributes",
);
let event: ::yaserde::__xml::writer::events::XmlEvent = struct_start_event
.into();
if let ::yaserde::__xml::writer::events::XmlEvent::StartElement {
attributes,
namespace,
..
} = event {
source_namespace.extend(&namespace.into_owned());
source_namespace.extend(&child_attributes_namespace);
let a: ::std::vec::Vec<
::yaserde::__xml::attribute::OwnedAttribute,
> = attributes
.into_owned()
.to_vec()
.iter()
.map(|k| k.to_owned())
.collect();
source_attributes.extend(a);
source_attributes.extend(child_attributes);
::std::result::Result::Ok((source_attributes, source_namespace))
} else {
::core::panicking::panic("internal error: entered unreachable code");
}
}
}
};
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications)]
const _IMPL_YA_DESERIALIZE_FOR_Interfaces: () = {
use ::std::str::FromStr as _;
use ::yaserde::Visitor as _;
impl ::yaserde::YaDeserialize for Interfaces {
#[allow(unused_variables)]
fn deserialize<R: ::std::io::Read>(
reader: &mut ::yaserde::de::Deserializer<R>,
) -> ::std::result::Result<Self, ::std::string::String> {
let (named_element, struct_namespace) = if let ::yaserde::__xml::reader::XmlEvent::StartElement {
name,
..
} = reader.peek()?.to_owned()
{
(name.local_name.to_owned(), name.namespace.clone())
} else {
(
::std::string::String::from("Interfaces"),
::std::option::Option::None,
)
};
let start_depth = reader.depth();
{
let lvl = ::log::Level::Debug;
if lvl <= ::log::STATIC_MAX_LEVEL && lvl <= ::log::max_level() {
::log::__private_api::log(
format_args!(
"Struct {0} @ {1}: start to parse {2:?}",
"Interfaces",
start_depth,
named_element,
),
lvl,
&(
"yaserde_derive",
"opnsense_config_xml::data::interfaces",
::log::__private_api::loc(),
),
(),
);
}
};
if reader.depth() == 0 {
if let Some(namespace) = struct_namespace {
match namespace.as_str() {
bad_namespace => {
let msg = ::alloc::__export::must_use({
let res = ::alloc::fmt::format(
format_args!(
"bad namespace for {0}, found {1}",
named_element,
bad_namespace,
),
);
res
});
return Err(msg);
}
}
}
}
#[allow(unused_mut)]
let mut __testraw_value: Option<RawXml> = None;
#[allow(unused_mut)]
let mut __interfaces_value: Option<HashMap<String, Interface>> = None;
let mut depth = 0;
loop {
let event = reader.peek()?.to_owned();
{
let lvl = ::log::Level::Trace;
if lvl <= ::log::STATIC_MAX_LEVEL && lvl <= ::log::max_level() {
::log::__private_api::log(
format_args!(
"Struct {0} @ {1}: matching {2:?}",
"Interfaces",
start_depth,
event,
),
lvl,
&(
"yaserde_derive",
"opnsense_config_xml::data::interfaces",
::log::__private_api::loc(),
),
(),
);
}
};
match event {
::yaserde::__xml::reader::XmlEvent::StartElement {
ref name,
ref attributes,
..
} => {
let namespace = name.namespace.clone().unwrap_or_default();
if depth == 0 && name.local_name == "Interfaces"
&& namespace.as_str() == ""
{
let event = reader.next_event()?;
} else {
match (namespace.as_str(), name.local_name.as_str()) {
("", "testraw") => {
if depth == 0 {
let _root = reader.next_event();
}
{
let lvl = ::log::Level::Debug;
if lvl <= ::log::STATIC_MAX_LEVEL
&& lvl <= ::log::max_level()
{
::log::__private_api::log(
format_args!("Looking at startElement"),
lvl,
&(
"yaserde_derive",
"opnsense_config_xml::data::interfaces",
::log::__private_api::loc(),
),
(),
);
}
};
{
let lvl = ::log::Level::Warn;
if lvl <= ::log::STATIC_MAX_LEVEL
&& lvl <= ::log::max_level()
{
::log::__private_api::log(
format_args!("matching field type ASPDOJIASDPJIDASPJASDJI"),
lvl,
&(
"opnsense_config_xml::data::interfaces",
"opnsense_config_xml::data::interfaces",
::log::__private_api::loc(),
),
(),
);
}
};
if let Ok(
::yaserde::__xml::reader::XmlEvent::StartElement { .. },
) = reader.peek()
{
{
let lvl = ::log::Level::Warn;
if lvl <= ::log::STATIC_MAX_LEVEL
&& lvl <= ::log::max_level()
{
::log::__private_api::log(
format_args!("Found start element ?? {0}", "RawXml"),
lvl,
&(
"opnsense_config_xml::data::interfaces",
"opnsense_config_xml::data::interfaces",
::log::__private_api::loc(),
),
(),
);
}
};
let value = <RawXml as ::yaserde::YaDeserialize>::deserialize(
reader,
)?;
__testraw_value = ::std::option::Option::Some(value);
let _event = reader.next_event()?;
} else {
{
let lvl = ::log::Level::Warn;
if lvl <= ::log::STATIC_MAX_LEVEL
&& lvl <= ::log::max_level()
{
::log::__private_api::log(
format_args!(
"matching field type did not find substruct start element ? {0}",
"RawXml",
),
lvl,
&(
"opnsense_config_xml::data::interfaces",
"opnsense_config_xml::data::interfaces",
::log::__private_api::loc(),
),
(),
);
}
};
}
}
("", "interfaces") => {
if depth == 0 {
let _root = reader.next_event();
}
{
let lvl = ::log::Level::Debug;
if lvl <= ::log::STATIC_MAX_LEVEL
&& lvl <= ::log::max_level()
{
::log::__private_api::log(
format_args!("Looking at startElement"),
lvl,
&(
"yaserde_derive",
"opnsense_config_xml::data::interfaces",
::log::__private_api::loc(),
),
(),
);
}
};
{
let lvl = ::log::Level::Warn;
if lvl <= ::log::STATIC_MAX_LEVEL
&& lvl <= ::log::max_level()
{
::log::__private_api::log(
format_args!("matching field type ASPDOJIASDPJIDASPJASDJI"),
lvl,
&(
"opnsense_config_xml::data::interfaces",
"opnsense_config_xml::data::interfaces",
::log::__private_api::loc(),
),
(),
);
}
};
if let Ok(
::yaserde::__xml::reader::XmlEvent::StartElement { .. },
) = reader.peek()
{
{
let lvl = ::log::Level::Warn;
if lvl <= ::log::STATIC_MAX_LEVEL
&& lvl <= ::log::max_level()
{
::log::__private_api::log(
format_args!(
"Found start element ?? {0}",
"HashMap < String, Interface >",
),
lvl,
&(
"opnsense_config_xml::data::interfaces",
"opnsense_config_xml::data::interfaces",
::log::__private_api::loc(),
),
(),
);
}
};
let value = <HashMap<
String,
Interface,
> as ::yaserde::YaDeserialize>::deserialize(reader)?;
__interfaces_value = ::std::option::Option::Some(value);
let _event = reader.next_event()?;
} else {
{
let lvl = ::log::Level::Warn;
if lvl <= ::log::STATIC_MAX_LEVEL
&& lvl <= ::log::max_level()
{
::log::__private_api::log(
format_args!(
"matching field type did not find substruct start element ? {0}",
"HashMap < String, Interface >",
),
lvl,
&(
"opnsense_config_xml::data::interfaces",
"opnsense_config_xml::data::interfaces",
::log::__private_api::loc(),
),
(),
);
}
};
}
}
_ => {
{
let lvl = ::log::Level::Trace;
if lvl <= ::log::STATIC_MAX_LEVEL
&& lvl <= ::log::max_level()
{
::log::__private_api::log(
format_args!("Got StartElement {0:?}", name.local_name),
lvl,
&(
"yaserde_derive",
"opnsense_config_xml::data::interfaces",
::log::__private_api::loc(),
),
(),
);
}
};
let event = reader.next_event()?;
{
let lvl = ::log::Level::Trace;
if lvl <= ::log::STATIC_MAX_LEVEL
&& lvl <= ::log::max_level()
{
::log::__private_api::log(
format_args!("Next event {0:?}", event),
lvl,
&(
"yaserde_derive",
"opnsense_config_xml::data::interfaces",
::log::__private_api::loc(),
),
(),
);
}
};
if depth > 0 {
return Err(
::alloc::__export::must_use({
let res = ::alloc::fmt::format(
format_args!(
"Found unauthorized element {0}",
name.local_name,
),
);
res
}),
);
reader.skip_element(|event| {})?;
}
}
}
}
if depth == 0 {}
depth += 1;
}
::yaserde::__xml::reader::XmlEvent::EndElement { ref name } => {
{
let lvl = ::log::Level::Warn;
if lvl <= ::log::STATIC_MAX_LEVEL
&& lvl <= ::log::max_level()
{
::log::__private_api::log(
format_args!("endElement {0}", named_element),
lvl,
&(
"opnsense_config_xml::data::interfaces",
"opnsense_config_xml::data::interfaces",
::log::__private_api::loc(),
),
(),
);
}
};
if name.local_name == named_element
&& reader.depth() == start_depth + 1
{
break;
}
let event = reader.next_event()?;
depth -= 1;
}
::yaserde::__xml::reader::XmlEvent::EndDocument => {
if false {
break;
}
}
::yaserde::__xml::reader::XmlEvent::Characters(
ref text_content,
) => {
let event = reader.next_event()?;
}
event => {
return ::std::result::Result::Err(
::alloc::__export::must_use({
let res = ::alloc::fmt::format(
format_args!("unknown event {0:?}", event),
);
res
}),
);
}
}
}
{
let lvl = ::log::Level::Debug;
if lvl <= ::log::STATIC_MAX_LEVEL && lvl <= ::log::max_level() {
::log::__private_api::log(
format_args!(
"Struct {0} @ {1}: success",
"Interfaces",
start_depth,
),
lvl,
&(
"yaserde_derive",
"opnsense_config_xml::data::interfaces",
::log::__private_api::loc(),
),
(),
);
}
};
::std::result::Result::Ok(Interfaces {
testraw: __testraw_value
.ok_or_else(|| {
"testraw is a required field of Interfaces".to_string()
})?,
interfaces: __interfaces_value
.ok_or_else(|| {
"interfaces is a required field of Interfaces".to_string()
})?,
})
}
}
};
use yaserde::MaybeString;
pub struct Interface {
#[yaserde(rename = "if")]
pub physical_interface_name: String,