axol 0.2.0

Axol Web Framework
use std::{net::SocketAddr, ops::Deref};

use anyhow::anyhow;
use axol_http::request::RequestPartsRef;

use crate::{Error, FromRequestParts, Result};

#[derive(Debug, Clone, Copy)]
pub struct ConnectInfo(pub SocketAddr);

impl Deref for ConnectInfo {
    type Target = SocketAddr;

    fn deref(&self) -> &Self::Target {
        &self.0
    }
}

#[async_trait::async_trait]
impl<'a> FromRequestParts<'a> for ConnectInfo {
    async fn from_request_parts(request: RequestPartsRef<'a>) -> Result<Self> {
        let info = request
            .extensions
            .get::<ConnectInfo>()
            .ok_or_else(|| Error::internal(anyhow!("missing ConnectInfo extension")))?;
        Ok(*info)
    }
}