use serde::{Deserialize, Serialize};

/// Validation errors have their own schema to provide context
/// for invalid requests eg. mismatched types and out of bounds values. There
/// may be any number of these per 422 UNPROCESSABLE ENTITY error.
#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)]
pub struct ValidationError {
    /// The location as a [`Vec`] of [`String`]s -- often in the form
    /// `[\"body\", \"field_name\"]`, `[\"query\", \"field_name\"]`, etc. They
    /// may, however, be arbitrarily deep.
    pub loc: Vec<String>,
    /// The message accompanying the validation error item.
    pub msg: String,
    /// The type of error, often \"type_error\" or \"value_error\", but
    /// sometimes with more context like as \"value_error.number.not_ge\"
    pub r#type: String,
}

impl ValidationError {
    /// Validation errors have their own schema to provide context for invalid
    /// requests eg. mismatched types and out of bounds values. There may be any
    /// number of these per 422 UNPROCESSABLE ENTITY error.
    pub fn new(loc: Vec<String>, msg: String, r#type: String) -> ValidationError {
        ValidationError { loc, msg, r#type }
    }
}
