syslog_rs/sync/
syslog_stream.rs1use std::{fmt::{self, Arguments}, io::{self, ErrorKind}, marker::PhantomData};
17
18
19use crate::{Priority, SyslogDestination, error::SyRes, formatters::SyslogFormatter};
20
21pub trait SyStreamSyslogApi<F: SyslogFormatter, D: SyslogDestination>
24{
25 type SYSLOG<'t>;
27
28 fn syslog<'t>(syslog: Self::SYSLOG<'t>, pri: Priority, fmt: F) -> SyRes<()>;
30}
31
32pub struct SyStream<'t, PRI, D, F, S>
56where PRI: SyStreamPri, D: SyslogDestination, F: SyslogFormatter, S: SyStreamSyslogApi<F, D>
57{
58 pub(crate) s: Option<S::SYSLOG<'t>>,
59 pub(crate) _p: PhantomData<PRI>,
60 pub(crate) _p1: PhantomData<F>,
61 pub(crate) _p2: PhantomData<D>,
62}
63
64impl<'t, PRI: SyStreamPri, D: SyslogDestination, F: SyslogFormatter, S: SyStreamSyslogApi<F, D>> fmt::Write
65for SyStream<'t, PRI, D, F, S>
66{
67 fn write_str(&mut self, s: &str) -> fmt::Result
68 {
69 let s = s.to_string();
70
71 return
72 S::syslog( self.s.take().unwrap() , PRI::PRIO, s.into())
73 .map_err(|_e|
74 fmt::Error
75 );
76 }
77
78 fn write_fmt(self: &mut Self, args: Arguments<'_>) -> fmt::Result
79 {
80 if let Some(s) = args.as_str()
81 {
82 return
83 S::syslog( self.s.take().unwrap() , PRI::PRIO, s.into())
84 .map_err(|_| fmt::Error );
85 }
86 else
87 {
88 return
89 S::syslog( self.s.take().unwrap() , PRI::PRIO, args.to_string().into())
90 .map_err(|_| fmt::Error );
91 }
92 }
93}
94
95impl<'t, PRI: SyStreamPri, D: SyslogDestination, F: SyslogFormatter, S: SyStreamSyslogApi<F, D>> io::Write
96for SyStream<'t, PRI, D, F, S>
97{
98 fn write(&mut self, buf: &[u8]) -> io::Result<usize>
99 {
100 let s = str::from_utf8(buf).unwrap().to_string();
101 let n = s.len();
102
103 return
104 S::syslog( self.s.take().unwrap() , PRI::PRIO, s.into())
105 .map_err(|e|
106 io::Error::new(ErrorKind::Other, e.to_string())
107 )
108 .map(|_| n);
109 }
110
111 fn flush(&mut self) -> io::Result<()>
112 {
113 return Ok(());
114 }
115}
116
117pub trait SyStreamPri
119{
120 const PRIO: Priority;
121}
122
123pub struct SyStreamPriErr;
125
126impl SyStreamPri for SyStreamPriErr
127{
128 const PRIO: Priority = Priority::LOG_ERR;
129}
130
131pub struct SyStreamPriDebug;
133
134impl SyStreamPri for SyStreamPriDebug
135{
136 const PRIO: Priority = Priority::LOG_DEBUG;
137}
138
139pub struct SyStreamPriAlert;
141
142impl SyStreamPri for SyStreamPriAlert
143{
144 const PRIO: Priority = Priority::LOG_ALERT;
145}
146
147pub struct SyStreamPriCrit;
149
150impl SyStreamPri for SyStreamPriCrit
151{
152 const PRIO: Priority = Priority::LOG_CRIT;
153}
154
155pub struct SyStreamPriEmerg;
157
158impl SyStreamPri for SyStreamPriEmerg
159{
160 const PRIO: Priority = Priority::LOG_EMERG;
161}
162
163pub struct SyStreamPriInfo;
165
166impl SyStreamPri for SyStreamPriInfo
167{
168 const PRIO: Priority = Priority::LOG_INFO;
169}
170
171pub struct SyStreamPriNotice;
173
174impl SyStreamPri for SyStreamPriNotice
175{
176 const PRIO: Priority = Priority::LOG_NOTICE;
177}
178
179pub struct SyStreamPriWarning;
181
182impl SyStreamPri for SyStreamPriWarning
183{
184 const PRIO: Priority = Priority::LOG_WARNING;
185}