interlude 0.1.0

Convert share links of different music streaming services.
Documentation
use hyper::{server::conn::http1, service::service_fn};
use hyper_util::rt::TokioIo;
use interlude::{
    api::conversion::ApiClients, config::Config, server::connection_utils::handle_connection,
};
use std::{net::SocketAddr, sync::Arc};

#[tokio::main]
async fn main() {
    let config = Config::read();
    let client = reqwest::Client::new();
    let api_clients = Arc::new(
        ApiClients::new(&client, config.credentials.expect("No credentials found.")).await,
    );
    let api_secret = config.api_password.expect("api_password_not set.");
    let ext_addr = config.external_addr.expect("external_addr is not set.");
    let addr = SocketAddr::from((config.listen_address_ipv4, config.listen_port));
    let listener = tokio::net::TcpListener::bind(&addr)
        .await
        .expect("Failed to bind TCP listener");

    loop {
        let api_secret = api_secret.clone();
        let ext_addr = ext_addr.clone();
        let api_clients = Arc::clone(&api_clients);
        let (stream, _) = listener.accept().await.unwrap();
        let io = TokioIo::new(stream);

        tokio::spawn(async move {
            if let Err(err) = http1::Builder::new()
                .serve_connection(
                    io,
                    service_fn(|req| {
                        handle_connection(req, api_clients.clone(), &api_secret, &ext_addr)
                    }),
                )
                .await
            {
                eprintln!("{}", err);
            }
        });
    }
}