#[cfg(feature = "vault-config")]
fn main() -> Result<(), Box<dyn std::error::Error>> {
use foxy::config::{Config, FileConfigProvider, VaultConfigProvider};
use std::fs;
use tempfile::tempdir;
println!("Vault Config Example");
println!("====================");
let temp_dir = tempdir()?;
let vault_dir = temp_dir.path().join("vault").join("secret");
fs::create_dir_all(&vault_dir)?;
fs::write(vault_dir.join("redis_password"), "super_secret_redis_pass")?;
fs::write(vault_dir.join("db_password"), "my_database_password")?;
fs::write(vault_dir.join("db_user"), "dbadmin")?;
fs::write(vault_dir.join("api_key"), "sk-1234567890abcdef")?;
fs::write(vault_dir.join("backup_host"), "backup.example.com")?;
println!("Created vault directory: {}", vault_dir.display());
println!("Secret files:");
for entry in fs::read_dir(&vault_dir)? {
let entry = entry?;
let content = fs::read_to_string(entry.path())?;
println!(" {}: {}", entry.file_name().to_string_lossy(), content);
}
println!();
let config_file = temp_dir.path().join("config.json");
let config_content = r#"{
"server": {
"listen": "0.0.0.0:8080",
"secret": "${secret.redis_password}"
},
"database": {
"host": "localhost",
"port": 5432,
"username": "admin",
"password": "${secret.db_password}",
"connection_string": "postgresql://${secret.db_user}:${secret.db_password}@localhost:5432/mydb"
},
"api": {
"key": "${secret.api_key}",
"endpoints": [
"https://api.example.com",
"https://${secret.backup_host}/api"
]
},
"logging": {
"level": "info",
"format": "json"
}
}"#;
fs::write(&config_file, config_content)?;
println!("Configuration file content:");
println!("{}", config_content);
println!();
let file_provider = FileConfigProvider::new(config_file.to_str().unwrap())?;
let vault_provider = VaultConfigProvider::wrap(file_provider, vault_dir.to_str().unwrap());
let config = Config::builder().with_provider(vault_provider).build();
println!("Configuration values after vault interpolation:");
println!("===============================================");
let server_secret: String = config.get("server.secret")?.unwrap();
println!("server.secret: {}", server_secret);
let connection_string: String = config.get("database.connection_string")?.unwrap();
println!("database.connection_string: {}", connection_string);
let endpoints: Vec<String> = config.get("api.endpoints")?.unwrap();
println!("api.endpoints: {:?}", endpoints);
let log_level: String = config.get("logging.level")?.unwrap();
println!("logging.level: {}", log_level);
println!();
println!("Example completed successfully!");
Ok(())
}
#[cfg(not(feature = "vault-config"))]
fn main() {
println!("This example requires the 'vault-config' feature to be enabled.");
println!("Run with: cargo run --example vault_example --features vault-config");
}