sz-orm-query 1.2.2

SZ-ORM Query Builder, Dialect, Typed Query, and related abstractions
Documentation
//! SZ-ORM Query Builder
//!
//! 查询构建、方言、类型化查询、关联查询等。

use std::fmt;
use std::ops::Deref;

pub mod data_permission;
pub mod dynamic_filter;
pub mod dynamic_sql;
pub mod entity_graph;
pub mod find_with_related;
pub mod hydration_plugin;
pub mod join_dsl;
pub mod json_query;
pub mod lambda;
pub mod query;
pub mod queryable;
pub mod quick_query;
pub mod typed;
pub mod typed_ast;

pub use data_permission::*;
pub use dynamic_filter::*;
pub use dynamic_sql::*;
pub use entity_graph::*;
pub use find_with_related::*;
pub use hydration_plugin::*;
pub use join_dsl::*;
pub use json_query::*;
pub use lambda::*;
pub use query::*;
pub use queryable::*;
pub use quick_query::*;
pub use typed::*;
pub use typed_ast::*;

// ============================================================================
// ValidationError — 查询校验错误(封装 sz-orm-sql-validator 内部类型)
// ============================================================================

/// SQL 校验错误集合。
///
/// `QueryBuilder::validate*` 系列方法返回此类型,而非直接暴露
/// `sz_orm_sql_validator::SqlValidationError`,避免下游代码对内部 crate 产生依赖。
///
/// 通过 [`Deref`] 可像 `Vec<SqlValidationError>` 一样遍历:
///
/// ```ignore
/// match builder.validate() {
///     Ok(()) => { /* SQL 合法 */ }
///     Err(errors) => {
///         for err in errors.iter() {
///             eprintln!("validation error: {}", err);
///         }
///     }
/// }
/// ```
#[derive(Debug, Clone, PartialEq, Default)]
pub struct ValidationError(Vec<sz_orm_sql_validator::SqlValidationError>);

impl Deref for ValidationError {
    type Target = Vec<sz_orm_sql_validator::SqlValidationError>;
    fn deref(&self) -> &Self::Target {
        &self.0
    }
}

impl From<sz_orm_sql_validator::SqlValidationError> for ValidationError {
    fn from(e: sz_orm_sql_validator::SqlValidationError) -> Self {
        Self(vec![e])
    }
}

impl From<Vec<sz_orm_sql_validator::SqlValidationError>> for ValidationError {
    fn from(v: Vec<sz_orm_sql_validator::SqlValidationError>) -> Self {
        Self(v)
    }
}

impl fmt::Display for ValidationError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        if self.0.len() == 1 {
            write!(f, "{}", self.0[0])
        } else {
            write!(f, "{} validation errors: ", self.0.len())?;
            for (i, e) in self.0.iter().enumerate() {
                if i > 0 {
                    write!(f, "; ")?;
                }
                write!(f, "{}", e)?;
            }
            Ok(())
        }
    }
}

impl std::error::Error for ValidationError {}