previa-runner 1.0.0-alpha.20

API for remote execution of integration and load tests via HTTP streaming (SSE).
Documentation
mod server;

use tokio::net::TcpListener;
use tracing::info;

use crate::server::build_app;
use crate::server::state::AppState;

fn should_print_version(args: impl IntoIterator<Item = String>) -> bool {
    args.into_iter()
        .skip(1)
        .any(|arg| arg == "--version" || arg == "-v")
}

fn optional_env(key: &str) -> Option<String> {
    std::env::var(key)
        .ok()
        .map(|value| value.trim().to_owned())
        .filter(|value| !value.is_empty())
}

#[tokio::main]
async fn main() {
    if should_print_version(std::env::args()) {
        println!("previa-runner {}", env!("CARGO_PKG_VERSION"));
        return;
    }

    let _ = dotenvy::dotenv();

    tracing_subscriber::fmt()
        .with_env_filter(tracing_subscriber::EnvFilter::from_default_env())
        .init();

    let state = AppState {
        runner_auth_key: optional_env("RUNNER_AUTH_KEY"),
        ..AppState::default()
    };
    let address = std::env::var("ADDRESS").unwrap_or_else(|_| "0.0.0.0".to_owned());
    let port = std::env::var("PORT")
        .ok()
        .and_then(|value| value.parse::<u16>().ok())
        .unwrap_or(55880);
    info!("runner startup config: ADDRESS={}, PORT={}", address, port);
    let bind_addr = format!("{}:{}", address, port);

    let app = build_app(state);

    let listener = TcpListener::bind(&bind_addr)
        .await
        .expect("failed to bind listener");
    let local_addr = listener
        .local_addr()
        .expect("failed to read local bind address");

    info!("previa-runner listening on http://{}", local_addr);
    axum::serve(listener, app)
        .await
        .expect("failed to start server");
}

#[cfg(test)]
mod tests {
    use super::should_print_version;

    #[test]
    fn detects_version_flags() {
        assert!(should_print_version(vec![
            "previa-runner".to_owned(),
            "--version".to_owned(),
        ]));
        assert!(should_print_version(vec![
            "previa-runner".to_owned(),
            "-v".to_owned(),
        ]));
        assert!(!should_print_version(vec!["previa-runner".to_owned()]));
    }
}