use super::types::*;
use crate::config::WhatsappConfig;
use async_stream::stream;
use futures::Stream;
use plexus_core::plexus;
use plexus_core::serde_helpers;
#[derive(Clone)]
pub struct Whatsapp {
config: WhatsappConfig,
client: reqwest::Client,
}
impl Whatsapp {
pub async fn new(config: WhatsappConfig) -> Result<Self, String> {
Ok(Self {
config,
client: reqwest::Client::new(),
})
}
}
#[plexus_macros::hub_methods(
namespace = "whatsapp",
version = "1.0.0",
description = "Send and receive WhatsApp messages via Business API"
)]
impl Whatsapp {
#[plexus_macros::hub_method(
description = "Send a WhatsApp message",
params(
to = "Recipient phone number (E.164 format)",
message = "Message content (text, template, or media)"
)
)]
async fn send_message(
&self,
to: String,
message: MessageContent,
) -> impl Stream<Item = SendMessageEvent> + Send + 'static {
let _params = SendMessageParams {
to: to.clone(),
message,
};
stream! {
yield SendMessageEvent::Sent {
message_id: uuid::Uuid::new_v4().to_string(),
to,
};
}
}
#[plexus_macros::hub_method(
streaming,
description = "Listen for incoming webhook events (messages, status updates)"
)]
async fn listen_webhooks(&self) -> impl Stream<Item = WebhookEvent> + Send + 'static {
stream! {
yield WebhookEvent::Error {
message: "Not implemented yet".to_string(),
};
}
}
}