moleculer 0.4.1

Progressive microservices framework for Rust, based on and compatible with moleculerjs/moleculer
Documentation
use std::error::Error;

use moleculer::{
    config::{ConfigBuilder, Transporter},
    service::{Context, Event, EventBuilder, Service},
    ServiceBroker,
};
use serde::{Deserialize, Serialize};

#[tokio::main]
async fn main() -> eyre::Result<()> {
    env_logger::init();
    color_eyre::install()?;

    let config = ConfigBuilder::default()
        .transporter(Transporter::nats("nats://localhost:4222"))
        .build();

    let emit_hi = EventBuilder::new("emitHi").add_callback(emit_hi).build();

    let broadcast_name = EventBuilder::new("broadcastName")
        .add_callback(broadcast_name)
        .build();

    let greeter_service = Service::new("rustGreeter")
        .add_event(emit_hi)
        .add_event(broadcast_name);

    let service_broker = ServiceBroker::new(config).add_service(greeter_service);
    service_broker.start().await;

    Ok(())
}

fn emit_hi(ctx: Context<Event>) -> Result<(), Box<dyn Error>> {
    println!("Received emitHi in rust");
    ctx.broker.emit("test", serde_json::json!({}));

    Ok(())
}

fn broadcast_name(ctx: Context<Event>) -> Result<(), Box<dyn Error>> {
    let msg: PrintNameMessage = serde_json::from_value(ctx.params)?;
    println!("Received broadcastName in rust");
    ctx.broker
        .broadcast("testWithParam", serde_json::to_value(&msg)?);

    Ok(())
}

#[derive(Deserialize, Serialize)]
struct PrintNameMessage {
    name: String,
}