use super::*;
#[must_use = "Until it is `open`ed, a `StreamCandidate` won't allow the connection to be used."]
pub struct StreamCandidate {
pub(crate) inner: bus::StreamCandidate,
}
impl core::fmt::Debug for StreamCandidate {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("StreamCandidate")
.field("peer_pubkey", &self.peer_pubkey())
.field("topic", &self.topic())
.finish()
}
}
impl StreamCandidate {
pub fn peer_pubkey(&self) -> PeerPubkey {
self.inner.inner.peer_pubkey()
}
pub fn topic(&self) -> bus::Topic {
self.inner.inner.topic()
}
pub fn open_write_only(mut self) -> Stream<()> {
let stream = self
.inner
.inner
.open(TaggedOption::None)
.into_rust()
.unwrap();
Stream {
stream: Arc::new(stream),
receiver: (),
}
}
pub fn open<OverloadId, Handler>(mut self, handler: Handler) -> Stream<Handler::Receiver>
where
Handler: IntoChannel<OverloadId, Inbound>,
Handler::Sender: Channel<OverloadId, Inbound>,
{
let (mut tx, rx) = handler.into_channel();
let stream = self
.inner
.inner
.open(TaggedOption::Some(
Box::new(move |payload| tx.send_infallibly_mut(Inbound(payload))).into(),
))
.into_rust()
.unwrap();
Stream {
stream: Arc::new(stream),
receiver: rx,
}
}
}