Async/await resolvers for non-encodable return type like Protocols.
public extension Graphiti.Field {
/// Async-await non-throwing GraphQL resolver function
typealias AsyncAwaitResolve<ObjectType, Context, Arguments, FieldType> = (ObjectType) -> (Context, Arguments) async -> FieldType
convenience init<ResolveType>(
_ name: String,
at function: @escaping AsyncAwaitResolve<ObjectType, Context, Arguments, ResolveType>,
as: FieldType.Type,
@ArgumentComponentBuilder<Arguments> _ argument: () -> [ArgumentComponent<Arguments>]
) {
let resolve: AsyncResolve<ObjectType, Context, Arguments, FieldType> = { type in
{ context, arguments, eventLoopGroup in
eventLoopGroup.task { await function(type)(context, arguments) }
}
}
self.init(name, at: resolve, argument)
}
convenience init<ResolveType>(
_ name: String,
at function: @escaping AsyncAwaitResolve<ObjectType, Context, Arguments, ResolveType>,
as: FieldType.Type,
) where Arguments == NoArguments {
let resolve: AsyncResolve<ObjectType, Context, Arguments, FieldType> = { type in
{ context, arguments, eventLoopGroup in
eventLoopGroup.task { await function(type)(context, arguments) }
}
}
self.init(name, at: resolve, {})
}
/// Async-await throwing GraphQL resolver function
typealias AsyncAwaitThrowingResolve<ObjectType, Context, Arguments, FieldType> = (ObjectType) -> (Context, Arguments) async throws -> FieldType
convenience init<ResolveType>(
_ name: String,
at function: @escaping AsyncAwaitResolve<ObjectType, Context, Arguments, ResolveType>,
as: FieldType.Type,
@ArgumentComponentBuilder<Arguments> _ argument: () -> [ArgumentComponent<Arguments>]
) {
let resolve: AsyncResolve<ObjectType, Context, Arguments, FieldType> = { type in
{ context, arguments, eventLoopGroup in
eventLoopGroup.task { try await function(type)(context, arguments) }
}
}
self.init(name, at: resolve, argument)
}
convenience init<ResolveType>(
_ name: String,
at function: @escaping AsyncAwaitResolve<ObjectType, Context, Arguments, ResolveType>,
as: FieldType.Type,
) where Arguments == NoArguments {
let resolve: AsyncResolve<ObjectType, Context, Arguments, FieldType> = { type in
{ context, arguments, eventLoopGroup in
eventLoopGroup.task { try await function(type)(context, arguments) }
}
}
self.init(name, at: resolve, {})
}
/// Async-await non-throwing GraphQL resolver function
typealias AsyncAwaitResolveWithEventLoop<ObjectType, Context, Arguments, FieldType> = (ObjectType) -> (Context, Arguments, EventLoopGroup) async -> FieldType
convenience init<ResolveType>(
_ name: String,
at function: @escaping AsyncAwaitResolve<ObjectType, Context, Arguments, ResolveType>,
as: FieldType.Type,
@ArgumentComponentBuilder<Arguments> _ argument: () -> [ArgumentComponent<Arguments>]
) {
let resolve: AsyncResolve<ObjectType, Context, Arguments, FieldType> = { type in
{ context, arguments, eventLoopGroup in
eventLoopGroup.task {
await function(type)(context, arguments, eventLoopGroup)
}
}
}
self.init(name, at: resolve, argument)
}
convenience init<ResolveType>(
_ name: String,
at function: @escaping AsyncAwaitResolve<ObjectType, Context, Arguments, ResolveType>,
as: FieldType.Type,
) where Arguments == NoArguments {
let resolve: AsyncResolve<ObjectType, Context, Arguments, FieldType> = { type in
{ context, arguments, eventLoopGroup in
eventLoopGroup.task {
await function(type)(context, arguments, eventLoopGroup)
}
}
}
self.init(name, at: resolve, {})
}
/// Async-await throwing GraphQL resolver function
typealias AsyncAwaitThrowingResolveWithEventLoop<ObjectType, Context, Arguments, FieldType> = (ObjectType) -> (Context, Arguments, EventLoopGroup) async throws -> FieldType
convenience init<ResolveType>(
_ name: String,
at function: @escaping AsyncAwaitResolve<ObjectType, Context, Arguments, ResolveType>,
as: FieldType.Type,
@ArgumentComponentBuilder<Arguments> _ argument: () -> [ArgumentComponent<Arguments>]
) {
let resolve: AsyncResolve<ObjectType, Context, Arguments, FieldType> = { type in
{ context, arguments, eventLoopGroup in
eventLoopGroup.task {
try await function(type)(context, arguments, eventLoopGroup)
}
}
}
self.init(name, at: resolve, argument)
}
convenience init<ResolveType>(
_ name: String,
at function: @escaping AsyncAwaitResolve<ObjectType, Context, Arguments, ResolveType>,
as: FieldType.Type,
) where Arguments == NoArguments {
let resolve: AsyncResolve<ObjectType, Context, Arguments, FieldType> = { type in
{ context, arguments, eventLoopGroup in
eventLoopGroup.task {
try await function(type)(context, arguments, eventLoopGroup)
}
}
}
self.init(name, at: resolve, {})
}
}