infrarust 1.0.2

A Rust adaptation of the Infrared Minecraft proxy
Documentation
use log::debug;
use tokio::net::TcpStream;

use crate::{
    core::config::ServerConfig,
    network::proxy_protocol::{errors::ProxyProtocolError, ProtocolResult},
    ServerConnection,
};

#[derive(Clone)]
pub struct Server {
    pub config: ServerConfig,
}

impl Server {
    pub fn new(config: ServerConfig) -> ProtocolResult<Self> {
        if config.addresses.is_empty() {
            return Err(ProxyProtocolError::Io(std::io::Error::new(
                std::io::ErrorKind::InvalidInput,
                "No server addresses configured",
            )));
        }
        Ok(Self { config })
    }

    pub async fn dial(&self) -> ProtocolResult<ServerConnection> {
        let mut last_error = None;

        debug!("Dialing server: {:?}", self.config.addresses);

        for addr in &self.config.addresses {
            match TcpStream::connect(addr).await {
                Ok(stream) => {
                    debug!("Connected to {}", addr);
                    stream.set_nodelay(true)?;
                    return Ok(ServerConnection::new(stream).await?);
                }
                Err(e) => {
                    debug!("Failed to connect to {}: {}", addr, e);
                    last_error = Some(e);
                }
            }
        }

        Err(last_error.unwrap().into())
    }
}