xso: Add PrintRawXml helper struct with Display
Some checks failed
Build / lint (push) Has been cancelled
Build / test-stable (push) Has been cancelled
Build / test-nightly (push) Has been cancelled

Add a helper struct to be able to display Raw Xml, useful for debug
logs.

Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
This commit is contained in:
Maxime “pep” Buquet 2024-11-12 10:55:36 +01:00
parent dc842c44d1
commit 9c2b3482e5
4 changed files with 38 additions and 1 deletions

View file

@ -6,6 +6,7 @@
use rand::{thread_rng, Rng};
use xmpp_parsers::{iq::Iq, jid::Jid, message::Message, presence::Presence};
use xso::AsXml;
use crate::xmlstream::XmppStreamElement;
use crate::Error;
@ -16,15 +17,19 @@ fn make_id() -> String {
}
/// A stanza sent/received over the stream.
#[derive(Debug)]
#[derive(AsXml, Debug)]
#[xml()]
pub enum Stanza {
/// IQ stanza
#[xml(transparent)]
Iq(Iq),
/// Message stanza
#[xml(transparent)]
Message(Message),
/// Presence stanza
#[xml(transparent)]
Presence(Presence),
}

View file

@ -70,3 +70,6 @@ pub use crate::error::Error;
pub use minidom;
pub use xmpp_parsers as parsers;
pub use xmpp_parsers::jid;
// Re-export for debug purposes
pub use xso::asxml::PrintRawXml;

View file

@ -10,6 +10,7 @@ categories = ["encoding"]
license = "MPL-2.0"
[dependencies]
bytes = { version = "1" }
rxml = { version = "0.12.0", default-features = false }
minidom = { version = "0.16", path = "../minidom" }
xso_proc = { version = "0.1", path = "../xso-proc", optional = true }

View file

@ -16,6 +16,10 @@ use crate::error::Error;
use crate::rxml_util::Item;
use crate::AsXml;
use core::fmt;
use bytes::BytesMut;
/// Helper iterator to convert an `Option<T>` to XML.
pub struct OptionAsXml<T: Iterator>(Option<T>);
@ -86,6 +90,30 @@ where
}
}
/// Provides a helper which implements Display printing raw XML
pub struct PrintRawXml<'x, T>(pub &'x T);
impl<'x, T: AsXml> fmt::Display for PrintRawXml<'x, T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let iter = match self.0.as_xml_iter() {
Ok(iter) => iter,
Err(err) => return write!(f, "<failed to serialize PrintRawXml: {:?}>", err),
};
let mut writer = rxml::writer::Encoder::new();
let mut buf = BytesMut::new();
for item in iter {
let item = match item {
Ok(item) => item,
Err(err) => return write!(f, "<failed to serialize PrintRawXml: {:?}>", err),
};
if let Err(err) = writer.encode(item.as_rxml_item(), &mut buf) {
return write!(f, "<failed to serialize PrintRawXml: {:?}>", err);
}
}
write!(f, "{:?}", buf)
}
}
#[cfg(test)]
mod tests {
use super::*;