use secrecy::SecretString;
use std::sync::Arc;
use veracode_platform::{VeracodeConfig, VeracodeCredentials};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("🔐 ARC-based Credential Sharing Example");
println!("========================================");
println!("\n2️⃣ ARC-based credential sharing:");
let api_id_arc = Arc::new(SecretString::new(
std::env::var("VERACODE_API_ID")
.unwrap_or_else(|_| "demo_api_id".to_string())
.into(),
));
let api_key_arc = Arc::new(SecretString::new(
std::env::var("VERACODE_API_KEY")
.unwrap_or_else(|_| "demo_api_key".to_string())
.into(),
));
let config_arc =
VeracodeConfig::from_arc_credentials(Arc::clone(&api_id_arc), Arc::clone(&api_key_arc));
println!(" ✓ Config created with ARC-based credentials");
println!("\n3️⃣ Direct VeracodeCredentials usage:");
let credentials = VeracodeCredentials::new(
std::env::var("VERACODE_API_ID").unwrap_or_else(|_| "demo_api_id".to_string()),
std::env::var("VERACODE_API_KEY").unwrap_or_else(|_| "demo_api_key".to_string()),
);
let shared_api_id = credentials.api_id_ptr();
let shared_api_key = credentials.api_key_ptr();
println!(" ✓ ARC pointers obtained for thread sharing");
println!("\n4️⃣ Thread-safe credential sharing:");
let handles = (0..3)
.map(|i| {
let api_id_clone = Arc::clone(&shared_api_id);
let api_key_clone = Arc::clone(&shared_api_key);
tokio::spawn(async move {
let _thread_config =
VeracodeConfig::from_arc_credentials(api_id_clone, api_key_clone);
println!(" ✓ Thread {i} created config successfully");
Ok::<(), Box<dyn std::error::Error + Send + Sync>>(())
})
})
.collect::<Vec<_>>();
for handle in handles {
if let Err(e) = handle.await? {
eprintln!("Thread error: {e}");
}
}
println!("\n5️⃣ Security features:");
println!(" Debug output (credentials are redacted):");
println!(" {credentials:?}");
println!(" {config_arc:?}");
println!("\n6️⃣ Memory efficiency:");
println!(" ✓ All configs share the same ARC-wrapped credential data");
println!(" ✓ No duplication of sensitive information in memory");
println!(" ✓ Secure cleanup when all references are dropped");
println!("\n7️⃣ Proper credential usage:");
println!(
" API ID (exposed for auth): {}",
credentials
.expose_api_id()
.chars()
.take(8)
.collect::<String>()
);
println!(
" API Key (exposed for auth): {}...",
credentials
.expose_api_key()
.chars()
.take(8)
.collect::<String>()
);
println!("\n✅ ARC-based credential example completed successfully!");
println!("\nKey benefits:");
println!(" • Thread-safe credential sharing");
println!(" • Memory efficient (shared via ARC)");
println!(" • Secure (debug redaction, controlled access)");
println!(" • Flexible (multiple creation methods)");
Ok(())
}