socio 0.1.5

Social login integration for web frameworks
Documentation
use axum_core::response::{IntoResponse, Response};
use http::{HeaderValue, StatusCode, header};

use crate::{error, types::AuthorizationRequest};

#[derive(Debug, Clone)]
pub struct Redirect {
    url: HeaderValue,
}

impl Redirect {
    pub fn new(url: HeaderValue) -> Self {
        Redirect { url }
    }
}

impl IntoResponse for Redirect {
    fn into_response(self) -> Response {
        (StatusCode::FOUND, [(header::LOCATION, self.url)]).into_response()
    }
}

impl TryFrom<AuthorizationRequest> for Redirect {
    type Error = crate::error::Error;

    fn try_from(value: AuthorizationRequest) -> Result<Self, Self::Error> {
        let header_value = HeaderValue::from_str(value.url.as_str())
            .map_err(|e| error::Error::HeaderValueError(e))?;
        Ok(Redirect::new(header_value))
    }
}