2个不稳定版本
0.2.0 | 2018年12月6日 |
---|---|
0.1.0 | 2018年12月5日 |
#2582 在 数据库接口
19KB
312 行
LightQl
这个库是一个轻量级的库,允许你构建GraphQL请求并将它们序列化为指定的类型。给定类型的字段应与响应的"data"内容相匹配。示例
use lightql::{Request, QlType};
let response = json!(
"data": {
"players": [
{
"id": 1,
"name": "fred"
},
{
"id": 2,
"name": "marcel"
},
{
"id": 3,
"name": "roger"
}
]
}
)
// The given type should look like that:
#[derive(Deserialize)]
struct Player {
#[serde(default = "get_default_id")]
id: i32,
name: String
}
#[derive(Deserialize)]
struct Players {
players: Vec<Player>
}
// This will work.
// But here if you want to request one player:
let response = json!(
"data": {
"player": {
"id": 4,
"name": "bouras"
}
}
);
#[derive(Deserialize)]
struct OnePlayer {
player: Player
}
// default function
fn get_default_id() -> i32 {
0
}
// You have to match the "data" content with field.
用法
要使用这个库,有一个Request
结构体封装请求。
let player: OnePlayer = Request::new("player(id: 1) { name }", QlType::Query)
.send("https://your-api/")
.expect("Cannot fetch player");
// print: Player { id: 0, name: "fred" }
println!("{:?}", player);
自动推断反序列化类型。
从文件
你可以从一个文件中构建复杂的请求,例如
let response = Request::from_path("path/to/ql/request.query")
.send::<OnePlayer>("http://your-api/") // Note the turbo-fish
.unwrap();
参数
如果你需要运行时参数,可以使用prepare和hasmap。
let user_id = get_user_id(&user);
let mut params = Hasmap::new();
params.insert(
"_id",
user_id.parse()
);
let response = Request::new("player(id: _id) { id, name }", QlType::Query)
.prepare(Some(params)) // Should prepare before sending !
.send::<OnePlayer>("https://your-api/")
.unwrap(); // If not prepared return Err(QlNotPrepared)
贡献
你可以提交问题和pull请求,我会阅读它们。请尊重Rust风格。
依赖项
~6–16MB
~248K SLoC