#graphql #builder #api #api-bindings #request-builder

nightly lightql

轻量级GraphQL请求构建器

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