use crate::{
errors::ClickSendError,
types::{DeliveryReceiptWebhook, InboundSmsWebhook},
};
pub fn parse_inbound_sms(body: &[u8]) -> Result<InboundSmsWebhook, ClickSendError> {
serde_json::from_slice(body).map_err(|e| ClickSendError::Decode {
message: e.to_string(),
body: String::from_utf8_lossy(body).into_owned(),
})
}
pub fn parse_delivery_receipt(body: &[u8]) -> Result<DeliveryReceiptWebhook, ClickSendError> {
serde_json::from_slice(body).map_err(|e| ClickSendError::Decode {
message: e.to_string(),
body: String::from_utf8_lossy(body).into_owned(),
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parses_inbound() {
let body = br#"{"message_id":"abc","from":"+15551234567","to":"+15557654321","body":"hi","timestamp":1700000000,"originator":"clicksend"}"#;
let parsed = parse_inbound_sms(body).unwrap();
assert_eq!(parsed.message_id.as_deref(), Some("abc"));
assert_eq!(parsed.from.as_deref(), Some("+15551234567"));
}
#[test]
fn parses_receipt() {
let body = br#"{"message_id":"abc","status":"DELIVERED","status_code":"201","timestamp":1700000000}"#;
let parsed = parse_delivery_receipt(body).unwrap();
assert_eq!(parsed.status.as_deref(), Some("DELIVERED"));
}
#[test]
fn handles_missing_fields() {
let parsed = parse_inbound_sms(b"{}").unwrap();
assert!(parsed.message_id.is_none());
}
}