use async_stream::try_stream;
use futures_util::StreamExt;
use std::error::Error;
use tokio_stream::Stream;
mod types;
use types::CertstreamMessage;
const DEFAULT_CERTSTREAM_WS_URL: &str = "wss://certstream.calidog.io";
pub struct CertstreamClient {
url: String,
}
impl CertstreamClient {
pub fn new(name: &str) -> Self {
CertstreamClient {
url: name.to_string(),
}
}
pub fn watch_certs(&self) -> impl Stream<Item = Result<CertstreamMessage, Box<dyn Error>>> {
let url = self.url.clone();
try_stream! {
loop {
let (socket, _) = tokio_tungstenite::connect_async(&url).await?;
let (_, mut read_socket) = socket.split();
loop {
let msg_text = match read_socket.next().await {
Some(result) => {
match result {
Ok(msg) => match msg.into_text() {
Ok(text) => text,
Err(_) => {
continue;
}
},
Err(_err) => {
continue;
}
}
}
None => {
break;
}
};
let msg: types::CertstreamMessage = match serde_json::from_str(&msg_text) {
Ok(result) => result,
Err(err) => {
println!("Failed to parse json: {}", err);
println!("msg: {}", msg_text);
continue;
}
};
yield msg;
}
}
}
}
}
impl Default for CertstreamClient {
fn default() -> Self {
Self {
url: DEFAULT_CERTSTREAM_WS_URL.to_string(),
}
}
}