xso: Add PrintRawXml helper struct with Display
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:
parent
dc842c44d1
commit
b1f4c5521d
5 changed files with 40 additions and 1 deletions
|
@ -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),
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 }
|
||||
|
|
|
@ -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::*;
|
||||
|
|
|
@ -47,6 +47,8 @@ pub use text::TextCodec;
|
|||
#[doc(inline)]
|
||||
pub use rxml_util::Item;
|
||||
|
||||
pub use asxml::PrintRawXml;
|
||||
|
||||
#[doc = include_str!("from_xml_doc.md")]
|
||||
#[doc(inline)]
|
||||
#[cfg(feature = "macros")]
|
||||
|
|
Loading…
Reference in a new issue