/ crates / acdc / src / commands / network.rs
network.rs
  1  //! Network command implementations.
  2  
  3  use acdc_core::Result;
  4  use acdc_network::{default_ports, NetworkManager};
  5  
  6  /// Run network diagnostics.
  7  pub async fn diagnostics(port: Option<u16>, json: bool) -> Result<()> {
  8      let api_port = port.unwrap_or(default_ports::ALPHA_REST);
  9      let manager = NetworkManager::local(api_port);
 10  
 11      println!("Running network diagnostics...\n");
 12      let diag = manager.diagnostics().await?;
 13  
 14      if json {
 15          let output = serde_json::to_string_pretty(&diag)
 16              .map_err(|e| acdc_core::Error::Network(format!("JSON serialization failed: {}", e)))?;
 17          println!("{}", output);
 18      } else {
 19          println!("{}", diag.format());
 20      }
 21  
 22      Ok(())
 23  }
 24  
 25  /// List connected peers.
 26  pub async fn peers_list(port: Option<u16>, json: bool) -> Result<()> {
 27      let api_port = port.unwrap_or(default_ports::ALPHA_REST);
 28      let manager = NetworkManager::local(api_port);
 29  
 30      let peers = manager.peers().list().await?;
 31  
 32      if json {
 33          let output = serde_json::to_string_pretty(&peers)
 34              .map_err(|e| acdc_core::Error::Network(format!("JSON serialization failed: {}", e)))?;
 35          println!("{}", output);
 36      } else {
 37          println!("{}", acdc_network::peers::format_peer_list(&peers));
 38      }
 39  
 40      Ok(())
 41  }
 42  
 43  /// Get peer count.
 44  pub async fn peers_count(port: Option<u16>) -> Result<()> {
 45      let api_port = port.unwrap_or(default_ports::ALPHA_REST);
 46      let manager = NetworkManager::local(api_port);
 47  
 48      let count = manager.peers().count().await?;
 49      println!("Connected peers: {}", count);
 50  
 51      Ok(())
 52  }
 53  
 54  /// Connect to a peer.
 55  pub async fn peers_connect(address: String, port: Option<u16>) -> Result<()> {
 56      let api_port = port.unwrap_or(default_ports::ALPHA_REST);
 57      let manager = NetworkManager::local(api_port);
 58  
 59      println!("Connecting to {}...", address);
 60      manager.peers().connect(&address).await?;
 61      println!("Connected to {}", address);
 62  
 63      Ok(())
 64  }
 65  
 66  /// Disconnect from a peer.
 67  pub async fn peers_disconnect(address: String, port: Option<u16>) -> Result<()> {
 68      let api_port = port.unwrap_or(default_ports::ALPHA_REST);
 69      let manager = NetworkManager::local(api_port);
 70  
 71      println!("Disconnecting from {}...", address);
 72      manager.peers().disconnect(&address).await?;
 73      println!("Disconnected from {}", address);
 74  
 75      Ok(())
 76  }
 77  
 78  /// Ping a peer.
 79  pub async fn ping(address: String) -> Result<()> {
 80      println!("Pinging {}...", address);
 81  
 82      let manager = NetworkManager::local(default_ports::ALPHA_REST);
 83      let latency = manager.ping(&address).await?;
 84  
 85      println!(
 86          "Reply from {}: time={:.2}ms",
 87          address,
 88          latency.as_secs_f64() * 1000.0
 89      );
 90  
 91      Ok(())
 92  }
 93  
 94  /// Check port status.
 95  pub async fn ports(role: Option<String>, json: bool) -> Result<()> {
 96      let checks = if let Some(role) = role {
 97          acdc_network::ports::check_role_ports(&role)
 98      } else {
 99          // Check all standard ports
100          acdc_network::ports::check_role_ports("validator")
101      };
102  
103      if json {
104          let output = serde_json::to_string_pretty(&checks)
105              .map_err(|e| acdc_core::Error::Network(format!("JSON serialization failed: {}", e)))?;
106          println!("{}", output);
107      } else {
108          println!("{}", acdc_network::ports::format_port_checks(&checks));
109      }
110  
111      Ok(())
112  }
113  
114  /// Get sync status.
115  pub async fn sync_status(port: Option<u16>, json: bool) -> Result<()> {
116      let api_port = port.unwrap_or(default_ports::ALPHA_REST);
117      let manager = NetworkManager::local(api_port);
118  
119      let status = manager.sync_status().await?;
120  
121      if json {
122          let output = serde_json::to_string_pretty(&status)
123              .map_err(|e| acdc_core::Error::Network(format!("JSON serialization failed: {}", e)))?;
124          println!("{}", output);
125      } else {
126          println!("{}", status.format());
127      }
128  
129      Ok(())
130  }
131  
132  /// Get external IP.
133  pub async fn external_ip() -> Result<()> {
134      let manager = NetworkManager::local(default_ports::ALPHA_REST);
135      let ip = manager.external_ip().await?;
136      println!("External IP: {}", ip);
137      Ok(())
138  }
139  
140  /// Get local IP.
141  pub async fn local_ip() -> Result<()> {
142      let manager = NetworkManager::local(default_ports::ALPHA_REST);
143      let ip = manager.local_ip()?;
144      println!("Local IP: {}", ip);
145      Ok(())
146  }