1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
//! DB Resolver trait — P2-1 修复 C-3:真实 DB resolver 集成
//!
//! 定义 GraphQL root field 与真实数据源(数据库/ORM)之间的桥接接口。
//!
//! # 设计
//!
//! - 使用 boxed future 手动实现 async trait,避免引入 async-trait 依赖
//! - 调用方实现此 trait 后,通过 `GraphQLServer::with_db_resolver` 注入
//! - 未注入 resolver 时,schema 回退到 mock 数据(向后兼容)
//!
//! # 使用示例
//!
//! ```ignore
//! use sz_orm_graphql::resolver::{DbResolver, ResolverContext};
//! use std::sync::Arc;
//!
//! struct MyDbResolver;
//!
//! impl DbResolver for MyDbResolver {
//! fn resolve_query(
//! &self,
//! ctx: &ResolverContext,
//! ) -> std::pin::Pin<Box<dyn std::future::Future<Output = Result<serde_json::Value, String>> + Send>> {
//! let field_name = ctx.field_name.clone();
//! let args = ctx.args.clone();
//! Box::pin(async move {
//! // 在此处执行真实数据库查询
//! Ok(serde_json::json!({"id": "1", "name": format!("{}_real", field_name)}))
//! })
//! }
//! }
//!
//! let resolver = Arc::new(MyDbResolver);
//! let server = sz_orm_graphql::GraphQLServer::new(4000)
//! .with_schema(schema)
//! .with_db_resolver(resolver);
//! ```
use Value;
use Future;
use Pin;
use Arc;
/// Resolver 调用上下文 — 传递字段名、参数等信息给 resolver
/// DB Resolver trait — P2-1 修复 C-3
///
/// 调用方实现此 trait,为 GraphQL root field 提供真实数据。
///
/// # 方法
///
/// - `resolve_query`:解析 Query 字段,返回单个对象或数组
/// - `resolve_mutation`:解析 Mutation 字段,返回操作结果
///
/// # async 实现
///
/// 使用 `Pin<Box<dyn Future>>` 返回异步结果,无需 async-trait 依赖。
/// 类型别名:Arc 包装的 DbResolver
pub type SharedDbResolver = ;