use futures::prelude::*;
use logimesh::server::{self, Channel};
use logimesh::{client, context};
#[logimesh::component]
pub trait World {
async fn hello(name: String) -> String;
}
#[derive(Clone)]
struct CompHello;
impl World for CompHello {
async fn hello(self, _: context::Context, name: String) -> String {
format!("Hello, {name}!")
}
}
async fn spawn(fut: impl Future<Output = ()> + Send + 'static) {
tokio::spawn(fut);
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let (client_transport, server_transport) = logimesh::transport::channel::unbounded();
let server = server::BaseChannel::with_defaults(server_transport);
tokio::spawn(server.execute(CompHello.logimesh_serve()).for_each(spawn));
let client = WorldClient::new(client::core::Config::default(), client_transport).spawn();
let hello = client.hello(context::current(), "Andeya".to_string()).await?;
println!("{hello}");
Ok(())
}