tgin 0.1.0

Universal traffic glue: a Rust construction kit for gateways — HTTP, Telegram bots, RabbitMQ, Kafka, WebSocket tunnels
Documentation
use tgin::Tgin;
use tgin::batteries::egress::http::HttpEgress;
use tgin::batteries::ingress::http::HttpIngress;
use tgin::batteries::lb::RoundRobin;
use tgin::batteries::route::Route;
use tgin::shared::client::HttpClient;
use tgin::shared::server::HttpServer;
use tgin::types::request::RequestData;

fn env_or(key: &str, default: &str) -> String {
    std::env::var(key).unwrap_or_else(|_| default.to_string())
}

#[tokio::main]
async fn main() {
    let api_backend_1 = env_or("API_BACKEND_1", "http://127.0.0.1:3001");
    let api_backend_2 = env_or("API_BACKEND_2", "http://127.0.0.1:3002");
    let default_backend = env_or("DEFAULT_BACKEND", "http://127.0.0.1:3000");

    let server = HttpServer::new("0.0.0.0:8080");
    let http = HttpClient::new();

    Tgin::new()
        .pipeline(
            HttpIngress::catch_all(&server),
            Route::new()
                .when(
                    |request: &RequestData| request.uri.path().starts_with("/api"),
                    RoundRobin::new()
                        .to(HttpEgress::new(&http, &api_backend_1))
                        .to(HttpEgress::new(&http, &api_backend_2)),
                )
                .otherwise(HttpEgress::new(&http, &default_backend)),
        )
        .run()
        .await;
}