inertia-rust 2.4.6

A Rust server-adapter for building modern MVC web apps with Inertia.
Documentation
use serde::de::DeserializeOwned;
use validator::Validate;

pub trait InertiaValidateOrRedirect<T, TRequest, TRedirect>
where
    T: DeserializeOwned + Validate,
{
    fn validate_or_back(self, req: &TRequest) -> Result<T, TRedirect>;
}

#[cfg(feature = "actix-validator")]
pub mod actix_validator {
    use std::collections::HashMap;

    use actix_web::{
        web::{self, Redirect},
        HttpRequest,
    };
    use serde::de::DeserializeOwned;
    use validator::Validate;

    use crate::{Inertia, InertiaFacade};

    use super::InertiaValidateOrRedirect;

    impl<T: DeserializeOwned + Validate> InertiaValidateOrRedirect<T, HttpRequest, Redirect> for T {
        #[inline]
        fn validate_or_back(self, req: &HttpRequest) -> Result<T, Redirect> {
            match self.validate() {
                Ok(_) => Ok(self),
                Err(errors) => {
                    let errors = errors
                        .field_errors()
                        .into_iter()
                        .map(|(key, v)| {
                            (
                                key,
                                v[0].message.as_ref().unwrap_or(&v[0].code).clone().into(),
                            )
                        })
                        .collect::<HashMap<_, _>>();

                    Err(Inertia::back_with_errors(req, errors))
                }
            }
        }
    }

    impl<T: DeserializeOwned + Validate> InertiaValidateOrRedirect<T, HttpRequest, Redirect>
        for web::Json<T>
    {
        #[inline]
        fn validate_or_back(self, req: &HttpRequest) -> Result<T, Redirect> {
            self.into_inner().validate_or_back(req)
        }
    }
}