xmlstream: make sink implementation generic

This allows to use any serialisable type. The advantage is that moves
and clones are avoided (which would otherwise be needed to construct
e.g. a XmppStreamElement from a Stanza or Message).
This commit is contained in:
Jonas Schäfer 2024-09-02 17:27:23 +02:00
commit c6f928d5c8
6 changed files with 62 additions and 34 deletions

View file

@ -454,7 +454,7 @@ impl<Io: AsyncWrite + Unpin, T: FromXml + AsXml> XmlStream<Io, T> {
}
}
impl<'x, Io: AsyncWrite, T: FromXml + AsXml> Sink<&'x T> for XmlStream<Io, T> {
impl<'x, Io: AsyncWrite, T: FromXml + AsXml, U: AsXml> Sink<&'x U> for XmlStream<Io, T> {
type Error = io::Error;
fn poll_ready(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
@ -475,7 +475,7 @@ impl<'x, Io: AsyncWrite, T: FromXml + AsXml> Sink<&'x T> for XmlStream<Io, T> {
this.inner.poll_close(cx)
}
fn start_send(self: Pin<&mut Self>, item: &'x T) -> Result<(), Self::Error> {
fn start_send(self: Pin<&mut Self>, item: &'x U) -> Result<(), Self::Error> {
let this = self.project();
this.write_state.check_writable()?;
this.inner.start_send_xso(item)

View file

@ -158,7 +158,7 @@ async fn test_clean_shutdown() {
)
.await?;
let (_, mut stream) = stream.recv_features::<Data>().await?;
stream.close().await?;
SinkExt::<&Data>::close(&mut stream).await?;
match stream.next().await {
Some(Err(ReadError::StreamFooterReceived)) => (),
other => panic!("unexpected stream message: {:?}", other),
@ -181,7 +181,7 @@ async fn test_clean_shutdown() {
Some(Err(ReadError::StreamFooterReceived)) => (),
other => panic!("unexpected stream message: {:?}", other),
}
stream.close().await?;
SinkExt::<&Data>::close(&mut stream).await?;
Ok::<_, io::Error>(())
});
@ -229,7 +229,7 @@ async fn test_exchange_data_stream_reset_and_shutdown() {
contents: "once more".to_owned(),
})
.await?;
stream.close().await?;
SinkExt::<&Data>::close(&mut stream).await?;
match stream.next().await {
Some(Ok(Data { contents })) => assert_eq!(contents, "hello world!"),
other => panic!("unexpected stream message: {:?}", other),
@ -283,7 +283,7 @@ async fn test_exchange_data_stream_reset_and_shutdown() {
Some(Ok(Data { contents })) => assert_eq!(contents, "once more"),
other => panic!("unexpected stream message: {:?}", other),
}
stream.close().await?;
SinkExt::<&Data>::close(&mut stream).await?;
match stream.next().await {
Some(Err(ReadError::StreamFooterReceived)) => (),
other => panic!("unexpected stream message: {:?}", other),
@ -427,7 +427,7 @@ async fn test_can_receive_after_shutdown() {
contents: "world!".to_owned(),
})
.await?;
stream.close().await?;
<XmlStream<_, _> as SinkExt<&Data>>::close(&mut stream).await?;
Ok::<_, io::Error>(())
});