#juniper #merge #compose

juniper-compose

将多个Juniper对象定义合并为一个

2个版本

0.0.3 2022年7月24日
0.0.2 2022年7月23日
0.0.1 2022年7月23日

#15#juniper

MIT 许可协议

9KB
51

juniper-compose

将多个Juniper对象定义合并为单个对象类型。

crates.io | 文档 | GitHub

动机

你正在使用Juniper构建GraphQL服务器。在某个时候,你意识到你的查询和突变类型变得非常大

#[derive(Default)]
struct Query;

#[juniper::graphql_object]
impl Query {
    async fn user(ctx: &Context, id: Uuid) -> User {
        // ...
    }

    async fn users(ctx: &Context) -> Vec<User> {
        // ...
    }

    async fn task(ctx: &Context, id: Uuid) -> Task {
        // ...
    }

    async fn tasks(ctx: &Context) -> Vec<Task> {
        // ...
    }
    
    // ...many more
}

你希望将其拆分为多个特定领域的文件,例如,所有用户查询在一个文件中,所有任务查询在另一个文件中。使用当前的Juniper API,这非常困难,但这个crate可以帮助你。

用法

#[derive(Default)]
struct UserQueries;

#[composable_object]
#[juniper::graphql_object]
impl UserQueries {
    async fn user(ctx: &Context, id: Uuid) -> User {
        // ...
    }

    async fn users(ctx: &Context) -> Vec<User> {
        // ...
    }
}

#[derive(Default)]
struct TaskQueries;

#[composable_object]
#[juniper::graphql_object]
impl TaskQueries {
    async fn task(ctx: &Context, id: Uuid) -> Task {
        // ...
    }

    async fn tasks(ctx: &Context) -> Vec<Task> {
        // ...
    }
}

composite_object!(Query(UserQueries, TaskQueries));

支持自定义上下文

composite_object!(Query<Context = MyCustomContext>(UserQueries, TaskQueries));

支持生成类型的可见性指定符

composite_object!(pub(crate) Query<Context = MyCustomContext>(UserQueries, TaskQueries));

目前不支持自定义标量,但如果有需求,将会添加。

依赖关系

~9.5MB
~220K SLoC