use std::borrow::Cow;
use std::io;
use std::io::BufWriter;
use std::net::TcpStream;
use std::net::ToSocketAddrs;
use crate::format::SyslogContext;
use crate::sender::internal::impl_syslog_sender_common;
use crate::sender::internal::impl_syslog_stream_send_formatted;
pub fn tcp_well_known() -> io::Result<TcpSender> {
tcp("127.0.0.1:601")
}
pub fn tcp<A: ToSocketAddrs>(addr: A) -> io::Result<TcpSender> {
TcpSender::connect(addr)
}
#[derive(Debug)]
pub struct TcpSender {
writer: BufWriter<TcpStream>,
context: SyslogContext,
postfix: Cow<'static, str>,
}
impl TcpSender {
pub fn connect<A: ToSocketAddrs>(addr: A) -> io::Result<Self> {
let stream = TcpStream::connect(addr)?;
Ok(Self {
writer: BufWriter::new(stream),
context: SyslogContext::default(),
postfix: Cow::Borrowed("\r\n"),
})
}
pub fn set_postfix(&mut self, postfix: impl Into<Cow<'static, str>>) {
self.postfix = postfix.into();
}
pub fn set_context(mut self, context: SyslogContext) {
self.context = context;
}
pub fn mut_context(&mut self) -> &mut SyslogContext {
&mut self.context
}
}
impl_syslog_sender_common!(TcpSender);
impl_syslog_stream_send_formatted!(TcpSender);