diff --git a/Sources/Graphiti/API/API.swift b/Sources/Graphiti/API/API.swift index 4071882a..60352758 100644 --- a/Sources/Graphiti/API/API.swift +++ b/Sources/Graphiti/API/API.swift @@ -28,6 +28,21 @@ public extension API { ) } + func execute( + request: GraphQLRequest, + context: ContextType, + on eventLoopGroup: EventLoopGroup, + validationRules: [(ValidationContext) -> Visitor] = [] + ) -> EventLoopFuture { + return execute(request: request.query, + context: context, + on: eventLoopGroup, + variables: request.variables, + operationName: request.operationName, + validationRules: validationRules + ) + } + func subscribe( request: String, context: ContextType, @@ -46,6 +61,22 @@ public extension API { validationRules: validationRules ) } + + func subscribe( + request: GraphQLRequest, + context: ContextType, + on eventLoopGroup: EventLoopGroup, + validationRules: [(ValidationContext) -> Visitor] = [] + ) -> EventLoopFuture { + return subscribe( + request: request.query, + context: context, + on: eventLoopGroup, + variables: request.variables, + operationName: request.operationName, + validationRules: validationRules + ) + } } #if compiler(>=5.5) && canImport(_Concurrency) @@ -71,6 +102,23 @@ public extension API { ).get() } + @available(macOS 10.15, iOS 15, watchOS 8, tvOS 15, *) + func execute( + request: GraphQLRequest, + context: ContextType, + on eventLoopGroup: EventLoopGroup, + validationRules: [(ValidationContext) -> Visitor] = [] + ) async throws -> GraphQLResult { + return try await execute( + request: request.query, + context: context, + on: eventLoopGroup, + variables: request.variables, + operationName: request.operationName, + validationRules: validationRules + ) + } + @available(macOS 10.15, iOS 15, watchOS 8, tvOS 15, *) func subscribe( request: String, @@ -90,6 +138,23 @@ public extension API { validationRules: validationRules ).get() } + + @available(macOS 10.15, iOS 15, watchOS 8, tvOS 15, *) + func subscribe( + request: GraphQLRequest, + context: ContextType, + on eventLoopGroup: EventLoopGroup, + validationRules: [(ValidationContext) -> Visitor] = [] + ) async throws -> SubscriptionResult { + return try await subscribe( + request: request.query, + context: context, + on: eventLoopGroup, + variables: request.variables, + operationName: request.operationName, + validationRules: validationRules + ) + } } #endif diff --git a/Tests/GraphitiTests/HelloWorldTests/HelloWorldTests.swift b/Tests/GraphitiTests/HelloWorldTests/HelloWorldTests.swift index adb4a6f9..576b5ddb 100644 --- a/Tests/GraphitiTests/HelloWorldTests/HelloWorldTests.swift +++ b/Tests/GraphitiTests/HelloWorldTests/HelloWorldTests.swift @@ -343,6 +343,40 @@ class HelloWorldTests: XCTestCase { wait(for: [expectation], timeout: 10) } + func testInputRequest() throws { + let mutation = """ + mutation addUser($user: UserInput!) { + addUser(user: $user) { + id, + name + } + } + """ + let variables: [String: Map] = ["user": ["id": "123", "name": "bob"]] + + let request = GraphQLRequest( + query: mutation, + variables: variables + ) + + let expected = GraphQLResult( + data: ["addUser": ["id": "123", "name": "bob"]] + ) + + let expectation = XCTestExpectation() + + api.execute( + request: request, + context: api.context, + on: group + ).whenSuccess { result in + XCTAssertEqual(result, expected) + expectation.fulfill() + } + + wait(for: [expectation], timeout: 10) + } + func testInputRecursive() throws { let mutation = """ mutation addUser($user: UserInput!) {