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();
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))
}
}
}