use crate::{BoxError, StandardOptions};
use asimov_protocol::{EndpointTicket, GossipReceiver, Node, Ticket, Topic};
use color_print::ceprintln;
pub async fn subscribe(
topic: &Topic,
ticket: &Option<String>,
_flags: &StandardOptions,
) -> Result<(), BoxError> {
let mut node = Node::default().bind().await?.start().await?;
node.online().await;
if let Some(ticket) = ticket {
let peer_ticket = EndpointTicket::decode_string(ticket.as_ref()).unwrap();
node.add_peer(peer_ticket.endpoint_addr().id);
}
if true {
let self_ticket = EndpointTicket::new(node.endpoint_addr());
ceprintln!("{}", self_ticket);
}
let topic_subscription = node.subscribe_and_join(topic).await?;
ceprintln!("<s,g>✓</> Topic=<s>{:?}</>", topic_subscription);
let (_sender, receiver) = topic_subscription.split();
tokio::spawn(subscribe_loop(receiver));
tokio::signal::ctrl_c().await?;
node.terminate().await?;
Ok(())
}
async fn subscribe_loop(
mut receiver: GossipReceiver,
) -> Result<(), std::boxed::Box<dyn core::error::Error + Send>> {
use futures_lite::stream::StreamExt;
while let Some(event) = receiver.try_next().await.unwrap() {
ceprintln!("<s,g>✓</> Event=<s>{event:?}</>");
}
Ok(())
}