use std::fmt;
use std::sync::mpsc::SendError;
pub struct ChannelSender<T>
{
#[ cfg( not( queued_sources ) ) ]
inner: calloop::channel::Sender<T>,
#[ cfg( queued_sources ) ]
inner: std::sync::mpsc::Sender<T>,
}
impl<T> ChannelSender<T>
{
pub fn send( &self, msg: T ) -> Result<(), SendError<T>>
{
self.inner.send( msg )?;
#[ cfg( queued_sources ) ]
wake();
Ok( () )
}
#[ cfg( not( queued_sources ) ) ]
pub( crate ) fn from_calloop( inner: calloop::channel::Sender<T> ) -> Self
{
Self { inner }
}
}
impl<T> Clone for ChannelSender<T>
{
fn clone( &self ) -> Self
{
Self { inner: self.inner.clone() }
}
}
impl<T> fmt::Debug for ChannelSender<T>
{
fn fmt( &self, f: &mut fmt::Formatter<'_> ) -> fmt::Result
{
f.debug_struct( "ChannelSender" ).finish_non_exhaustive()
}
}
#[ cfg( queued_sources ) ]
static WAKE: std::sync::OnceLock<fn()> = std::sync::OnceLock::new();
#[ cfg( queued_sources ) ]
pub( crate ) fn channel<T>( wake: fn() ) -> ( ChannelSender<T>, std::sync::mpsc::Receiver<T> )
{
let _ = WAKE.set( wake );
let ( inner, rx ) = std::sync::mpsc::channel();
( ChannelSender { inner }, rx )
}
#[ cfg( queued_sources ) ]
fn wake()
{
if let Some( wake ) = WAKE.get() { wake(); }
}