use std::{marker::PhantomData};
use crate::{
LogFacility, LogStat, Priority, SyslogDestination, error::SyRes,
formatters::{DefaultSyslogFormatter, SyslogFormatter},
sync::
{
LogItems, SyStream, SyStreamPri, syslog_stream::SyStreamSyslogApi,
syslog_sync_internal::SyslogSocketLockless, DefaultLocalSyslogDestination
},
};
#[derive(Debug)]
pub struct SingleSyslog<F = DefaultSyslogFormatter, D = DefaultLocalSyslogDestination>
where
F: SyslogFormatter,
D: SyslogDestination,
{
log_items: LogItems,
stream: SyslogSocketLockless<D>,
_p: PhantomData<F>,
_p_not_ss: PhantomData<*const ()>
}
impl SingleSyslog
{
pub
fn openlog(ident: Option<&str>, logstat: LogStat, facility: LogFacility, net_tap_prov: DefaultLocalSyslogDestination) -> SyRes<Self>
{
let log_items =
LogItems::new(ident, 0xff, logstat, facility);
let stream =
SyslogSocketLockless::<DefaultLocalSyslogDestination>::new(logstat, net_tap_prov)?;
return Ok(
Self
{
log_items,
stream,
_p:
PhantomData,
_p_not_ss:
PhantomData
}
);
}
}
impl<F, D> SingleSyslog<F, D>
where F: SyslogFormatter, D: SyslogDestination
{
pub
fn openlog_with(ident: Option<&str>, logstat: LogStat, facility: LogFacility, net_tap_prov: D) -> SyRes<Self>
{
let log_items =
LogItems::new(ident, 0xff, logstat, facility);
let stream =
SyslogSocketLockless::<D>::new(logstat, net_tap_prov)?;
return Ok(
Self
{
log_items,
stream,
_p:
PhantomData,
_p_not_ss:
PhantomData
}
);
}
}
impl<F, D> SingleSyslog<F, D>
where F: SyslogFormatter, D: SyslogDestination
{
#[inline]
pub
fn connectlog(&mut self) -> SyRes<()>
{
return
self
.stream
.connectlog();
}
#[inline]
pub
fn setlogmask(&mut self, logmask: i32) -> SyRes<i32>
{
return Ok(
self
.log_items
.set_logmask(logmask)
);
}
#[inline]
pub
fn closelog(&mut self) -> SyRes<()>
{
return
self
.stream
.disconnectlog();
}
#[inline]
pub
fn syslog(&mut self, pri: Priority, fmt: F) -> SyRes<()>
{
let Some((formatted_msg, logstat)) =
self.log_items.vsyslog1_msg::<F, D>(pri, &fmt)
else { return Ok(()) };
self.stream.vsyslog1(logstat, formatted_msg)
}
#[inline]
pub
fn change_identity(&mut self, ident: Option<&str>) -> SyRes<()>
{
self.log_items.set_identity(ident);
return Ok(());
}
#[inline]
pub
fn reconnect(&mut self) -> SyRes<()>
{
return
self
.stream
.reconnectlog();
}
#[inline]
pub
fn update_tap_data(&mut self, tap_data: D) -> SyRes<()>
{
return
self
.stream
.update_tap_data(tap_data.clone());
}
}
impl<F, D> SingleSyslog<F, D>
where F: SyslogFormatter, D: SyslogDestination
{
pub
fn get_stream<'t, PRI>(&'t mut self) -> SyStream<'t, PRI, D, F, &'t mut Self>
where PRI: SyStreamPri
{
SyStream
{
s: Some(self),
_p: PhantomData,
_p1: PhantomData,
_p2: PhantomData
}
}
}
impl<F: SyslogFormatter, D: SyslogDestination> SyStreamSyslogApi<F, D>
for &mut SingleSyslog<F, D>
{
type SYSLOG<'t> = &'t mut SingleSyslog<F, D>;
fn syslog<'t>(syslog: Self::SYSLOG<'t>, pri: Priority, fmt: F) -> SyRes<()>
{
syslog.syslog(pri, fmt)
}
}