use crate::gui_app::P2PClientApp; use client_network::{NetworkCommand, NetworkEvent, P2PSharedData, start_p2p_executor}; mod gui_app; #[tokio::main] async fn main() -> eframe::Result<()> { // 1. Setup Channels let (network_cmd_tx, network_cmd_rx) = crossbeam_channel::unbounded::(); let (network_event_tx, network_event_rx) = crossbeam_channel::unbounded::(); // 2. Start the P2P Network Executor in a separate Tokio task // The executor runs in the background of our main async runtime. let shared_data: Option = None; let _network_handle = start_p2p_executor(network_cmd_rx, network_event_tx, shared_data); // 3. Configure and Run the Eframe/Egui GUI let options = eframe::NativeOptions { viewport: egui::ViewportBuilder::default() .with_inner_size([700.0, 500.0]) .with_min_inner_size([700.0, 500.0]) .with_resizable(false) .with_icon( eframe::icon_data::from_png_bytes(include_bytes!("../assets/icon.png")) .expect("Failed to load icon"), ), ..Default::default() }; eframe::run_native( "p2p-merkle client", options, Box::new(|_| { let app = P2PClientApp::new(network_cmd_tx, network_event_rx); Ok(Box::new(app)) }), ) // Starts the protocol }