sz_rust_core/lib.rs
1//! SZ-Rust Core — 主框架包
2//!
3//! 对标 ThinkPHP 8 的 Rust Web 框架核心,基于 axum 0.8 + SZ-ORM。
4//!
5//! ## 模块结构
6//!
7//! 所有模块均已实现并通过测试(v0.2.0 GA 候选)。
8//!
9//! | 模块 | 对齐 PHP | 状态 |
10//! |------|---------|------|
11//! | `controller` | `app\SzController` / `app\BaseController` | ✅ |
12//! | `model` | `think\Model` | ✅ |
13//! | `relation` | `think\Model` 关联关系(HasMany/BelongsTo/HasOne/BelongsToMany/Morph) | ✅ |
14//! | `request` | `$this->request->post/get` | ✅ |
15//! | `response` | `renderJson/renderSuccess/renderError` | ✅ |
16//! | `middleware` | CORS/Auth/Log/RateLimit/Trace | ✅ |
17//! | `guard` | NestJS Guard + Spring Security(sz-rust 自研) | ✅ |
18//! | `hooks` | think-orm Model 钩子(HookDispatcher 16 事件) | ✅ |
19//! | `multi_app` | `auto_multi_app` | ✅ |
20//! | `health` | 健康检查端点(K8s liveness/readiness) | ✅ |
21//! | `static_files` | 静态文件路由(`tower-http::ServeDir`) | ✅ |
22//! | `error_handler` | 404/500 标准化 JSON 响应 | ✅ |
23//! | `h2` | HTTP/2 + TLS(`think-swoole` SSL) | ✅ |
24//! | `routing` | 三层路由机制(属性宏/配置式/约定式) | ✅ |
25//! | `addons` | `addons/` 插件 | ✅ |
26//! | `router` | `with_route` | ✅ |
27//! | `container` | `app()` 容器 | ✅ |
28//! | `error` | `BaseException` | ✅ |
29//! | `macros` | `compact()` | ✅ |
30//! | `config` | `config/app.php` / `database.php` | ✅ |
31//! | `log` | `think-logger` | ✅ |
32//! | `server` | `think-swoole` / `think-worker` 启动入口 | ✅ |
33//! | `validate` | `think\Validate` 数据验证器 | ✅ |
34//! | `upload` | `think\File` + `think\file\UploadedFile` 文件上传 | ✅ |
35//! | `cache` | `think\facade\Cache` 缓存 facade | ✅ |
36//! | `session` | `think\facade\Session` 会话管理(SessionStore trait + MemorySessionStore) | ✅ |
37//! | `cookie` | `think\Cookie` Cookie 管理(CookieJar + CookieOptions) | ✅ |
38//! | `event` | `think\Event` 事件系统(Listener/Subscriber/Observer) | ✅ |
39//! | `env` | `think\facade\Env` 环境变量管理 | ✅ |
40//! | `i18n` | `think\facade\Lang` 多语言国际化 | ✅ |
41//! | `mail` | `think\facade\Mail` 邮件抽象(Mailer trait + MemoryMailer) | ✅ |
42//! | `migration_history` | `think migrate` 迁移历史表(多方言 DDL + CRUD SQL 生成) | ✅ |
43//! | `api_version` | API 版本管理(URL/Header/Query 多策略协商) | ✅ |
44//! | `cache_warmer` | 缓存预热管道(部署/启动时预热,串行/并行+超时控制) | ✅ |
45//! | `debug_page` | Whoops-style 调试页(开发环境 HTML + 生产环境简洁页) | ✅ |
46
47#![forbid(unsafe_code)]
48// v0.2.0:启用 missing_docs 警告,要求所有公开项必须有文档注释
49#![warn(missing_docs)]
50// 文档构建时将 missing_docs 作为错误(CI 中 RUSTDOCFLAGS="-D warnings" 会强制)
51#![cfg_attr(doctest, warn(missing_docs))]
52
53pub mod addons;
54pub mod api_version;
55pub mod cache;
56pub mod cache_warmer;
57pub mod config;
58pub mod container;
59pub mod controller;
60pub mod cookie;
61pub mod debug_page;
62pub mod env;
63pub mod error;
64pub mod error_handler;
65pub mod event;
66pub mod guard;
67pub mod h2;
68pub mod health;
69pub mod hooks;
70pub mod i18n;
71pub mod log;
72pub mod macros;
73pub mod mail;
74pub mod middleware;
75pub mod migration_history;
76pub mod model;
77pub mod multi_app;
78pub mod orm;
79pub mod relation;
80pub mod request;
81pub mod response;
82pub mod router;
83pub mod routing;
84pub mod runtime;
85pub mod server;
86pub mod session;
87pub mod static_files;
88pub mod upload;
89pub mod validate;
90pub mod view;
91
92// ============================================================================
93// 过程宏重导出
94// ============================================================================
95
96/// 编译时 SQL 校验宏 — 复用自 `sz-orm-macros`
97///
98/// 在编译期对 SQL 字符串字面量进行语法和注入模式校验,校验通过后
99/// 将 SQL 作为 `&'static str` 发出到调用处。任何校验失败都会触发
100/// `compile_error!`,二进制无法构建。
101///
102/// ## 校验规则
103///
104/// - SELECT 必须包含 FROM
105/// - INSERT 必须包含 INTO 和 VALUES
106/// - UPDATE 必须包含 SET
107/// - DELETE 必须包含 FROM
108/// - 括号必须平衡
109/// - 字符串字面量必须闭合
110/// - 禁止 SQL 注入模式(`; DROP TABLE` / `OR 1=1` / `UNION SELECT` / `--` / `/*` 等)
111///
112/// ## 用法
113///
114/// ```ignore
115/// use sz_rust_core::sql_string;
116///
117/// // 基础用法:校验通过后返回 &str
118/// let sql = sql_string!("SELECT * FROM users WHERE id = 1");
119///
120/// // 带参数数量校验
121/// let sql = sql_string!("SELECT * FROM users WHERE id = ?"; params: 1);
122///
123/// // ❌ 编译错误:SELECT 缺少 FROM
124/// // let sql = sql_string!("SELECT * users");
125///
126/// // ❌ 编译错误:检测到 SQL 注入模式
127/// // let sql = sql_string!("SELECT * FROM users WHERE name = 'x' OR '1'='1'");
128/// ```
129pub use sz_orm_macros::sql_string;
130
131/// 编译时 SQL 校验 + 可选真实 DB 验证宏 — 复用自 `sz-orm-macros`
132///
133/// 与 [`sql_string!`] 行为一致,额外支持在 `db-verify` feature 启用且
134/// `SZ_ORM_QUERY_VERIFY=1` 环境变量设置时,连接 `DATABASE_URL` 指向的
135/// 数据库执行 `EXPLAIN` 进行真实 schema 校验。
136pub use sz_orm_macros::query;
137
138// ============================================================================
139// 运行时 SQL 校验 — 复用自 sz-orm-sql-validator
140// ============================================================================
141
142pub use sz_orm_sql_validator::{
143 detect_statement_type, validate, validate_column_name, validate_delete, validate_insert,
144 validate_parameter_count, validate_select, validate_sql, validate_table_name, validate_update,
145 SqlStatementType, SqlValidationError, ValidationResult,
146};
147
148/// 运行时 SQL 校验便捷函数
149///
150/// 对 [`validate_sql`] 的薄包装,返回 `Result<(), String>` 以便上层不依赖
151/// `SqlValidationError` 类型也能处理错误。
152///
153/// ## 用法
154///
155/// ```rust,ignore
156/// use sz_rust_core::validate_sql_runtime;
157///
158/// // 合法 SQL
159/// assert!(validate_sql_runtime("SELECT * FROM users WHERE id = 1").is_ok());
160///
161/// // 非法 SQL(缺少 FROM)
162/// assert!(validate_sql_runtime("SELECT * users").is_err());
163///
164/// // SQL 注入
165/// assert!(validate_sql_runtime("SELECT * FROM users WHERE name = 'x' OR '1'='1'").is_err());
166/// ```
167pub fn validate_sql_runtime(sql: &str) -> Result<(), String> {
168 validate_sql(sql).map_err(|e| e.to_string())
169}