use rpcnet::{RpcClient, RpcConfig};
use serde::{Deserialize, Serialize};
use std::net::SocketAddr;
#[derive(Serialize, Deserialize, Debug)]
struct EchoRequest {
message: String,
times: u32,
}
#[derive(Serialize, Deserialize, Debug)]
struct EchoResponse {
echoed_message: String,
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== Echo Client ===");
let config = RpcConfig::new("certs/test_cert.pem", "127.0.0.1:0").with_server_name("localhost");
let server_addr: SocketAddr = "127.0.0.1:8081".parse()?;
println!("Connecting to echo server at {}...", server_addr);
let client = RpcClient::connect(server_addr, config).await?;
println!("Connected successfully!");
println!("\n--- Testing Text Echo ---");
let request = EchoRequest {
message: "Hello Echo".to_string(),
times: 1,
};
let params = bincode::serialize(&request)?;
let response_bytes = client.call("echo", params).await?;
let response: EchoResponse = bincode::deserialize(&response_bytes)?;
println!("Echo: {}", response.echoed_message);
let request = EchoRequest {
message: "Test".to_string(),
times: 3,
};
let params = bincode::serialize(&request)?;
let response_bytes = client.call("echo", params).await?;
let response: EchoResponse = bincode::deserialize(&response_bytes)?;
println!("Multiple echo (3x): {}", response.echoed_message);
println!("\n--- Testing Binary Echo ---");
let binary_data = b"Binary test data \x00\x01\x02\x03";
let response_bytes = client.call("binary_echo", binary_data.to_vec()).await?;
if response_bytes == binary_data {
println!("✅ Binary echo successful: {} bytes", response_bytes.len());
} else {
println!("❌ Binary echo failed");
}
let large_data = vec![0xAB; 50_000]; let response_bytes = client.call("binary_echo", large_data.clone()).await?;
println!(
"Large binary echo: {} bytes (expected {})",
response_bytes.len(),
large_data.len()
);
println!("\n--- Testing Reverse ---");
let test_text = "Hello World!";
let response_bytes = client
.call("reverse", test_text.as_bytes().to_vec())
.await?;
let reversed = String::from_utf8_lossy(&response_bytes);
println!("Original: {}", test_text);
println!("Reversed: {}", reversed);
println!("\n--- Testing Error Handling ---");
let request = EchoRequest {
message: "Error".to_string(),
times: 200, };
let params = bincode::serialize(&request)?;
match client.call("echo", params).await {
Ok(_) => println!("❌ Expected error but got success"),
Err(e) => println!("✅ Error handling works: {}", e),
}
println!("\nAll tests completed!");
Ok(())
}