use std::{fmt::{self, Arguments, Write}, marker::PhantomData};
use crate::{formatters::SyslogFormatter, sync::syslog_trait::SyslogApi, Priority, SyslogDestination};
pub trait SyStreamApi<'stream, F: SyslogFormatter, D: SyslogDestination, S: SyslogApi<F, D>>
{
fn stream(&'stream self, pri: Priority) -> SyStream<'stream, D, F, S>;
}
pub struct SyStream<'stream, D: SyslogDestination, F: SyslogFormatter, S: SyslogApi<F, D>>
{
pub(crate) inner: &'stream S,
pub(crate) pri: Priority,
pub(crate) _p: PhantomData<F>,
pub(crate) _p1: PhantomData<D>,
}
impl<'stream, D: SyslogDestination, F: SyslogFormatter, S: SyslogApi<F, D>> Write
for SyStream<'stream, D, F, S>
{
fn write_str(&mut self, s: &str) -> fmt::Result
{
let s = s.to_string();
self.inner.syslog(self.pri, s.into());
return Ok(());
}
fn write_fmt(self: &mut Self, args: Arguments<'_>) -> fmt::Result
{
if let Some(s) = args.as_str()
{
self.inner.syslog(self.pri, s.into());
return Ok(());
}
else
{
self.inner.syslog(self.pri, args.to_string().into());
return Ok(());
}
}
}