1#![forbid(unsafe_code)]
2use std::{
3 io::Error,
4 net::{SocketAddr, TcpStream, ToSocketAddrs},
5};
6pub mod ping;
7pub mod responses;
8pub mod scan;
9pub mod version;
10pub use ping::ping;
11pub use responses::ScanResult;
12pub use scan::scan;
13use thiserror::Error;
14pub use version::version;
15
16pub type Byte = u8;
17
18#[derive(Error, Debug)]
19pub enum ClamAVClientError {
20 #[error("unable to connect to clamav")]
21 UnableToConnect(#[from] Error), #[error("invalid socket address")]
24 InvalidSocketAddress(Error),
37 #[error("unable to parse response to utf-8")]
38 InvalidUTf8(Error),
40 #[error("unable to parse the clamav response")]
42 UnableToParseResponse(String),
43 #[error("unable to write to the stream")]
44 UnableToWriteToStream(Error),
46}
47
48fn connect_tcp_socket(addr: impl ToSocketAddrs) -> Result<TcpStream, ClamAVClientError> {
49 let addr: Vec<SocketAddr> = addr
50 .to_socket_addrs()
51 .map_err(ClamAVClientError::InvalidSocketAddress)?
52 .collect();
53
54 let stream = TcpStream::connect(&addr[0..]).map_err(ClamAVClientError::UnableToConnect)?;
55 Ok(stream)
56}