use orcs_runtime::components::IOBridge;
use orcs_runtime::io::{setup_ctrlc_handler, Console, IOPort};
use orcs_types::{ChannelId, Principal, PrincipalId};
#[tokio::main]
async fn main() {
tracing_subscriber::fmt()
.with_max_level(tracing::Level::INFO)
.with_target(false)
.init();
println!("=== Console I/O Example ===\n");
println!("This demonstrates the IO abstraction layer.\n");
println!("Commands:");
println!(" y <id> - Approve with ID (converts to Signal)");
println!(" n <id> - Reject with ID (converts to Signal)");
println!(" veto - Emergency stop (Veto Signal)");
println!(" q / quit - Exit");
println!(" Ctrl+C - Send Veto signal");
println!("\nExample: 'y request-1' to approve request-1");
println!("\nType a command and press Enter:\n");
let channel_id = ChannelId::new();
let principal = Principal::User(PrincipalId::new());
let (port, input_handle, output_handle) = IOPort::with_defaults(channel_id);
setup_ctrlc_handler(input_handle.clone());
let mut bridge = IOBridge::new(port);
let console = Console::new(input_handle, output_handle);
let (input_reader, renderer, output_handle) = console.split();
let renderer_task = tokio::spawn(async move {
renderer.run(output_handle).await;
});
let input_task = tokio::spawn(async move {
input_reader.run().await;
});
println!("Waiting for input...\n");
loop {
match bridge.recv_input(&principal).await {
Some(Ok(signal)) => {
println!("\n[Signal received]");
println!(" Kind: {:?}", signal.kind);
println!(" Scope: {:?}", signal.scope);
println!(" Source: {:?}", signal.source);
if signal.is_veto() {
println!("\nVeto signal received, exiting...");
break;
}
println!("\nType another command:");
}
Some(Err(cmd)) => {
println!("\n[Command received (not a Signal)]");
println!(" {:?}", cmd);
if matches!(cmd, orcs_runtime::io::InputCommand::Quit) {
println!("\nQuit command received, exiting...");
break;
}
println!("\nType another command:");
}
None => {
println!("\nInput channel closed, exiting...");
break;
}
}
}
println!("\nShutting down...");
input_task.abort();
renderer_task.abort();
println!("=== Example Complete ===");
}