xmlstream: add support for boxing the transport
This is useful in situations where we don't want to care about the specific type of the underlying transport.
This commit is contained in:
parent
2388f23b4e
commit
519718d9b5
2 changed files with 44 additions and 0 deletions
|
|
@ -25,6 +25,8 @@ use xso::{
|
|||
AsXml, FromEventsBuilder, FromXml, Item,
|
||||
};
|
||||
|
||||
use crate::connect::AsyncReadAndWrite;
|
||||
|
||||
use super::capture::{log_enabled, log_recv, log_send, CaptureBufRead};
|
||||
|
||||
use xmpp_parsers::ns::STREAM as XML_STREAM_NS;
|
||||
|
|
@ -272,6 +274,31 @@ impl<Io: AsyncBufRead + AsyncWrite> RawXmlStream<Io> {
|
|||
pub(super) fn into_inner(self) -> Io {
|
||||
self.parser.into_inner().0.into_inner()
|
||||
}
|
||||
|
||||
/// Box the underlying transport stream.
|
||||
///
|
||||
/// This removes the specific type of the transport from the XML stream's
|
||||
/// type signature.
|
||||
pub(super) fn box_stream(self) -> RawXmlStream<Box<dyn AsyncReadAndWrite + Send + 'static>>
|
||||
where
|
||||
Io: AsyncReadAndWrite + Send + 'static,
|
||||
{
|
||||
let (io, p) = self.parser.into_inner();
|
||||
let mut io = CaptureBufRead::wrap(Box::new(io) as Box<_>);
|
||||
if log_enabled() {
|
||||
io.enable_capture();
|
||||
}
|
||||
let parser = rxml::AsyncReader::wrap(io, p);
|
||||
RawXmlStream {
|
||||
parser,
|
||||
timeouts: self.timeouts,
|
||||
writer: self.writer,
|
||||
tx_buffer: self.tx_buffer,
|
||||
tx_buffer_logged: self.tx_buffer_logged,
|
||||
tx_buffer_high_water_mark: self.tx_buffer_high_water_mark,
|
||||
stream_ns: self.stream_ns,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<Io: AsyncWrite> RawXmlStream<Io> {
|
||||
|
|
|
|||
|
|
@ -70,6 +70,8 @@ use tokio::io::{AsyncBufRead, AsyncWrite};
|
|||
|
||||
use xso::{AsXml, FromXml, Item};
|
||||
|
||||
use crate::connect::AsyncReadAndWrite;
|
||||
|
||||
mod capture;
|
||||
mod common;
|
||||
mod initiator;
|
||||
|
|
@ -337,6 +339,21 @@ impl<Io: AsyncBufRead + AsyncWrite + Unpin, T: FromXml + AsXml + fmt::Debug> Xml
|
|||
self.assert_retypable();
|
||||
self.inner.into_inner()
|
||||
}
|
||||
|
||||
/// Box the underlying transport stream.
|
||||
///
|
||||
/// This removes the specific type of the transport from the XML stream's
|
||||
/// type signature.
|
||||
pub fn box_stream(self) -> XmlStream<Box<dyn AsyncReadAndWrite + Send + 'static>, T>
|
||||
where
|
||||
Io: AsyncReadAndWrite + Send + 'static,
|
||||
{
|
||||
XmlStream {
|
||||
inner: self.inner.box_stream(),
|
||||
read_state: self.read_state,
|
||||
write_state: self.write_state,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<Io: AsyncBufRead, T: FromXml + AsXml + fmt::Debug> Stream for XmlStream<Io, T> {
|
||||
|
|
|
|||
Loading…
Reference in a new issue