pushyapi 0.1.4

A simple unofficial API wrapper for Pushy
Documentation
use std::{collections::HashMap, error::Error};
use serde::{Serialize, Deserialize};
use serde_json::Value;
use dotenv::dotenv;

#[derive(Debug, Serialize, Deserialize)]
struct PushyMessage {
    to: Vec<String>,
    data: HashMap<String, Value>,
    notification: Option<HashMap<String, String>>,
}

impl PushyMessage {
    fn new(to: Vec<String>, data: HashMap<String, Value>, notification: Option<HashMap<String, String>>) -> PushyMessage {
        PushyMessage {
            to,
            data,
            notification,
        }
    }
}

#[deprecated]
pub async fn send_message(
    to: Vec<String>,
    data: HashMap<String, String>,
    notification: Option<HashMap<String, String>>,
) -> Result<String, Box<dyn Error>> {
    dotenv().ok();

    let data_value: HashMap<String, Value> = data
    .into_iter()
    .map(|(k, v)| (k, Value::String(v)))
    .collect();

    let pushy_message = PushyMessage::new(to, data_value, notification);
    let url = std::env::var("PUSHY_URL").unwrap_or("https://api.pushy.me/push?api_key=".to_string());
    let api_key = std::env::var("PUSHY_API_KEY").unwrap_or("".to_string());
    let pushy_url = format!("{}{}", url, api_key);

    let post = reqwest::Client::new()
        .post(&pushy_url)
        .json(&pushy_message)
        .send()
        .await?
        .text()
        .await;

    match post {
        Ok(response) => {
            Ok(response)
        },
        Err(e) => {
            eprintln!("{}", e.to_string());
            Err(Box::new(e))
        },        
    }
}

pub async fn send_message_json<T: Serialize>(
    to: Vec<String>,
    data: T,
    notification: Option<HashMap<String, String>>,
) -> Result<String, Box<dyn std::error::Error>> {
    dotenv().ok();

    // Convert T into a JSON map
    let value = serde_json::to_value(data)?;
    let data_map: HashMap<String, Value> = match value {
        Value::Object(map) => map.into_iter().collect(),
        _ => {
            return Err("send_message_json expects a struct or map-like object".into());
        }
    };

    let pushy_message = PushyMessage::new(to, data_map, notification);
    let url = std::env::var("PUSHY_URL").unwrap_or_else(|_| "https://api.pushy.me/push?api_key=".to_string());
    let api_key = std::env::var("PUSHY_API_KEY").unwrap_or_default();
    let pushy_url = format!("{}{}", url, api_key);

    let post = reqwest::Client::new()
        .post(&pushy_url)
        .json(&pushy_message)
        .send()
        .await?
        .text()
        .await;

    match post {
        Ok(response) => Ok(response),
        Err(e) => {
            eprintln!("{}", e.to_string());
            Err(Box::new(e))
        }
    }
}