    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38

    use actix_web::{
        dev::{ServiceRequest, ServiceResponse},
        guard::GuardContext,
        HttpMessage, HttpRequest,
    };

    use crate::Session;

    /// Extract a [`Session`] object from various `actix-web` types (e.g. `HttpRequest`,
    /// `ServiceRequest`, `ServiceResponse`).
    pub trait SessionExt {
        /// Extract a [`Session`] object.
        fn get_session(&self) -> Session;
    }

    impl SessionExt for HttpRequest {
        fn get_session(&self) -> Session {
            Session::get_session(&mut self.extensions_mut())
        }
    }

    impl SessionExt for ServiceRequest {
        fn get_session(&self) -> Session {
            Session::get_session(&mut self.extensions_mut())
        }
    }

    impl SessionExt for ServiceResponse {
        fn get_session(&self) -> Session {
            self.request().get_session()
        }
    }

    impl<'a> SessionExt for GuardContext<'a> {
        fn get_session(&self) -> Session {
            Session::get_session(&mut self.req_data_mut())
        }
    }