use plexor_core::neuron::{Neuron, NeuronImpl};
use plexor_core::plexus::Plexus;
use plexor_core::axon::{Axon, AxonImpl};
use plexor_core::reactant::{Reactant, ReactantError};
use plexor_core::payload::Payload;
use plexor_core::erasure::reactant::ReactantErased;
use plexor_core::namespace::NamespaceImpl;
use plexor_core::ganglion::{Ganglion, GanglionInternal};
use plexor_codec_serde_postcard::SerdePostcardCodec;
use std::sync::Arc;
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize, Debug, Clone)]
struct HelloMessage {
target: String,
count: u32,
}
#[derive(Clone)]
struct HelloReactant;
impl Reactant<HelloMessage, SerdePostcardCodec> for HelloReactant {
fn react(&self, payload: Arc<Payload<HelloMessage, SerdePostcardCodec>>) -> std::pin::Pin<Box<dyn std::future::Future<Output = Result<(), ReactantError>> + Send + 'static>> {
Box::pin(async move {
println!("Reactant received: Hello {}, count is {}", payload.value.target, payload.value.count);
Ok(())
})
}
fn erase(self: Box<Self>) -> Arc<dyn ReactantErased + Send + Sync + 'static> {
plexor_core::erasure::reactant::erase_reactant(self)
}
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let ns = Arc::new(NamespaceImpl { delimiter: ".".into(), parts: vec!["example", "hello"] });
let neuron = NeuronImpl::<HelloMessage, SerdePostcardCodec>::new_arc(ns);
let plexus_arc = Plexus::new_shared(vec![], vec![]).await;
{
let mut p = plexus_arc.lock().await;
p.adapt(neuron.clone()).await?;
p.react(neuron.name(), vec![Box::new(HelloReactant).erase()], vec![]).await?;
}
let mut axon = AxonImpl::new(neuron, plexus_arc);
axon.transmit(HelloMessage { target: "World".into(), count: 42 }).await?;
Ok(())
}