use std::{future::Future, marker::PhantomData}; use facet::Facet; use futures::Stream; use serde::{Deserialize, Serialize}; use crux_core::{ Command, Request, capability::Operation, command::{NotificationBuilder, StreamBuilder}, }; // TODO add topics #[derive(Facet, Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] #[repr(C)] pub enum PubSubOperation { Publish(Vec), Subscribe, } #[derive(Facet, Deserialize)] pub struct Message(pub Vec); impl Operation for PubSubOperation { type Output = Message; } pub struct PubSub { effect: PhantomData, event: PhantomData, } impl PubSub where Event: Send + 'static, { #[must_use] pub fn subscribe() -> StreamBuilder>> where Effect: From> + Send + 'static, { Command::stream_from_shell(PubSubOperation::Subscribe).map(|Message(data)| data) } #[must_use] pub fn publish(data: Vec) -> NotificationBuilder> where Effect: From> + Send + 'static, { Command::notify_shell(PubSubOperation::Publish(data)) } }