#[cfg(feature = "opentelemetry")]
use foxy::opentelemetry::OpenTelemetryConfig;
use foxy::{Foxy, info_fmt};
#[cfg(feature = "opentelemetry")]
use foxy::{error_fmt, warn_fmt};
use std::env;
use std::error::Error;
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
println!("Starting Foxy");
let file_from_env = env::var("FOXY_CONFIG_FILE").ok();
let mut loader = Foxy::loader().with_env_vars();
if let Some(ref path) = file_from_env {
println!("Using configuration from {path}");
loader = loader.with_env_vars().with_config_file(path);
} else {
let fallback_path = "/etc/foxy/config.toml";
println!(
"No FOXY_CONFIG_FILE env var found. Attempting to use default configuration path: {fallback_path}"
);
if !std::path::Path::new(fallback_path).exists() {
println!("Default configuration file {fallback_path} does not exist.");
return Err(Box::from("No configuration file found."));
}
loader = loader.with_env_vars().with_config_file(fallback_path);
}
let proxy = match loader.build().await {
Ok(p) => p,
Err(e) => {
println!("Failed to build proxy: {e}");
return Err(e.into());
}
};
#[cfg(feature = "opentelemetry")]
{
match proxy
.config()
.get::<OpenTelemetryConfig>("proxy.opentelemetry")
{
Ok(Some(otel_config)) => {
if !otel_config.endpoint.is_empty() {
foxy::opentelemetry::init(Some(otel_config)).unwrap_or_else(|err| {
error_fmt!("Startup", "Failed to initialise OpenTelemetry: {}", err);
});
} else {
warn_fmt!(
"Startup",
"OpenTelemetry endpoint is not configured. Skipping initialization."
);
}
}
Ok(None) => {
info_fmt!(
"Startup",
"OpenTelemetry configuration not found. Skipping initialization."
);
}
Err(e) => {
info_fmt!(
"Startup",
"Failed to read OpenTelemetry configuration: {}",
e
);
}
}
}
match proxy.start().await {
Ok(_) => {
info_fmt!("Foxy", "Proxy server stopped gracefully");
}
Err(e) => {
info_fmt!("Foxy", "Proxy server failed: {}", e);
return Err(e.into());
}
}
Ok(())
}