use fraiseql_wire::{connection::TlsConfig, FraiseClient};
use futures::stream::StreamExt;
use std::env;
#[tokio::main]
async fn main() -> fraiseql_wire::Result<()> {
let connection_string = env::var("FRAISEQL_CONNECTION_STRING")
.unwrap_or_else(|_| "postgres://localhost/fraiseql".to_string());
println!("Connecting to: {}", connection_string);
println!();
let tls = TlsConfig::builder()
.verify_hostname(true) .build()?;
println!("✓ TLS configuration created");
println!(" - System root certificates: enabled");
println!(" - Hostname verification: enabled");
println!();
println!("Attempting TLS connection...");
match FraiseClient::connect_tls(&connection_string, tls).await {
Ok(client) => {
println!("✓ Connected successfully!");
println!();
println!("Example: Querying users with TLS");
println!();
let mut stream = client
.query::<serde_json::Value>("user")
.chunk_size(256)
.execute()
.await?;
println!("Results:");
let mut count = 0;
while let Some(result) = stream.next().await {
let json = result?;
println!(" {}", json);
count += 1;
if count >= 5 {
println!(" ... (more results available)");
break;
}
}
if count == 0 {
println!(" (no results)");
}
println!();
println!("✓ Query completed successfully over TLS");
}
Err(e) => {
eprintln!("✗ Connection failed: {}", e);
eprintln!();
eprintln!("Troubleshooting tips:");
eprintln!(" 1. Ensure Postgres is running and accessible");
eprintln!(" 2. Check that TLS is enabled on the server");
eprintln!(" 3. For self-signed certificates, use:");
eprintln!(" .danger_accept_invalid_certs(true)");
eprintln!(" .danger_accept_invalid_hostnames(true)");
eprintln!(" 4. For custom CA certificates, use:");
eprintln!(" .ca_cert_path(\"/path/to/ca.pem\")");
return Err(e);
}
}
Ok(())
}