qrpc 0.1.2

qrpc is a small QUIC + mTLS messaging library
Documentation
use std::net::SocketAddr;

use crate::error::{QrpcError, QrpcResult};

/// Bootstrap peer configuration used by a local instance to dial remote instances.
#[derive(Clone, Debug)]
pub struct PeerConfig {
    /// IP or hostname.
    pub address: String,
    /// Remote listening port.
    pub port: u16,
    /// TLS server name used for certificate verification.
    pub server_name: String,
    /// Optional custom CA path for this peer.
    pub ca_cert_path: Option<String>,
    /// Optional expected remote ID validated after register handshake.
    pub expected_id: Option<String>,
}

impl PeerConfig {
    /// Converts `address` + `port` to a `SocketAddr`.
    pub fn socket_addr(&self) -> QrpcResult<SocketAddr> {
        format!("{}:{}", self.address, self.port)
            .parse::<SocketAddr>()
            .map_err(|e| QrpcError::MessageDecode(format!("invalid socket addr: {e}")))
    }
}

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

    #[test]
    fn parse_socket_addr_ok() {
        let cfg = PeerConfig {
            address: "127.0.0.1".to_string(),
            port: 5000,
            server_name: "localhost".to_string(),
            ca_cert_path: None,
            expected_id: None,
        };

        let addr = cfg.socket_addr().expect("must parse");
        assert_eq!(addr.to_string(), "127.0.0.1:5000");
    }

    #[test]
    fn parse_socket_addr_fail() {
        let cfg = PeerConfig {
            address: "not-an-ip".to_string(),
            port: 5000,
            server_name: "localhost".to_string(),
            ca_cert_path: None,
            expected_id: None,
        };

        assert!(cfg.socket_addr().is_err());
    }
}