satex-core 0.1.2

Satex核心库,提供基础和通用的一些功能。
Documentation
use std::collections::HashMap;
use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4};

use hyper::http::Extensions;
use hyper::{HeaderMap, Method, Request, Uri, Version};

use crate::apply::Apply;

#[derive(Debug, Clone)]
pub struct PathVariables(pub HashMap<String, String>);

#[derive(Clone)]
#[non_exhaustive]
pub struct Essential {
    pub client_addr: SocketAddr,
    pub method: Method,
    pub uri: Uri,
    pub version: Version,
    pub headers: HeaderMap,
    pub extensions: Extensions,
}

impl Essential {
    pub fn attach<ReqBody>(request: Request<ReqBody>, client_addr: SocketAddr) -> Request<ReqBody> {
        let (parts, body) = request.into_parts();
        let essential = Essential {
            client_addr,
            method: parts.method.clone(),
            uri: parts.uri.clone(),
            version: parts.version,
            headers: parts.headers.clone(),
            extensions: Extensions::default(),
        };
        Request::from_parts(parts, body).apply(|request| request.extensions_mut().insert(essential))
    }
}

impl Default for Essential {
    fn default() -> Self {
        Self {
            client_addr: SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::UNSPECIFIED, 0)),
            method: Method::default(),
            uri: Uri::default(),
            version: Version::default(),
            headers: HeaderMap::default(),
            extensions: Extensions::default(),
        }
    }
}