//! Peer bot that dials another bot over iroh and runs a few power demos. //! //! ```bash //! # terminal 1 //! cargo run --example bot -- --name alpha //! # copy the endpoint id printed //! //! # terminal 2 //! cargo run --example peer -- --name beta --peer //! ``` use clap::Parser; use erl_iroh::bot::Bot; use erl_iroh::powers::Powers; use erl_iroh::term; use tracing_subscriber::EnvFilter; #[derive(Parser, Debug)] #[command(name = "peer", about = "dial an erl-iroh bot and exercise powers")] struct Args { #[arg(long, default_value = "beta")] name: String, #[arg(long, default_value = "erl-iroh-cookie")] cookie: String, /// Remote iroh endpoint id. #[arg(long)] peer: String, } #[tokio::main] async fn main() -> erl_iroh::Result<()> { tracing_subscriber::fmt() .with_env_filter(EnvFilter::from_default_env().add_directive("erl_iroh=info".parse().unwrap())) .init(); let args = Args::parse(); let bot = Bot::builder(args.name) .cookie(args.cookie) .powers(Powers::all()) .build() .await?; println!("local endpoint: {}", bot.endpoint_id()); println!("dialing {} …", args.peer); let handle = bot.connect_iroh(&args.peer).await?; println!("connected to erlang node {}", handle.peer_name()); // Both sides are Rust "fake" nodes — RPC to erpc only works against real BEAM. // Still demonstrate SEND power with a registered-name message. bot.send( &handle.peer_name().to_string(), "net_kernel", term::atom("hello_from_peer").into(), ) .await .map_err(|e| { eprintln!("send (best-effort): {e}"); e }) .ok(); println!("peers: {:?}", bot.peers().await); println!("done"); Ok(()) }