use std::net::SocketAddr;
use hyper::server::conn::AddrStream;
use axum::extract::connect_info::Connected;
use axum::serve::IncomingStream;

#[derive(Clone, Debug)]
pub struct AppConnectInfo {
   pub remote_addr: SocketAddr, 
   pub local_addr: SocketAddr, 
}
impl Connected<IncomingStream<'_>> for AppConnectInfo {
    fn connect_info(target: IncomingStream<'_>) -> Self {
        AppConnectInfo {
            remote_addr: target.remote_addr(),
            local_addr: target.local_addr().unwrap_or(target.remote_addr()),
        }
    }
}
impl Connected<&AddrStream> for AppConnectInfo {
    fn connect_info(target: &AddrStream) -> Self {
        AppConnectInfo {
            remote_addr: target.remote_addr(),
            local_addr: target.local_addr(),
        }
    }
}