silent-sparrow 0.4.0

A minimal, scheduled, cryptographically signed status beacon.
Documentation
use reqwest::{Client, StatusCode};
use std::time::Duration;

#[derive(Debug, Clone)]
pub struct HttpsPublisher {
    client: Client,
    url: String,
    auth_token: Option<String>,
}

impl HttpsPublisher {
    pub fn new(url: impl Into<String>, auth_token: Option<String>) -> Self {
        let client = Client::builder()
            .timeout(Duration::from_secs(30))
            .build()
            .expect("Failed to build reqwest client");
        Self {
            client,
            url: url.into(),
            auth_token,
        }
    }

    pub async fn publish(&self, json_payload: &str) -> Result<(), String> {
        let mut request = self.client.post(&self.url).body(json_payload.to_owned());
        if let Some(token) = &self.auth_token {
            request = request.header("Authorization", format!("Bearer {}", token));
        }
        let response = request
            .send()
            .await
            .map_err(|e| format!("Request failed: {}", e))?;
        match response.status() {
            StatusCode::OK | StatusCode::CREATED | StatusCode::NO_CONTENT => Ok(()),
            status => Err(format!(
                "Server returned {}: {}",
                status,
                response.text().await.unwrap_or_default()
            )),
        }
    }
}