aboutsummaryrefslogtreecommitdiff
path: root/Sources/LichessClient/Generated/Client.swift
diff options
context:
space:
mode:
Diffstat (limited to 'Sources/LichessClient/Generated/Client.swift')
-rw-r--r--Sources/LichessClient/Generated/Client.swift14299
1 files changed, 14299 insertions, 0 deletions
diff --git a/Sources/LichessClient/Generated/Client.swift b/Sources/LichessClient/Generated/Client.swift
new file mode 100644
index 0000000..520c266
--- /dev/null
+++ b/Sources/LichessClient/Generated/Client.swift
@@ -0,0 +1,14299 @@
+// Generated by swift-openapi-generator, do not modify.
+@_spi(Generated) import OpenAPIRuntime
+#if os(Linux)
+@preconcurrency import struct Foundation.URL
+@preconcurrency import struct Foundation.Data
+@preconcurrency import struct Foundation.Date
+#else
+import struct Foundation.URL
+import struct Foundation.Data
+import struct Foundation.Date
+#endif
+import HTTPTypes
+/// # Introduction
+/// Welcome to the reference for the Lichess API! Lichess is free/libre,
+/// open-source chess server powered by volunteers and donations.
+/// - Get help in the [Lichess Discord channel](https://discord.gg/lichess)
+/// - API demo app with OAuth2 login and gameplay: [source](https://github.com/lichess-org/api-demo) / [demo](https://lichess-org.github.io/api-demo/)
+/// - API UI app with OAuth2 login and endpoint forms: [source](https://github.com/lichess-org/api-ui) / [website](https://lichess.org/api/ui)
+/// - [Contribute to this documentation on Github](https://github.com/lichess-org/api)
+/// - Check out [Lichess widgets to embed in your website](https://lichess.org/developers)
+/// - [Download all Lichess rated games](https://database.lichess.org/)
+/// - [Download all Lichess puzzles with themes, ratings and votes](https://database.lichess.org/#puzzles)
+/// - [Download all evaluated positions](https://database.lichess.org/#evals)
+///
+/// ## Endpoint
+/// All requests go to `https://lichess.org` (unless otherwise specified).
+///
+/// ## Clients
+/// - [Python general API](https://github.com/lichess-org/berserk)
+/// - [MicroPython general API](https://github.com/mkomon/uberserk)
+/// - [Python general API - async](https://pypi.org/project/async-lichess-sdk)
+/// - [Python Lichess Bot](https://github.com/lichess-bot-devs/lichess-bot)
+/// - [Python Board API for Certabo](https://github.com/haklein/certabo-lichess)
+/// - [Java general API](https://github.com/tors42/chariot)
+/// - [JavaScript & TypeScript general API](https://github.com/devjiwonchoi/equine)
+///
+/// ## Rate limiting
+/// All requests are rate limited using various strategies,
+/// to ensure the API remains responsive for everyone.
+/// Only make one request at a time.
+/// If you receive an HTTP response with a [429 status](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#429),
+/// please wait a full minute before resuming API usage.
+///
+/// ## Streaming with ND-JSON
+/// Some API endpoints stream their responses as [Newline Delimited JSON a.k.a. **nd-json**](https://github.com/ndjson/ndjson-spec), with one JSON object per line.
+///
+/// Here's a [JavaScript utility function](https://gist.github.com/ornicar/a097406810939cf7be1df8ea30e94f3e) to help reading NDJSON streamed responses.
+///
+/// ## Authentication
+/// ### Which authentication method is right for me?
+/// [Read about the Lichess API authentication methods and code examples](https://github.com/lichess-org/api/blob/master/example/README.md)
+///
+/// ### Personal Access Token
+/// Personal API access tokens allow you to quickly interact with Lichess API without going through an OAuth flow.
+/// - [Generate a personal access token](https://lichess.org/account/oauth/token)
+/// - `curl https://lichess.org/api/account -H "Authorization: Bearer {token}"`
+/// - [NodeJS example](https://github.com/lichess-org/api/tree/master/example/oauth-personal-token)
+///
+/// ### Authorization Code Flow with PKCE
+/// The authorization code flow with PKCE allows your users to **login with Lichess**.
+/// Lichess supports unregistered and public clients (no client authentication, choose any unique client id).
+/// The only accepted code challenge method is `S256`.
+/// Access tokens are long-lived (expect one year), unless they are revoked.
+/// Refresh tokens are not supported.
+///
+/// See the [documentation for the OAuth endpoints](#tag/OAuth) or
+/// the [PKCE RFC](https://datatracker.ietf.org/doc/html/rfc7636#section-4) for a precise protocol description.
+///
+/// - [Demo app](https://lichess-org.github.io/api-demo/)
+/// - [Minimal client-side example](https://github.com/lichess-org/api/tree/master/example/oauth-app)
+/// - [Flask/Python example](https://github.com/lakinwecker/lichess-oauth-flask)
+/// - [Java example](https://github.com/tors42/lichess-oauth-pkce-app)
+/// - [NodeJS Passport strategy to login with Lichess OAuth2](https://www.npmjs.com/package/passport-lichess)
+///
+/// #### Real life examples
+/// - [PyChess](https://github.com/gbtami/pychess-variants) ([source code](https://github.com/gbtami/pychess-variants))
+/// - [Lichess4545](https://www.lichess4545.com/) ([source code](https://github.com/cyanfish/heltour))
+/// - [English Chess Federation](https://ecf.octoknight.com/)
+/// - [Rotherham Online Chess](https://rotherhamonlinechess.azurewebsites.net/tournaments)
+///
+/// ### Token format
+/// Access tokens and authorization codes match `^[A-Za-z0-9_]+$`.
+/// The length of tokens can be increased without notice. Make sure your application can handle at least 512 characters.
+/// By convention tokens have a recognizable prefix, but do not rely on this.
+///
+internal struct Client: APIProtocol {
+ /// The underlying HTTP client.
+ private let client: UniversalClient
+ /// Creates a new client.
+ /// - Parameters:
+ /// - serverURL: The server URL that the client connects to. Any server
+ /// URLs defined in the OpenAPI document are available as static methods
+ /// on the ``Servers`` type.
+ /// - configuration: A set of configuration values for the client.
+ /// - transport: A transport that performs HTTP operations.
+ /// - middlewares: A list of middlewares to call before the transport.
+ internal init(
+ serverURL: Foundation.URL,
+ configuration: Configuration = .init(),
+ transport: any ClientTransport,
+ middlewares: [any ClientMiddleware] = []
+ ) {
+ self.client = .init(
+ serverURL: serverURL,
+ configuration: configuration,
+ transport: transport,
+ middlewares: middlewares
+ )
+ }
+ private var converter: Converter {
+ client.converter
+ }
+ /// Get real-time users status
+ ///
+ /// Read the `online`, `playing` and `streaming` flags of several users.
+ /// This API is very fast and cheap on lichess side.
+ /// So you can call it quite often (like once every 5 seconds).
+ /// Use it to track players and know when they're connected on lichess and playing games.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/users/status`.
+ /// - Remark: Generated from `#/paths//api/users/status/get(apiUsersStatus)`.
+ internal func apiUsersStatus(_ input: Operations.apiUsersStatus.Input) async throws -> Operations.apiUsersStatus.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiUsersStatus.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/users/status",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "ids",
+ value: input.query.ids
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "withGameIds",
+ value: input.query.withGameIds
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiUsersStatus.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiUsersStatus.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Operations.apiUsersStatus.Output.Ok.Body.jsonPayload.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get all top 10
+ ///
+ /// Get the top 10 players for each speed and variant.
+ /// See <https://lichess.org/player>.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/player`.
+ /// - Remark: Generated from `#/paths//api/player/get(player)`.
+ internal func player(_ input: Operations.player.Input) async throws -> Operations.player.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.player.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/player",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.player.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.player.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Top10s.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get one leaderboard
+ ///
+ /// Get the leaderboard for a single speed or variant (a.k.a. `perfType`).
+ /// There is no leaderboard for correspondence or puzzles.
+ /// See <https://lichess.org/player/top/200/bullet>.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/player/top/{nb}/{perfType}`.
+ /// - Remark: Generated from `#/paths//api/player/top/{nb}/{perfType}/get(playerTopNbPerfType)`.
+ internal func playerTopNbPerfType(_ input: Operations.playerTopNbPerfType.Input) async throws -> Operations.playerTopNbPerfType.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.playerTopNbPerfType.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/player/top/{}/{}",
+ parameters: [
+ input.path.nb,
+ input.path.perfType
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.playerTopNbPerfType.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.playerTopNbPerfType.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/vnd.lichess.v3+json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/vnd.lichess.v3+json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Leaderboard.self,
+ from: responseBody,
+ transforming: { value in
+ .application_vnd_period_lichess_period_v3_plus_json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get user public data
+ ///
+ /// Read public data of a user.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/user/{username}`.
+ /// - Remark: Generated from `#/paths//api/user/{username}/get(apiUser)`.
+ internal func apiUser(_ input: Operations.apiUser.Input) async throws -> Operations.apiUser.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiUser.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/user/{}",
+ parameters: [
+ input.path.username
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "trophies",
+ value: input.query.trophies
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiUser.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiUser.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.UserExtended.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get rating history of a user
+ ///
+ /// Read rating history of a user, for all perf types.
+ /// There is at most one entry per day.
+ /// Format of an entry is `[year, month, day, rating]`.
+ /// `month` starts at zero (January).
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/user/{username}/rating-history`.
+ /// - Remark: Generated from `#/paths//api/user/{username}/rating-history/get(apiUserRatingHistory)`.
+ internal func apiUserRatingHistory(_ input: Operations.apiUserRatingHistory.Input) async throws -> Operations.apiUserRatingHistory.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiUserRatingHistory.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/user/{}/rating-history",
+ parameters: [
+ input.path.username
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiUserRatingHistory.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiUserRatingHistory.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.RatingHistory.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get performance statistics of a user
+ ///
+ /// Read performance statistics of a user, for a single performance.
+ /// Similar to the [performance pages on the website](https://lichess.org/@/thibault/perf/bullet).
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/user/{username}/perf/{perf}`.
+ /// - Remark: Generated from `#/paths//api/user/{username}/perf/{perf}/get(apiUserPerf)`.
+ internal func apiUserPerf(_ input: Operations.apiUserPerf.Input) async throws -> Operations.apiUserPerf.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiUserPerf.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/user/{}/perf/{}",
+ parameters: [
+ input.path.username,
+ input.path.perf
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiUserPerf.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiUserPerf.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.PerfStat.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get user activity
+ ///
+ /// Read data to generate the activity feed of a user.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/user/{username}/activity`.
+ /// - Remark: Generated from `#/paths//api/user/{username}/activity/get(apiUserActivity)`.
+ internal func apiUserActivity(_ input: Operations.apiUserActivity.Input) async throws -> Operations.apiUserActivity.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiUserActivity.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/user/{}/activity",
+ parameters: [
+ input.path.username
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiUserActivity.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiUserActivity.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ OpenAPIRuntime.OpenAPIValueContainer.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get the daily puzzle
+ ///
+ /// Get the daily Lichess puzzle in JSON format.
+ /// Alternatively, you can [post it in your slack workspace](https://lichess.org/daily-puzzle-slack).
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/puzzle/daily`.
+ /// - Remark: Generated from `#/paths//api/puzzle/daily/get(apiPuzzleDaily)`.
+ internal func apiPuzzleDaily(_ input: Operations.apiPuzzleDaily.Input) async throws -> Operations.apiPuzzleDaily.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiPuzzleDaily.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/puzzle/daily",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiPuzzleDaily.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiPuzzleDaily.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.PuzzleAndGame.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get a puzzle by its ID
+ ///
+ /// Get a single Lichess puzzle in JSON format.
+ ///
+ /// - Remark: HTTP `GET /api/puzzle/{id}`.
+ /// - Remark: Generated from `#/paths//api/puzzle/{id}/get(apiPuzzleId)`.
+ internal func apiPuzzleId(_ input: Operations.apiPuzzleId.Input) async throws -> Operations.apiPuzzleId.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiPuzzleId.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/puzzle/{}",
+ parameters: [
+ input.path.id
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiPuzzleId.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiPuzzleId.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.PuzzleAndGame.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get your puzzle activity
+ ///
+ /// Download your puzzle activity in [ndjson](#section/Introduction/Streaming-with-ND-JSON) format.
+ /// Puzzle activity is sorted by reverse chronological order (most recent first)
+ /// We recommend streaming the response, for it can be very long.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/puzzle/activity`.
+ /// - Remark: Generated from `#/paths//api/puzzle/activity/get(apiPuzzleActivity)`.
+ internal func apiPuzzleActivity(_ input: Operations.apiPuzzleActivity.Input) async throws -> Operations.apiPuzzleActivity.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiPuzzleActivity.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/puzzle/activity",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "max",
+ value: input.query.max
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "before",
+ value: input.query.before
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiPuzzleActivity.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiPuzzleActivity.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-ndjson"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-ndjson":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_ndjson(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get your puzzle dashboard
+ ///
+ /// Download your [puzzle dashboard](https://lichess.org/training/dashboard/30/dashboard) as JSON.
+ /// Also includes all puzzle themes played, with aggregated results.
+ /// Allows re-creating the [improvement/strengths](https://lichess.org/training/dashboard/30/improvementAreas) interfaces.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/puzzle/dashboard/{days}`.
+ /// - Remark: Generated from `#/paths//api/puzzle/dashboard/{days}/get(apiPuzzleDashboard)`.
+ internal func apiPuzzleDashboard(_ input: Operations.apiPuzzleDashboard.Input) async throws -> Operations.apiPuzzleDashboard.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiPuzzleDashboard.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/puzzle/dashboard/{}",
+ parameters: [
+ input.path.days
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiPuzzleDashboard.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiPuzzleDashboard.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.PuzzleDashboardJson.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get the storm dashboard of a player
+ ///
+ /// Download the [storm dashboard](https://lichess.org/storm/dashboard/mrbasso) of any player as JSON.
+ /// Contains the aggregated highscores, and the history of storm runs aggregated by days.
+ /// Use `?days=0` if you only care about the highscores.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/storm/dashboard/{username}`.
+ /// - Remark: Generated from `#/paths//api/storm/dashboard/{username}/get(apiStormDashboard)`.
+ internal func apiStormDashboard(_ input: Operations.apiStormDashboard.Input) async throws -> Operations.apiStormDashboard.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiStormDashboard.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/storm/dashboard/{}",
+ parameters: [
+ input.path.username
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "days",
+ value: input.query.days
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiStormDashboard.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiStormDashboard.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.StormDashboardJson.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Create and join a puzzle race
+ ///
+ /// Create a new private [puzzle race](https://lichess.org/racer).
+ /// The Lichess user who creates the race must join the race page,
+ /// and manually start the race when enough players have joined.
+ /// - <https://lichess.org/racer>
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/racer`.
+ /// - Remark: Generated from `#/paths//api/racer/post(racerPost)`.
+ internal func racerPost(_ input: Operations.racerPost.Input) async throws -> Operations.racerPost.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.racerPost.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/racer",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.racerPost.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.racerPost.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.PuzzleRaceJson.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get users by ID
+ ///
+ /// Get up to 300 users by their IDs. Users are returned in the same order as the IDs.
+ /// The method is `POST` to allow a longer list of IDs to be sent in the request body.
+ /// Please do not try to download all the Lichess users with this endpoint, or any other endpoint.
+ /// An API is not a way to fully export a website. We do not provide a full download of the Lichess users.
+ /// This endpoint is limited to 8,000 users every 10 minutes, and 120,000 every day.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/users`.
+ /// - Remark: Generated from `#/paths//api/users/post(apiUsers)`.
+ internal func apiUsers(_ input: Operations.apiUsers.Input) async throws -> Operations.apiUsers.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiUsers.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/users",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .plainText(value):
+ body = try converter.setRequiredRequestBodyAsBinary(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "text/plain"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiUsers.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiUsers.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ [Components.Schemas.User].self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get my profile
+ ///
+ /// Public information about the logged in user.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/account`.
+ /// - Remark: Generated from `#/paths//api/account/get(accountMe)`.
+ internal func accountMe(_ input: Operations.accountMe.Input) async throws -> Operations.accountMe.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.accountMe.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/account",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.accountMe.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.accountMe.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.UserExtended.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get my email address
+ ///
+ /// Read the email address of the logged in user.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/account/email`.
+ /// - Remark: Generated from `#/paths//api/account/email/get(accountEmail)`.
+ internal func accountEmail(_ input: Operations.accountEmail.Input) async throws -> Operations.accountEmail.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.accountEmail.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/account/email",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.accountEmail.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.accountEmail.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Operations.accountEmail.Output.Ok.Body.jsonPayload.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get my preferences
+ ///
+ /// Read the preferences of the logged in user.
+ /// - <https://lichess.org/account/preferences/game-display>
+ /// - <https://github.com/ornicar/lila/blob/master/modules/pref/src/main/Pref.scala>
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/account/preferences`.
+ /// - Remark: Generated from `#/paths//api/account/preferences/get(account)`.
+ internal func account(_ input: Operations.account.Input) async throws -> Operations.account.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.account.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/account/preferences",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.account.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.account.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Operations.account.Output.Ok.Body.jsonPayload.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get my kid mode status
+ ///
+ /// Read the kid mode status of the logged in user.
+ /// - <https://lichess.org/account/kid>
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/account/kid`.
+ /// - Remark: Generated from `#/paths//api/account/kid/get(accountKid)`.
+ internal func accountKid(_ input: Operations.accountKid.Input) async throws -> Operations.accountKid.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.accountKid.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/account/kid",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.accountKid.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.accountKid.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Operations.accountKid.Output.Ok.Body.jsonPayload.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Set my kid mode status
+ ///
+ /// Set the kid mode status of the logged in user.
+ /// - <https://lichess.org/account/kid>
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/account/kid`.
+ /// - Remark: Generated from `#/paths//api/account/kid/post(accountKidPost)`.
+ internal func accountKidPost(_ input: Operations.accountKidPost.Input) async throws -> Operations.accountKidPost.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.accountKidPost.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/account/kid",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "v",
+ value: input.query.v
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.accountKidPost.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.accountKidPost.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get my timeline
+ ///
+ /// Get the timeline events of the logged in user.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/timeline`.
+ /// - Remark: Generated from `#/paths//api/timeline/get(timeline)`.
+ internal func timeline(_ input: Operations.timeline.Input) async throws -> Operations.timeline.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.timeline.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/timeline",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "since",
+ value: input.query.since
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "nb",
+ value: input.query.nb
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.timeline.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.timeline.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Timeline.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Export one game
+ ///
+ /// Download one game in either PGN or JSON format.
+ /// Ongoing games are delayed by a few seconds ranging from 3 to 60 depending on the time control, as to prevent cheat bots from using this API.
+ ///
+ ///
+ /// - Remark: HTTP `GET /game/export/{gameId}`.
+ /// - Remark: Generated from `#/paths//game/export/{gameId}/get(gamePgn)`.
+ internal func gamePgn(_ input: Operations.gamePgn.Input) async throws -> Operations.gamePgn.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.gamePgn.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/game/export/{}",
+ parameters: [
+ input.path.gameId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "moves",
+ value: input.query.moves
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "pgnInJson",
+ value: input.query.pgnInJson
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "tags",
+ value: input.query.tags
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "clocks",
+ value: input.query.clocks
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "evals",
+ value: input.query.evals
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "accuracy",
+ value: input.query.accuracy
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "opening",
+ value: input.query.opening
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "division",
+ value: input.query.division
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "literate",
+ value: input.query.literate
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "players",
+ value: input.query.players
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.gamePgn.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.gamePgn.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-chess-pgn",
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-chess-pgn":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_chess_hyphen_pgn(value)
+ }
+ )
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.GameJson.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Export ongoing game of a user
+ ///
+ /// Download the ongoing game, or the last game played, of a user.
+ /// Available in either PGN or JSON format.
+ /// Ongoing games are delayed by a few seconds ranging from 3 to 60 depending on the time control, as to prevent cheat bots from using this API.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/user/{username}/current-game`.
+ /// - Remark: Generated from `#/paths//api/user/{username}/current-game/get(apiUserCurrentGame)`.
+ internal func apiUserCurrentGame(_ input: Operations.apiUserCurrentGame.Input) async throws -> Operations.apiUserCurrentGame.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiUserCurrentGame.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/user/{}/current-game",
+ parameters: [
+ input.path.username
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "moves",
+ value: input.query.moves
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "pgnInJson",
+ value: input.query.pgnInJson
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "tags",
+ value: input.query.tags
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "clocks",
+ value: input.query.clocks
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "evals",
+ value: input.query.evals
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "accuracy",
+ value: input.query.accuracy
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "opening",
+ value: input.query.opening
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "division",
+ value: input.query.division
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "literate",
+ value: input.query.literate
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "players",
+ value: input.query.players
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiUserCurrentGame.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiUserCurrentGame.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-chess-pgn",
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-chess-pgn":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_chess_hyphen_pgn(value)
+ }
+ )
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.GameJson.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Export games of a user
+ ///
+ /// Download all games of any user in PGN or [ndjson](#section/Introduction/Streaming-with-ND-JSON) format.
+ /// Games are sorted by reverse chronological order (most recent first).
+ /// We recommend streaming the response, for it can be very long.
+ /// <https://lichess.org/@/german11> for instance has more than 500,000 games.
+ /// The game stream is throttled, depending on who is making the request:
+ /// - Anonymous request: 20 games per second
+ /// - [OAuth2 authenticated](#section/Introduction/Authentication) request: 30 games per second
+ /// - Authenticated, downloading your own games: 60 games per second
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/games/user/{username}`.
+ /// - Remark: Generated from `#/paths//api/games/user/{username}/get(apiGamesUser)`.
+ internal func apiGamesUser(_ input: Operations.apiGamesUser.Input) async throws -> Operations.apiGamesUser.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiGamesUser.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/games/user/{}",
+ parameters: [
+ input.path.username
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "since",
+ value: input.query.since
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "until",
+ value: input.query.until
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "max",
+ value: input.query.max
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "vs",
+ value: input.query.vs
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "rated",
+ value: input.query.rated
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "perfType",
+ value: input.query.perfType
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "color",
+ value: input.query.color
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "analysed",
+ value: input.query.analysed
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "moves",
+ value: input.query.moves
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "pgnInJson",
+ value: input.query.pgnInJson
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "tags",
+ value: input.query.tags
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "clocks",
+ value: input.query.clocks
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "evals",
+ value: input.query.evals
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "accuracy",
+ value: input.query.accuracy
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "opening",
+ value: input.query.opening
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "division",
+ value: input.query.division
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "ongoing",
+ value: input.query.ongoing
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "finished",
+ value: input.query.finished
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "literate",
+ value: input.query.literate
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "lastFen",
+ value: input.query.lastFen
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "players",
+ value: input.query.players
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "sort",
+ value: input.query.sort
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiGamesUser.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiGamesUser.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-chess-pgn",
+ "application/x-ndjson"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-chess-pgn":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_chess_hyphen_pgn(value)
+ }
+ )
+ case "application/x-ndjson":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_ndjson(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Export games by IDs
+ ///
+ /// Download games by IDs in PGN or [ndjson](#section/Introduction/Streaming-with-ND-JSON) format, depending on the request `Accept` header.
+ /// Games are sorted by reverse chronological order (most recent first)
+ /// The method is `POST` so a longer list of IDs can be sent in the request body.
+ /// 300 IDs can be submitted.
+ /// Ongoing games are delayed by a few seconds ranging from 3 to 60 depending on the time control, as to prevent cheat bots from using this API.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/games/export/_ids`.
+ /// - Remark: Generated from `#/paths//api/games/export/_ids/post(gamesExportIds)`.
+ internal func gamesExportIds(_ input: Operations.gamesExportIds.Input) async throws -> Operations.gamesExportIds.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.gamesExportIds.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/games/export/_ids",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "moves",
+ value: input.query.moves
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "pgnInJson",
+ value: input.query.pgnInJson
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "tags",
+ value: input.query.tags
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "clocks",
+ value: input.query.clocks
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "evals",
+ value: input.query.evals
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "accuracy",
+ value: input.query.accuracy
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "opening",
+ value: input.query.opening
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "division",
+ value: input.query.division
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "literate",
+ value: input.query.literate
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "players",
+ value: input.query.players
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .plainText(value):
+ body = try converter.setRequiredRequestBodyAsBinary(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "text/plain"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.gamesExportIds.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.gamesExportIds.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-chess-pgn",
+ "application/x-ndjson"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-chess-pgn":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_chess_hyphen_pgn(value)
+ }
+ )
+ case "application/x-ndjson":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_ndjson(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Stream games of users
+ ///
+ /// Stream the games played between a list of users, in real time.
+ /// Only games where **both players** are part of the list are included.
+ /// The stream emits an event each time a game is started or finished.
+ /// To also get all current ongoing games at the beginning of the stream, use the `withCurrentGames` flag.
+ /// Games are streamed as [ndjson](#section/Introduction/Streaming-with-ND-JSON).
+ /// Maximum number of users: 300.
+ /// The method is `POST` so a longer list of IDs can be sent in the request body.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/stream/games-by-users`.
+ /// - Remark: Generated from `#/paths//api/stream/games-by-users/post(gamesByUsers)`.
+ internal func gamesByUsers(_ input: Operations.gamesByUsers.Input) async throws -> Operations.gamesByUsers.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.gamesByUsers.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/stream/games-by-users",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "withCurrentGames",
+ value: input.query.withCurrentGames
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .plainText(value):
+ body = try converter.setRequiredRequestBodyAsBinary(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "text/plain"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.gamesByUsers.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.gamesByUsers.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-ndjson"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-ndjson":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_ndjson(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Stream games by IDs
+ ///
+ /// Creates a stream of games from an arbitrary streamId, and a list of game IDs.
+ /// The stream first outputs the games that already exists, then emits an event each time a game is started or finished.
+ /// Games are streamed as [ndjson](#section/Introduction/Streaming-with-ND-JSON).
+ /// Maximum number of games: 500 for anonymous requests, or 1000 for [OAuth2 authenticated](#section/Introduction/Authentication) requests.
+ /// While the stream is open, it is possible to [add new game IDs to watch](#operation/gamesByIdsAdd).
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/stream/games/{streamId}`.
+ /// - Remark: Generated from `#/paths//api/stream/games/{streamId}/post(gamesByIds)`.
+ internal func gamesByIds(_ input: Operations.gamesByIds.Input) async throws -> Operations.gamesByIds.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.gamesByIds.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/stream/games/{}",
+ parameters: [
+ input.path.streamId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .plainText(value):
+ body = try converter.setRequiredRequestBodyAsBinary(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "text/plain"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.gamesByIds.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.gamesByIds.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-ndjson"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-ndjson":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_ndjson(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Add game IDs to stream
+ ///
+ /// Add new game IDs for [an existing stream](#operation/gamesByIds) to watch.
+ /// The stream will immediately outputs the games that already exists, then emit an event each time a game is started or finished.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/stream/games/{streamId}/add`.
+ /// - Remark: Generated from `#/paths//api/stream/games/{streamId}/add/post(gamesByIdsAdd)`.
+ internal func gamesByIdsAdd(_ input: Operations.gamesByIdsAdd.Input) async throws -> Operations.gamesByIdsAdd.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.gamesByIdsAdd.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/stream/games/{}/add",
+ parameters: [
+ input.path.streamId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .plainText(value):
+ body = try converter.setRequiredRequestBodyAsBinary(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "text/plain"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.gamesByIdsAdd.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.gamesByIdsAdd.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get my ongoing games
+ ///
+ /// Get the ongoing games of the current user.
+ /// Real-time and correspondence games are included.
+ /// The most urgent games are listed first.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/account/playing`.
+ /// - Remark: Generated from `#/paths//api/account/playing/get(apiAccountPlaying)`.
+ internal func apiAccountPlaying(_ input: Operations.apiAccountPlaying.Input) async throws -> Operations.apiAccountPlaying.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiAccountPlaying.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/account/playing",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "nb",
+ value: input.query.nb
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiAccountPlaying.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiAccountPlaying.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ OpenAPIRuntime.OpenAPIValueContainer.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Stream moves of a game
+ ///
+ /// Stream positions and moves of any ongoing game, in [ndjson](#section/Introduction/Streaming-with-ND-JSON).
+ /// A description of the game is sent as a first message.
+ /// Then a message is sent each time a move is played.
+ /// Finally a description of the game is sent when it finishes, and the stream is closed.
+ /// Ongoing games are delayed by a few seconds ranging from 3 to 60 depending on the time control, as to prevent cheat bots from using this API.
+ /// No more than 8 game streams can be opened at the same time from the same IP address.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/stream/game/{id}`.
+ /// - Remark: Generated from `#/paths//api/stream/game/{id}/get(streamGame)`.
+ internal func streamGame(_ input: Operations.streamGame.Input) async throws -> Operations.streamGame.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.streamGame.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/stream/game/{}",
+ parameters: [
+ input.path.id
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.streamGame.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-ndjson"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-ndjson":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_ndjson(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Import one game
+ ///
+ /// Import a game from PGN. See <https://lichess.org/paste>.
+ /// Rate limiting: 200 games per hour for OAuth requests, 100 games per hour for anonymous requests.
+ /// To broadcast ongoing games, consider [pushing to a broadcast instead](#operation/broadcastPush).
+ /// To analyse a position or a line, just construct an analysis board URL:
+ /// [https://lichess.org/analysis/pgn/e4_e5_Nf3_Nc6_Bc4_Bc5_Bxf7+](https://lichess.org/analysis/pgn/e4_e5_Nf3_Nc6_Bc4_Bc5_Bxf7+)
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/import`.
+ /// - Remark: Generated from `#/paths//api/import/post(gameImport)`.
+ internal func gameImport(_ input: Operations.gameImport.Input) async throws -> Operations.gameImport.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.gameImport.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/import",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .urlEncodedForm(value):
+ body = try converter.setRequiredRequestBodyAsURLEncodedForm(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/x-www-form-urlencoded"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.gameImport.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.gameImport.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ OpenAPIRuntime.OpenAPIValueContainer.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Export your imported games
+ ///
+ /// Download all games imported by you. Games are exported in PGN format.
+ ///
+ /// - Remark: HTTP `GET /api/games/export/imports`.
+ /// - Remark: Generated from `#/paths//api/games/export/imports/get(apiImportedGamesUser)`.
+ internal func apiImportedGamesUser(_ input: Operations.apiImportedGamesUser.Input) async throws -> Operations.apiImportedGamesUser.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiImportedGamesUser.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/games/export/imports",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiImportedGamesUser.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiImportedGamesUser.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-chess-pgn"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-chess-pgn":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_chess_hyphen_pgn(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get current TV games
+ ///
+ /// Get basic info about the best games being played for each speed and variant,
+ /// but also computer games and bot games.
+ /// See [lichess.org/tv](https://lichess.org/tv).
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/tv/channels`.
+ /// - Remark: Generated from `#/paths//api/tv/channels/get(tvChannels)`.
+ internal func tvChannels(_ input: Operations.tvChannels.Input) async throws -> Operations.tvChannels.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.tvChannels.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/tv/channels",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.tvChannels.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.tvChannels.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ OpenAPIRuntime.OpenAPIValueContainer.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Stream current TV game
+ ///
+ /// Stream positions and moves of the current [TV game](https://lichess.org/tv) in [ndjson](#section/Introduction/Streaming-with-ND-JSON).
+ /// A summary of the game is sent as a first message, and when the featured game changes.
+ /// Try it with `curl https://lichess.org/api/tv/feed`.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/tv/feed`.
+ /// - Remark: Generated from `#/paths//api/tv/feed/get(tvFeed)`.
+ internal func tvFeed(_ input: Operations.tvFeed.Input) async throws -> Operations.tvFeed.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.tvFeed.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/tv/feed",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.tvFeed.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-ndjson"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-ndjson":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_ndjson(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Stream current TV game of a TV channel
+ ///
+ /// Stream positions and moves of the current [TV game](https://lichess.org/tv) of a TV channel in [ndjson](#section/Introduction/Streaming-with-ND-JSON).
+ /// A summary of the game is sent as a first message, and when the featured game changes.
+ /// Try it with `curl https://lichess.org/api/tv/rapid/feed`.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/tv/{channel}/feed`.
+ /// - Remark: Generated from `#/paths//api/tv/{channel}/feed/get(tvChannelFeed)`.
+ internal func tvChannelFeed(_ input: Operations.tvChannelFeed.Input) async throws -> Operations.tvChannelFeed.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.tvChannelFeed.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/tv/{}/feed",
+ parameters: [
+ input.path.channel
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.tvChannelFeed.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-ndjson"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-ndjson":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_ndjson(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get best ongoing games of a TV channel
+ ///
+ /// Get a list of ongoing games for a given TV channel. Similar to [lichess.org/games](https://lichess.org/games).
+ /// Available in PGN or [ndjson](#section/Introduction/Streaming-with-ND-JSON) format, depending on the request `Accept` header.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/tv/{channel}`.
+ /// - Remark: Generated from `#/paths//api/tv/{channel}/get(tvChannelGames)`.
+ internal func tvChannelGames(_ input: Operations.tvChannelGames.Input) async throws -> Operations.tvChannelGames.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.tvChannelGames.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/tv/{}",
+ parameters: [
+ input.path.channel
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "nb",
+ value: input.query.nb
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "moves",
+ value: input.query.moves
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "pgnInJson",
+ value: input.query.pgnInJson
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "tags",
+ value: input.query.tags
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "clocks",
+ value: input.query.clocks
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "opening",
+ value: input.query.opening
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.tvChannelGames.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-chess-pgn",
+ "application/x-ndjson"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-chess-pgn":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_chess_hyphen_pgn(value)
+ }
+ )
+ case "application/x-ndjson":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_ndjson(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get current tournaments
+ ///
+ /// Get recently finished, ongoing, and upcoming tournaments.
+ /// This API is used to display the [Lichess tournament schedule](https://lichess.org/tournament).
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/tournament`.
+ /// - Remark: Generated from `#/paths//api/tournament/get(apiTournament)`.
+ internal func apiTournament(_ input: Operations.apiTournament.Input) async throws -> Operations.apiTournament.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiTournament.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/tournament",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiTournament.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiTournament.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.ArenaTournaments.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Create a new Arena tournament
+ ///
+ /// Create a public or private Arena tournament.
+ /// This endpoint mirrors the form on <https://lichess.org/tournament/new>.
+ /// You can create up to 12 public tournaments per day, or 24 private tournaments.
+ /// A team battle can be created by specifying the `teamBattleByTeam` argument.
+ /// Additional restrictions:
+ /// - clockTime + clockIncrement > 0
+ /// - 15s and 0+1 variant tournaments cannot be rated
+ /// - Clock time in comparison to tournament length must be reasonable: 3 <= (minutes * 60) / (96 * clockTime + 48 * clockIncrement + 15) <= 150
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/tournament`.
+ /// - Remark: Generated from `#/paths//api/tournament/post(apiTournamentPost)`.
+ internal func apiTournamentPost(_ input: Operations.apiTournamentPost.Input) async throws -> Operations.apiTournamentPost.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiTournamentPost.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/tournament",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .urlEncodedForm(value):
+ body = try converter.setRequiredRequestBodyAsURLEncodedForm(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/x-www-form-urlencoded"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiTournamentPost.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiTournamentPost.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.ArenaTournamentVariantIsKey.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiTournamentPost.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get info about an Arena tournament
+ ///
+ /// Get detailed info about recently finished, current, or upcoming tournament's duels, player standings, and other info.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/tournament/{id}`.
+ /// - Remark: Generated from `#/paths//api/tournament/{id}/get(tournament)`.
+ internal func tournament(_ input: Operations.tournament.Input) async throws -> Operations.tournament.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.tournament.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/tournament/{}",
+ parameters: [
+ input.path.id
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "page",
+ value: input.query.page
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.tournament.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.tournament.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.ArenaTournamentVariantIsKey.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Update an Arena tournament
+ ///
+ /// Update an Arena tournament.
+ /// Be mindful not to make important changes to ongoing tournaments.
+ /// Can be used to update a team battle.
+ /// Additional restrictions:
+ /// - clockTime + clockIncrement > 0
+ /// - 15s and 0+1 variant tournaments cannot be rated
+ /// - Clock time in comparison to tournament length must be reasonable: 3 <= (minutes * 60) / (96 * clockTime + 48 * clockIncrement + 15) <= 150
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/tournament/{id}`.
+ /// - Remark: Generated from `#/paths//api/tournament/{id}/post(apiTournamentUpdate)`.
+ internal func apiTournamentUpdate(_ input: Operations.apiTournamentUpdate.Input) async throws -> Operations.apiTournamentUpdate.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiTournamentUpdate.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/tournament/{}",
+ parameters: [
+ input.path.id
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .urlEncodedForm(value):
+ body = try converter.setRequiredRequestBodyAsURLEncodedForm(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/x-www-form-urlencoded"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiTournamentUpdate.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiTournamentUpdate.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.ArenaTournamentVariantIsKey.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiTournamentUpdate.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Join an Arena tournament
+ ///
+ /// Join an Arena tournament, possibly with a password and/or a team.
+ /// Also unpauses if you had previously [paused](#operation/apiTournamentWithdraw) the tournament.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/tournament/{id}/join`.
+ /// - Remark: Generated from `#/paths//api/tournament/{id}/join/post(apiTournamentJoin)`.
+ internal func apiTournamentJoin(_ input: Operations.apiTournamentJoin.Input) async throws -> Operations.apiTournamentJoin.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiTournamentJoin.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/tournament/{}/join",
+ parameters: [
+ input.path.id
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .urlEncodedForm(value):
+ body = try converter.setRequiredRequestBodyAsURLEncodedForm(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/x-www-form-urlencoded"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiTournamentJoin.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiTournamentJoin.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiTournamentJoin.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Pause or leave an Arena tournament
+ ///
+ /// Leave a future Arena tournament, or take a break on an ongoing Arena tournament.
+ /// It's possible to join again later. Points and streaks are preserved.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/tournament/{id}/withdraw`.
+ /// - Remark: Generated from `#/paths//api/tournament/{id}/withdraw/post(apiTournamentWithdraw)`.
+ internal func apiTournamentWithdraw(_ input: Operations.apiTournamentWithdraw.Input) async throws -> Operations.apiTournamentWithdraw.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiTournamentWithdraw.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/tournament/{}/withdraw",
+ parameters: [
+ input.path.id
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiTournamentWithdraw.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiTournamentWithdraw.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiTournamentWithdraw.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Terminate an Arena tournament
+ ///
+ /// Terminate an Arena tournament
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/tournament/{id}/terminate`.
+ /// - Remark: Generated from `#/paths//api/tournament/{id}/terminate/post(apiTournamentTerminate)`.
+ internal func apiTournamentTerminate(_ input: Operations.apiTournamentTerminate.Input) async throws -> Operations.apiTournamentTerminate.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiTournamentTerminate.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/tournament/{}/terminate",
+ parameters: [
+ input.path.id
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiTournamentTerminate.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiTournamentTerminate.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiTournamentTerminate.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Update a team battle
+ ///
+ /// Set the teams and number of leaders of a team battle.
+ /// To update the other attributes of a team battle, use the [tournament update endpoint](#operation/apiTournamentUpdate).
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/tournament/team-battle/{id}`.
+ /// - Remark: Generated from `#/paths//api/tournament/team-battle/{id}/post(apiTournamentTeamBattlePost)`.
+ internal func apiTournamentTeamBattlePost(_ input: Operations.apiTournamentTeamBattlePost.Input) async throws -> Operations.apiTournamentTeamBattlePost.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiTournamentTeamBattlePost.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/tournament/team-battle/{}",
+ parameters: [
+ input.path.id
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .urlEncodedForm(value):
+ body = try converter.setRequiredRequestBodyAsURLEncodedForm(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/x-www-form-urlencoded"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiTournamentTeamBattlePost.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiTournamentTeamBattlePost.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.ArenaTournamentVariantIsKey.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiTournamentTeamBattlePost.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Export games of an Arena tournament
+ ///
+ /// Download games of a tournament in PGN or [ndjson](#section/Introduction/Streaming-with-ND-JSON) format.
+ /// Games are sorted by reverse chronological order (most recent first).
+ /// The game stream is throttled, depending on who is making the request:
+ /// - Anonymous request: 20 games per second
+ /// - [OAuth2 authenticated](#section/Introduction/Authentication) request: 30 games per second
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/tournament/{id}/games`.
+ /// - Remark: Generated from `#/paths//api/tournament/{id}/games/get(gamesByTournament)`.
+ internal func gamesByTournament(_ input: Operations.gamesByTournament.Input) async throws -> Operations.gamesByTournament.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.gamesByTournament.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/tournament/{}/games",
+ parameters: [
+ input.path.id
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "player",
+ value: input.query.player
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "moves",
+ value: input.query.moves
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "pgnInJson",
+ value: input.query.pgnInJson
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "tags",
+ value: input.query.tags
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "clocks",
+ value: input.query.clocks
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "evals",
+ value: input.query.evals
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "accuracy",
+ value: input.query.accuracy
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "opening",
+ value: input.query.opening
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "division",
+ value: input.query.division
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.gamesByTournament.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.gamesByTournament.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-chess-pgn",
+ "application/x-ndjson"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-chess-pgn":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_chess_hyphen_pgn(value)
+ }
+ )
+ case "application/x-ndjson":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_ndjson(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get results of an Arena tournament
+ ///
+ /// Players of an Arena tournament, with their score and performance, sorted by rank (best first).
+ /// **Players are streamed as [ndjson](#section/Introduction/Streaming-with-ND-JSON)**, i.e. one JSON object per line.
+ /// If called on an ongoing tournament, results can be inconsistent
+ /// due to ranking changes while the players are being streamed.
+ /// Use on finished tournaments for guaranteed consistency.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/tournament/{id}/results`.
+ /// - Remark: Generated from `#/paths//api/tournament/{id}/results/get(resultsByTournament)`.
+ internal func resultsByTournament(_ input: Operations.resultsByTournament.Input) async throws -> Operations.resultsByTournament.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.resultsByTournament.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/tournament/{}/results",
+ parameters: [
+ input.path.id
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "nb",
+ value: input.query.nb
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "sheet",
+ value: input.query.sheet
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.resultsByTournament.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.resultsByTournament.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-ndjson"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-ndjson":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_ndjson(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get team standing of a team battle
+ ///
+ /// Teams of a team battle tournament, with top players, sorted by rank (best first).
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/tournament/{id}/teams`.
+ /// - Remark: Generated from `#/paths//api/tournament/{id}/teams/get(teamsByTournament)`.
+ internal func teamsByTournament(_ input: Operations.teamsByTournament.Input) async throws -> Operations.teamsByTournament.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.teamsByTournament.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/tournament/{}/teams",
+ parameters: [
+ input.path.id
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.teamsByTournament.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.teamsByTournament.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ OpenAPIRuntime.OpenAPIValueContainer.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get tournaments created by a user
+ ///
+ /// Get all tournaments created by a given user.
+ /// Tournaments are sorted by reverse chronological order of start date (last starting first).
+ /// Tournaments are streamed as [ndjson](#section/Introduction/Streaming-with-ND-JSON).
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/user/{username}/tournament/created`.
+ /// - Remark: Generated from `#/paths//api/user/{username}/tournament/created/get(apiUserNameTournamentCreated)`.
+ internal func apiUserNameTournamentCreated(_ input: Operations.apiUserNameTournamentCreated.Input) async throws -> Operations.apiUserNameTournamentCreated.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiUserNameTournamentCreated.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/user/{}/tournament/created",
+ parameters: [
+ input.path.username
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "status",
+ value: input.query.status
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiUserNameTournamentCreated.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiUserNameTournamentCreated.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-ndjson"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-ndjson":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_ndjson(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Create a new Swiss tournament
+ ///
+ /// Create a Swiss tournament for your team.
+ /// This endpoint mirrors the Swiss tournament form from your team pagee.
+ /// You can create up to 12 tournaments per day.
+ /// Additional restrictions:
+ /// - clock.limit + clock.increment > 0
+ /// - 15s and 0+1 variant tournaments cannot be rated
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/swiss/new/{teamId}`.
+ /// - Remark: Generated from `#/paths//api/swiss/new/{teamId}/post(apiSwissNew)`.
+ internal func apiSwissNew(_ input: Operations.apiSwissNew.Input) async throws -> Operations.apiSwissNew.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiSwissNew.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/swiss/new/{}",
+ parameters: [
+ input.path.teamId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .urlEncodedForm(value):
+ body = try converter.setRequiredRequestBodyAsURLEncodedForm(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/x-www-form-urlencoded"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiSwissNew.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiSwissNew.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.SwissTournament.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiSwissNew.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get info about a Swiss tournament
+ ///
+ /// Get detailed info about a Swiss tournament.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/swiss/{id}`.
+ /// - Remark: Generated from `#/paths//api/swiss/{id}/get(swiss)`.
+ internal func swiss(_ input: Operations.swiss.Input) async throws -> Operations.swiss.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.swiss.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/swiss/{}",
+ parameters: [
+ input.path.id
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.swiss.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.swiss.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.SwissTournament.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Update a Swiss tournament
+ ///
+ /// Update a Swiss tournament.
+ /// Be mindful not to make important changes to ongoing tournaments.
+ /// Additional restrictions:
+ /// - clock.limit + clock.increment > 0
+ /// - 15s and 0+1 variant tournaments cannot be rated
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/swiss/{id}/edit`.
+ /// - Remark: Generated from `#/paths//api/swiss/{id}/edit/post(apiSwissUpdate)`.
+ internal func apiSwissUpdate(_ input: Operations.apiSwissUpdate.Input) async throws -> Operations.apiSwissUpdate.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiSwissUpdate.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/swiss/{}/edit",
+ parameters: [
+ input.path.id
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .urlEncodedForm(value):
+ body = try converter.setRequiredRequestBodyAsURLEncodedForm(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/x-www-form-urlencoded"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiSwissUpdate.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiSwissUpdate.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.SwissTournament.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiSwissUpdate.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ case 401:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiSwissUpdate.Output.Unauthorized.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.SwissUnauthorisedEdit.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .unauthorized(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Manually schedule the next round
+ ///
+ /// Manually schedule the next round date and time of a Swiss tournament.
+ /// This sets the `roundInterval` field to `99999999`, i.e. manual scheduling.
+ /// All further rounds will need to be manually scheduled, unless the `roundInterval` field is changed back to automatic scheduling.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/swiss/{id}/schedule-next-round`.
+ /// - Remark: Generated from `#/paths//api/swiss/{id}/schedule-next-round/post(apiSwissScheduleNextRound)`.
+ internal func apiSwissScheduleNextRound(_ input: Operations.apiSwissScheduleNextRound.Input) async throws -> Operations.apiSwissScheduleNextRound.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiSwissScheduleNextRound.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/swiss/{}/schedule-next-round",
+ parameters: [
+ input.path.id
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .urlEncodedForm(value):
+ body = try converter.setRequiredRequestBodyAsURLEncodedForm(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/x-www-form-urlencoded"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 204:
+ let headers: Operations.apiSwissScheduleNextRound.Output.NoContent.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ return .noContent(.init(headers: headers))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiSwissScheduleNextRound.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ case 401:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiSwissScheduleNextRound.Output.Unauthorized.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.SwissUnauthorisedEdit.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .unauthorized(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Join a Swiss tournament
+ ///
+ /// Join a Swiss tournament, possibly with a password.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/swiss/{id}/join`.
+ /// - Remark: Generated from `#/paths//api/swiss/{id}/join/post(apiSwissJoin)`.
+ internal func apiSwissJoin(_ input: Operations.apiSwissJoin.Input) async throws -> Operations.apiSwissJoin.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiSwissJoin.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/swiss/{}/join",
+ parameters: [
+ input.path.id
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .urlEncodedForm(value):
+ body = try converter.setRequiredRequestBodyAsURLEncodedForm(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/x-www-form-urlencoded"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiSwissJoin.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiSwissJoin.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiSwissJoin.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Pause or leave a swiss tournament
+ ///
+ /// Leave a future Swiss tournament, or take a break on an ongoing Swiss tournament.
+ /// It's possible to join again later. Points are preserved.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/swiss/{id}/withdraw`.
+ /// - Remark: Generated from `#/paths//api/swiss/{id}/withdraw/post(apiSwissWithdraw)`.
+ internal func apiSwissWithdraw(_ input: Operations.apiSwissWithdraw.Input) async throws -> Operations.apiSwissWithdraw.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiSwissWithdraw.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/swiss/{}/withdraw",
+ parameters: [
+ input.path.id
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiSwissWithdraw.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiSwissWithdraw.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Terminate a Swiss tournament
+ ///
+ /// Terminate a Swiss tournament
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/swiss/{id}/terminate`.
+ /// - Remark: Generated from `#/paths//api/swiss/{id}/terminate/post(apiSwissTerminate)`.
+ internal func apiSwissTerminate(_ input: Operations.apiSwissTerminate.Input) async throws -> Operations.apiSwissTerminate.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiSwissTerminate.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/swiss/{}/terminate",
+ parameters: [
+ input.path.id
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiSwissTerminate.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiSwissTerminate.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiSwissTerminate.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Export TRF of a Swiss tournament
+ ///
+ /// Download a tournament in the Tournament Report File format, the FIDE standard.
+ /// Documentation: <https://www.fide.com/FIDE/handbook/C04Annex2_TRF16.pdf>
+ /// Example: <https://lichess.org/swiss/j8rtJ5GL.trf>
+ ///
+ ///
+ /// - Remark: HTTP `GET /swiss/{id}.trf`.
+ /// - Remark: Generated from `#/paths//swiss/{id}.trf/get(swissTrf)`.
+ internal func swissTrf(_ input: Operations.swissTrf.Input) async throws -> Operations.swissTrf.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.swissTrf.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/swiss/{}.trf",
+ parameters: [
+ input.path.id
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.swissTrf.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.swissTrf.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "text/plain"
+ ]
+ )
+ switch chosenContentType {
+ case "text/plain":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .plainText(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Export games of a Swiss tournament
+ ///
+ /// Download games of a swiss tournament in PGN or [ndjson](#section/Introduction/Streaming-with-ND-JSON) format.
+ /// Games are sorted by reverse chronological order (last round first).
+ /// The game stream is throttled, depending on who is making the request:
+ /// - Anonymous request: 20 games per second
+ /// - [OAuth2 authenticated](#section/Introduction/Authentication) request: 30 games per second
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/swiss/{id}/games`.
+ /// - Remark: Generated from `#/paths//api/swiss/{id}/games/get(gamesBySwiss)`.
+ internal func gamesBySwiss(_ input: Operations.gamesBySwiss.Input) async throws -> Operations.gamesBySwiss.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.gamesBySwiss.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/swiss/{}/games",
+ parameters: [
+ input.path.id
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "player",
+ value: input.query.player
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "moves",
+ value: input.query.moves
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "pgnInJson",
+ value: input.query.pgnInJson
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "tags",
+ value: input.query.tags
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "clocks",
+ value: input.query.clocks
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "evals",
+ value: input.query.evals
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "accuracy",
+ value: input.query.accuracy
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "opening",
+ value: input.query.opening
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "division",
+ value: input.query.division
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.gamesBySwiss.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.gamesBySwiss.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-chess-pgn",
+ "application/x-ndjson"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-chess-pgn":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_chess_hyphen_pgn(value)
+ }
+ )
+ case "application/x-ndjson":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_ndjson(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get results of a swiss tournament
+ ///
+ /// Players of a swiss tournament, with their score and performance, sorted by rank (best first).
+ /// Players are streamed as [ndjson](#section/Introduction/Streaming-with-ND-JSON).
+ /// If called on an ongoing tournament, results can be inconsistent
+ /// due to ranking changes while the players are being streamed.
+ /// Use on finished tournaments for guaranteed consistency.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/swiss/{id}/results`.
+ /// - Remark: Generated from `#/paths//api/swiss/{id}/results/get(resultsBySwiss)`.
+ internal func resultsBySwiss(_ input: Operations.resultsBySwiss.Input) async throws -> Operations.resultsBySwiss.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.resultsBySwiss.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/swiss/{}/results",
+ parameters: [
+ input.path.id
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "nb",
+ value: input.query.nb
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.resultsBySwiss.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.resultsBySwiss.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-ndjson"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-ndjson":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_ndjson(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get team swiss tournaments
+ ///
+ /// Get all swiss tournaments of a team.
+ /// Tournaments are sorted by reverse chronological order of start date (last starting first).
+ /// Tournaments are streamed as [ndjson](#section/Introduction/Streaming-with-ND-JSON).
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/team/{teamId}/swiss`.
+ /// - Remark: Generated from `#/paths//api/team/{teamId}/swiss/get(apiTeamSwiss)`.
+ internal func apiTeamSwiss(_ input: Operations.apiTeamSwiss.Input) async throws -> Operations.apiTeamSwiss.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiTeamSwiss.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/team/{}/swiss",
+ parameters: [
+ input.path.teamId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "max",
+ value: input.query.max
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiTeamSwiss.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiTeamSwiss.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/nd-json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/nd-json":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_nd_hyphen_json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Export one study chapter
+ ///
+ /// Download one study chapter in PGN format.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/study/{studyId}/{chapterId}.pgn`.
+ /// - Remark: Generated from `#/paths//api/study/{studyId}/{chapterId}.pgn/get(studyChapterPgn)`.
+ internal func studyChapterPgn(_ input: Operations.studyChapterPgn.Input) async throws -> Operations.studyChapterPgn.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.studyChapterPgn.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/study/{}/{}.pgn",
+ parameters: [
+ input.path.studyId,
+ input.path.chapterId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "clocks",
+ value: input.query.clocks
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "comments",
+ value: input.query.comments
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "variations",
+ value: input.query.variations
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "source",
+ value: input.query.source
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "orientation",
+ value: input.query.orientation
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.studyChapterPgn.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-chess-pgn"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-chess-pgn":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_chess_hyphen_pgn(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Export all chapters
+ ///
+ /// Download all chapters of a study in PGN format.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/study/{studyId}.pgn`.
+ /// - Remark: Generated from `#/paths//api/study/{studyId}.pgn/get(studyAllChaptersPgn)`.
+ internal func studyAllChaptersPgn(_ input: Operations.studyAllChaptersPgn.Input) async throws -> Operations.studyAllChaptersPgn.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.studyAllChaptersPgn.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/study/{}.pgn",
+ parameters: [
+ input.path.studyId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "clocks",
+ value: input.query.clocks
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "comments",
+ value: input.query.comments
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "variations",
+ value: input.query.variations
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "source",
+ value: input.query.source
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "orientation",
+ value: input.query.orientation
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.studyAllChaptersPgn.Output.Ok.Headers = .init(
+ Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ),
+ Last_hyphen_Modified: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Last-Modified",
+ as: Swift.String.self
+ )
+ )
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.studyAllChaptersPgn.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-chess-pgn"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-chess-pgn":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_chess_hyphen_pgn(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Study metadata
+ ///
+ /// Only get the study headers, including `Last-Modified`.
+ ///
+ ///
+ /// - Remark: HTTP `HEAD /api/study/{studyId}.pgn`.
+ /// - Remark: Generated from `#/paths//api/study/{studyId}.pgn/head(studyAllChaptersHead)`.
+ internal func studyAllChaptersHead(_ input: Operations.studyAllChaptersHead.Input) async throws -> Operations.studyAllChaptersHead.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.studyAllChaptersHead.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/study/{}.pgn",
+ parameters: [
+ input.path.studyId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .head
+ )
+ suppressMutabilityWarning(&request)
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.studyAllChaptersHead.Output.Ok.Headers = .init(
+ Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ),
+ Last_hyphen_Modified: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Last-Modified",
+ as: Swift.String.self
+ )
+ )
+ return .ok(.init(headers: headers))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Import PGN into a study
+ ///
+ /// Imports arbitrary PGN into an existing [study](https://lichess.org/study). Creates a new chapter in the study.
+ /// If the PGN contains multiple games (separated by 2 or more newlines)
+ /// then multiple chapters will be created within the study.
+ /// Note that a study can contain at most 64 chapters.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/study/{studyId}/import-pgn`.
+ /// - Remark: Generated from `#/paths//api/study/{studyId}/import-pgn/post(apiStudyImportPGN)`.
+ internal func apiStudyImportPGN(_ input: Operations.apiStudyImportPGN.Input) async throws -> Operations.apiStudyImportPGN.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiStudyImportPGN.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/study/{}/import-pgn",
+ parameters: [
+ input.path.studyId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .urlEncodedForm(value):
+ body = try converter.setRequiredRequestBodyAsURLEncodedForm(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/x-www-form-urlencoded"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiStudyImportPGN.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiStudyImportPGN.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.StudyImportPgnChapters.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiStudyImportPGN.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Export all studies of a user
+ ///
+ /// Download all chapters of all studies of a user in PGN format.
+ /// If authenticated, then all public, unlisted, and private studies are included.
+ /// If not, only public (non-unlisted) studies are included.
+ ///
+ ///
+ /// - Remark: HTTP `GET /study/by/{username}/export.pgn`.
+ /// - Remark: Generated from `#/paths//study/by/{username}/export.pgn/get(studyExportAllPgn)`.
+ internal func studyExportAllPgn(_ input: Operations.studyExportAllPgn.Input) async throws -> Operations.studyExportAllPgn.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.studyExportAllPgn.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/study/by/{}/export.pgn",
+ parameters: [
+ input.path.username
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "clocks",
+ value: input.query.clocks
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "comments",
+ value: input.query.comments
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "variations",
+ value: input.query.variations
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "source",
+ value: input.query.source
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "orientation",
+ value: input.query.orientation
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.studyExportAllPgn.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-chess-pgn"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-chess-pgn":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_chess_hyphen_pgn(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// List studies of a user
+ ///
+ /// Get metadata (name and dates) of all studies of a user.
+ /// If authenticated, then all public, unlisted, and private studies are included.
+ /// If not, only public (non-unlisted) studies are included.
+ /// Studies are streamed as [ndjson](#section/Introduction/Streaming-with-ND-JSON).
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/study/by/{username}`.
+ /// - Remark: Generated from `#/paths//api/study/by/{username}/get(studyListMetadata)`.
+ internal func studyListMetadata(_ input: Operations.studyListMetadata.Input) async throws -> Operations.studyListMetadata.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.studyListMetadata.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/study/by/{}",
+ parameters: [
+ input.path.username
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.studyListMetadata.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.studyListMetadata.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-ndjson"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-ndjson":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_ndjson(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Delete a study chapter
+ ///
+ /// Delete a chapter of a study you own. This is definitive.
+ /// A study must have at least one chapter; so if you delete the last chapter,
+ /// an empty one will be automatically created to replace it.
+ ///
+ ///
+ /// - Remark: HTTP `DELETE /api/study/{studyId}/{chapterId}`.
+ /// - Remark: Generated from `#/paths//api/study/{studyId}/{chapterId}/delete(apiStudyStudyIdChapterIdDelete)`.
+ internal func apiStudyStudyIdChapterIdDelete(_ input: Operations.apiStudyStudyIdChapterIdDelete.Input) async throws -> Operations.apiStudyStudyIdChapterIdDelete.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiStudyStudyIdChapterIdDelete.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/study/{}/{}",
+ parameters: [
+ input.path.studyId,
+ input.path.chapterId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .delete
+ )
+ suppressMutabilityWarning(&request)
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 204:
+ let headers: Operations.apiStudyStudyIdChapterIdDelete.Output.NoContent.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ return .noContent(.init(headers: headers))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get official broadcasts
+ ///
+ /// Get all incoming, ongoing, and finished official broadcasts.
+ /// The broadcasts are sorted by start date, most recent first.
+ /// Broadcasts are streamed as [ndjson](#section/Introduction/Streaming-with-ND-JSON).
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/broadcast`.
+ /// - Remark: Generated from `#/paths//api/broadcast/get(broadcastIndex)`.
+ internal func broadcastIndex(_ input: Operations.broadcastIndex.Input) async throws -> Operations.broadcastIndex.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.broadcastIndex.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/broadcast",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "nb",
+ value: input.query.nb
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.broadcastIndex.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.broadcastIndex.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-ndjson"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-ndjson":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_ndjson(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Create a broadcast tournament
+ ///
+ /// Create a new broadcast tournament to relay external games.
+ /// This endpoint accepts the same form data as the [web form](https://lichess.org/broadcast/new).
+ ///
+ ///
+ /// - Remark: HTTP `POST /broadcast/new`.
+ /// - Remark: Generated from `#/paths//broadcast/new/post(broadcastTourCreate)`.
+ internal func broadcastTourCreate(_ input: Operations.broadcastTourCreate.Input) async throws -> Operations.broadcastTourCreate.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.broadcastTourCreate.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/broadcast/new",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .urlEncodedForm(value):
+ body = try converter.setRequiredRequestBodyAsURLEncodedForm(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/x-www-form-urlencoded"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.broadcastTourCreate.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.broadcastTourCreate.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.BroadcastTour.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.broadcastTourCreate.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get a broadcast tournament
+ ///
+ /// Get information about a broadcast tournament.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/broadcast/{broadcastTournamentId}`.
+ /// - Remark: Generated from `#/paths//api/broadcast/{broadcastTournamentId}/get(broadcastTourGet)`.
+ internal func broadcastTourGet(_ input: Operations.broadcastTourGet.Input) async throws -> Operations.broadcastTourGet.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.broadcastTourGet.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/broadcast/{}",
+ parameters: [
+ input.path.broadcastTournamentId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.broadcastTourGet.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.BroadcastTour.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get a broadcast leaderboard
+ ///
+ /// Get the leaderboard of a broadcast tournament, if available.
+ ///
+ ///
+ /// - Remark: HTTP `GET /broadcast/{broadcastTournamentId}/leaderboard`.
+ /// - Remark: Generated from `#/paths//broadcast/{broadcastTournamentId}/leaderboard/get(broadcastLeaderboardGet)`.
+ internal func broadcastLeaderboardGet(_ input: Operations.broadcastLeaderboardGet.Input) async throws -> Operations.broadcastLeaderboardGet.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.broadcastLeaderboardGet.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/broadcast/{}/leaderboard",
+ parameters: [
+ input.path.broadcastTournamentId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.broadcastLeaderboardGet.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ [Components.Schemas.BroadcastLeaderboardEntry].self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Update your broadcast tournament
+ ///
+ /// Update information about a broadcast tournament that you created.
+ /// This endpoint accepts the same form data as the web form.
+ /// All fields must be populated with data. Missing fields will override the broadcast with empty data.
+ ///
+ ///
+ /// - Remark: HTTP `POST /broadcast/{broadcastTournamentId}/edit`.
+ /// - Remark: Generated from `#/paths//broadcast/{broadcastTournamentId}/edit/post(broadcastTourUpdate)`.
+ internal func broadcastTourUpdate(_ input: Operations.broadcastTourUpdate.Input) async throws -> Operations.broadcastTourUpdate.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.broadcastTourUpdate.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/broadcast/{}/edit",
+ parameters: [
+ input.path.broadcastTournamentId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .urlEncodedForm(value):
+ body = try converter.setRequiredRequestBodyAsURLEncodedForm(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/x-www-form-urlencoded"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.broadcastTourUpdate.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.broadcastTourUpdate.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.broadcastTourUpdate.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Create a broadcast round
+ ///
+ /// Create a new broadcast round to relay external games.
+ /// This endpoint accepts the same form data as the web form.
+ ///
+ ///
+ /// - Remark: HTTP `POST /broadcast/{broadcastTournamentId}/new`.
+ /// - Remark: Generated from `#/paths//broadcast/{broadcastTournamentId}/new/post(broadcastRoundCreate)`.
+ internal func broadcastRoundCreate(_ input: Operations.broadcastRoundCreate.Input) async throws -> Operations.broadcastRoundCreate.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.broadcastRoundCreate.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/broadcast/{}/new",
+ parameters: [
+ input.path.broadcastTournamentId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .urlEncodedForm(value):
+ body = try converter.setRequiredRequestBodyAsURLEncodedForm(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/x-www-form-urlencoded"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.broadcastRoundCreate.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.broadcastRoundCreate.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.BroadcastRound.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.broadcastRoundCreate.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get a broadcast round
+ ///
+ /// Get information about a broadcast round.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/broadcast/{broadcastTournamentSlug}/{broadcastRoundSlug}/{broadcastRoundId}`.
+ /// - Remark: Generated from `#/paths//api/broadcast/{broadcastTournamentSlug}/{broadcastRoundSlug}/{broadcastRoundId}/get(broadcastRoundGet)`.
+ internal func broadcastRoundGet(_ input: Operations.broadcastRoundGet.Input) async throws -> Operations.broadcastRoundGet.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.broadcastRoundGet.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/broadcast/{}/{}/{}",
+ parameters: [
+ input.path.broadcastTournamentSlug,
+ input.path.broadcastRoundSlug,
+ input.path.broadcastRoundId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.broadcastRoundGet.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.BroadcastRound.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Update your broadcast round
+ ///
+ /// Update information about a broadcast round that you created.
+ /// This endpoint accepts the same form data as the web form.
+ /// All fields must be populated with data. Missing fields will override the broadcast with empty data.
+ /// For instance, if you omit `startDate`, then any pre-existing start date will be removed.
+ ///
+ ///
+ /// - Remark: HTTP `POST /broadcast/round/{broadcastRoundId}/edit`.
+ /// - Remark: Generated from `#/paths//broadcast/round/{broadcastRoundId}/edit/post(broadcastRoundUpdate)`.
+ internal func broadcastRoundUpdate(_ input: Operations.broadcastRoundUpdate.Input) async throws -> Operations.broadcastRoundUpdate.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.broadcastRoundUpdate.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/broadcast/round/{}/edit",
+ parameters: [
+ input.path.broadcastRoundId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .urlEncodedForm(value):
+ body = try converter.setRequiredRequestBodyAsURLEncodedForm(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/x-www-form-urlencoded"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.broadcastRoundUpdate.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.broadcastRoundUpdate.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.broadcastRoundUpdate.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Push PGN to your broadcast round
+ ///
+ /// Update your broadcast with new PGN.
+ /// Only for broadcast without a source URL.
+ ///
+ ///
+ /// - Remark: HTTP `POST /broadcast/round/{broadcastRoundId}/push`.
+ /// - Remark: Generated from `#/paths//broadcast/round/{broadcastRoundId}/push/post(broadcastPush)`.
+ internal func broadcastPush(_ input: Operations.broadcastPush.Input) async throws -> Operations.broadcastPush.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.broadcastPush.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/broadcast/round/{}/push",
+ parameters: [
+ input.path.broadcastRoundId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .plainText(value):
+ body = try converter.setRequiredRequestBodyAsBinary(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "text/plain"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.broadcastPush.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.broadcastPush.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.BroadcastPgnPush.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let headers: Operations.broadcastPush.Output.BadRequest.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.broadcastPush.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Operations.broadcastPush.Output.BadRequest.Body.jsonPayload.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Stream an ongoing broadcast tournament as PGN
+ ///
+ /// This streaming endpoint first sends all games of a broadcast tournament in PGN format.
+ /// Then, it waits for new moves to be played. As soon as it happens, the entire PGN of the game is sent to the stream.
+ /// The stream will also send PGNs when games are added to the tournament.
+ /// This is the best way to get updates about an ongoing tournament. Streaming means no polling,
+ /// and no pollings means no latency, and minimum impact on the server.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/stream/broadcast/round/{broadcastRoundId}.pgn`.
+ /// - Remark: Generated from `#/paths//api/stream/broadcast/round/{broadcastRoundId}.pgn/get(broadcastStreamRoundPgn)`.
+ internal func broadcastStreamRoundPgn(_ input: Operations.broadcastStreamRoundPgn.Input) async throws -> Operations.broadcastStreamRoundPgn.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.broadcastStreamRoundPgn.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/stream/broadcast/round/{}.pgn",
+ parameters: [
+ input.path.broadcastRoundId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.broadcastStreamRoundPgn.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.broadcastStreamRoundPgn.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-chess-pgn"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-chess-pgn":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_chess_hyphen_pgn(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Export one round as PGN
+ ///
+ /// Download all games of a single round of a broadcast tournament in PGN format.
+ /// You *could* poll this endpoint to get updates about a tournament, but it would be slow,
+ /// and very inefficient.
+ /// Instead, consider [streaming the tournament](#operation/broadcastStreamRoundPgn) to get
+ /// a new PGN every time a game is updated, in real-time.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/broadcast/round/{broadcastRoundId}.pgn`.
+ /// - Remark: Generated from `#/paths//api/broadcast/round/{broadcastRoundId}.pgn/get(broadcastRoundPgn)`.
+ internal func broadcastRoundPgn(_ input: Operations.broadcastRoundPgn.Input) async throws -> Operations.broadcastRoundPgn.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.broadcastRoundPgn.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/broadcast/round/{}.pgn",
+ parameters: [
+ input.path.broadcastRoundId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.broadcastRoundPgn.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.broadcastRoundPgn.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-chess-pgn"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-chess-pgn":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_chess_hyphen_pgn(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Export all rounds as PGN
+ ///
+ /// Download all games of all rounds of a broadcast in PGN format.
+ /// If a `study:read` [OAuth token](#tag/OAuth) is provided,
+ /// the private rounds where the user is a contributor will be available.
+ /// You may want to [download only the games of a single round](#operation/broadcastRoundPgn) instead.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/broadcast/{broadcastTournamentId}.pgn`.
+ /// - Remark: Generated from `#/paths//api/broadcast/{broadcastTournamentId}.pgn/get(broadcastAllRoundsPgn)`.
+ internal func broadcastAllRoundsPgn(_ input: Operations.broadcastAllRoundsPgn.Input) async throws -> Operations.broadcastAllRoundsPgn.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.broadcastAllRoundsPgn.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/broadcast/{}.pgn",
+ parameters: [
+ input.path.broadcastTournamentId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.broadcastAllRoundsPgn.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.broadcastAllRoundsPgn.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-chess-pgn"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-chess-pgn":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_chess_hyphen_pgn(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get your broadcast rounds
+ ///
+ /// Stream all broadcast rounds you are a member of.
+ /// Also includes broadcasts rounds you did not create, but were invited to.
+ /// Also includes broadcasts rounds where you're a non-writing member. See the `writeable` flag in the response.
+ /// Rounds are ordered by rank, which is roughly chronological, most recent first, slightly pondered with popularity.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/broadcast/my-rounds`.
+ /// - Remark: Generated from `#/paths//api/broadcast/my-rounds/get(broadcastMyRoundsGet)`.
+ internal func broadcastMyRoundsGet(_ input: Operations.broadcastMyRoundsGet.Input) async throws -> Operations.broadcastMyRoundsGet.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.broadcastMyRoundsGet.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/broadcast/my-rounds",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "nb",
+ value: input.query.nb
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.broadcastMyRoundsGet.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.BroadcastMyRound.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get current simuls
+ ///
+ /// Get recently created, started, finished, simuls.
+ /// Created and finished simul lists are not exhaustives, only those with
+ /// strong enough host will be listed, the same filter is used to display simuls on https://lichess.org/simul.
+ /// When [authenticated with OAuth2](#section/Introduction/Authentication), the pending list will be populated with your created, but unstarted simuls.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/simul`.
+ /// - Remark: Generated from `#/paths//api/simul/get(apiSimul)`.
+ internal func apiSimul(_ input: Operations.apiSimul.Input) async throws -> Operations.apiSimul.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiSimul.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/simul",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiSimul.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiSimul.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Operations.apiSimul.Output.Ok.Body.jsonPayload.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get a single team
+ ///
+ /// Public info about a team. Includes the list of publicly visible leaders.
+ ///
+ /// - Remark: HTTP `GET /api/team/{teamId}`.
+ /// - Remark: Generated from `#/paths//api/team/{teamId}/get(teamShow)`.
+ internal func teamShow(_ input: Operations.teamShow.Input) async throws -> Operations.teamShow.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.teamShow.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/team/{}",
+ parameters: [
+ input.path.teamId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.teamShow.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.teamShow.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Team.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get popular teams
+ ///
+ /// Paginator of the most popular teams.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/team/all`.
+ /// - Remark: Generated from `#/paths//api/team/all/get(teamAll)`.
+ internal func teamAll(_ input: Operations.teamAll.Input) async throws -> Operations.teamAll.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.teamAll.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/team/all",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "page",
+ value: input.query.page
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.teamAll.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.teamAll.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.TeamPaginatorJson.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Teams of a player
+ ///
+ /// All the teams a player is a member of.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/team/of/{username}`.
+ /// - Remark: Generated from `#/paths//api/team/of/{username}/get(teamOfUsername)`.
+ internal func teamOfUsername(_ input: Operations.teamOfUsername.Input) async throws -> Operations.teamOfUsername.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.teamOfUsername.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/team/of/{}",
+ parameters: [
+ input.path.username
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.teamOfUsername.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.teamOfUsername.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ [Components.Schemas.Team].self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Search teams
+ ///
+ /// Paginator of team search results for a keyword.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/team/search`.
+ /// - Remark: Generated from `#/paths//api/team/search/get(teamSearch)`.
+ internal func teamSearch(_ input: Operations.teamSearch.Input) async throws -> Operations.teamSearch.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.teamSearch.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/team/search",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "text",
+ value: input.query.text
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "page",
+ value: input.query.page
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.teamSearch.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.teamSearch.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.TeamPaginatorJson.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get members of a team
+ ///
+ /// Members are sorted by reverse chronological order of joining the team (most recent first).
+ /// OAuth is only required if the list of members is private.
+ /// Members are streamed as [ndjson](#section/Introduction/Streaming-with-ND-JSON).
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/team/{teamId}/users`.
+ /// - Remark: Generated from `#/paths//api/team/{teamId}/users/get(teamIdUsers)`.
+ internal func teamIdUsers(_ input: Operations.teamIdUsers.Input) async throws -> Operations.teamIdUsers.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.teamIdUsers.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/team/{}/users",
+ parameters: [
+ input.path.teamId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.teamIdUsers.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.teamIdUsers.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-ndjson"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-ndjson":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_ndjson(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get team Arena tournaments
+ ///
+ /// Get all Arena tournaments relevant to a team.
+ /// Tournaments are sorted by reverse chronological order of start date (last starting first).
+ /// Tournaments are streamed as [ndjson](#section/Introduction/Streaming-with-ND-JSON).
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/team/{teamId}/arena`.
+ /// - Remark: Generated from `#/paths//api/team/{teamId}/arena/get(apiTeamArena)`.
+ internal func apiTeamArena(_ input: Operations.apiTeamArena.Input) async throws -> Operations.apiTeamArena.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiTeamArena.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/team/{}/arena",
+ parameters: [
+ input.path.teamId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "max",
+ value: input.query.max
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiTeamArena.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiTeamArena.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-ndjson"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-ndjson":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_ndjson(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Join a team
+ ///
+ /// Join a team.
+ /// If the team requires a password but the `password` field is incorrect,
+ /// then the call fails with `403 Forbidden`.
+ /// Similarly, if the team join policy requires a confirmation but the
+ /// `message` parameter is not given, then the call fails with
+ /// `403 Forbidden`.
+ ///
+ ///
+ /// - Remark: HTTP `POST /team/{teamId}/join`.
+ /// - Remark: Generated from `#/paths//team/{teamId}/join/post(teamIdJoin)`.
+ internal func teamIdJoin(_ input: Operations.teamIdJoin.Input) async throws -> Operations.teamIdJoin.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.teamIdJoin.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/team/{}/join",
+ parameters: [
+ input.path.teamId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .urlEncodedForm(value):
+ body = try converter.setRequiredRequestBodyAsURLEncodedForm(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/x-www-form-urlencoded"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.teamIdJoin.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Leave a team
+ ///
+ /// Leave a team.
+ /// - <https://lichess.org/team>
+ ///
+ ///
+ /// - Remark: HTTP `POST /team/{teamId}/quit`.
+ /// - Remark: Generated from `#/paths//team/{teamId}/quit/post(teamIdQuit)`.
+ internal func teamIdQuit(_ input: Operations.teamIdQuit.Input) async throws -> Operations.teamIdQuit.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.teamIdQuit.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/team/{}/quit",
+ parameters: [
+ input.path.teamId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.teamIdQuit.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get join requests
+ ///
+ /// Get pending join requests of your team
+ ///
+ /// - Remark: HTTP `GET /api/team/{teamId}/requests`.
+ /// - Remark: Generated from `#/paths//api/team/{teamId}/requests/get(teamRequests)`.
+ internal func teamRequests(_ input: Operations.teamRequests.Input) async throws -> Operations.teamRequests.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.teamRequests.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/team/{}/requests",
+ parameters: [
+ input.path.teamId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "declined",
+ value: input.query.declined
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.teamRequests.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ [Components.Schemas.TeamRequestWithUser].self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Accept join request
+ ///
+ /// Accept someone's request to join your team
+ ///
+ /// - Remark: HTTP `POST /api/team/{teamId}/request/{userId}/accept`.
+ /// - Remark: Generated from `#/paths//api/team/{teamId}/request/{userId}/accept/post(teamRequestAccept)`.
+ internal func teamRequestAccept(_ input: Operations.teamRequestAccept.Input) async throws -> Operations.teamRequestAccept.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.teamRequestAccept.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/team/{}/request/{}/accept",
+ parameters: [
+ input.path.teamId,
+ input.path.userId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.teamRequestAccept.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Decline join request
+ ///
+ /// Decline someone's request to join your team
+ ///
+ /// - Remark: HTTP `POST /api/team/{teamId}/request/{userId}/decline`.
+ /// - Remark: Generated from `#/paths//api/team/{teamId}/request/{userId}/decline/post(teamRequestDecline)`.
+ internal func teamRequestDecline(_ input: Operations.teamRequestDecline.Input) async throws -> Operations.teamRequestDecline.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.teamRequestDecline.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/team/{}/request/{}/decline",
+ parameters: [
+ input.path.teamId,
+ input.path.userId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.teamRequestDecline.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Kick a user from your team
+ ///
+ /// Kick a member out of one of your teams.
+ /// - <https://lichess.org/team>
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/team/{teamId}/kick/{userId}`.
+ /// - Remark: Generated from `#/paths//api/team/{teamId}/kick/{userId}/post(teamIdKickUserId)`.
+ internal func teamIdKickUserId(_ input: Operations.teamIdKickUserId.Input) async throws -> Operations.teamIdKickUserId.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.teamIdKickUserId.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/team/{}/kick/{}",
+ parameters: [
+ input.path.teamId,
+ input.path.userId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.teamIdKickUserId.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Message all members
+ ///
+ /// Send a private message to all members of a team.
+ /// You must be a team leader with the "Messages" permission.
+ ///
+ ///
+ /// - Remark: HTTP `POST /team/{teamId}/pm-all`.
+ /// - Remark: Generated from `#/paths//team/{teamId}/pm-all/post(teamIdPmAll)`.
+ internal func teamIdPmAll(_ input: Operations.teamIdPmAll.Input) async throws -> Operations.teamIdPmAll.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.teamIdPmAll.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/team/{}/pm-all",
+ parameters: [
+ input.path.teamId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .urlEncodedForm(value):
+ body = try converter.setRequiredRequestBodyAsURLEncodedForm(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/x-www-form-urlencoded"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.teamIdPmAll.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.teamIdPmAll.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.teamIdPmAll.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get live streamers
+ ///
+ /// Get basic info about currently streaming users.
+ /// This API is very fast and cheap on lichess side.
+ /// So you can call it quite often (like once every 5 seconds).
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/streamer/live`.
+ /// - Remark: Generated from `#/paths//api/streamer/live/get(streamerLive)`.
+ internal func streamerLive(_ input: Operations.streamerLive.Input) async throws -> Operations.streamerLive.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.streamerLive.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/streamer/live",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.streamerLive.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.streamerLive.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ [Components.Schemas.LightUser].self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get crosstable
+ ///
+ /// Get total number of games, and current score, of any two users.
+ /// If the `matchup` flag is provided, and the users are currently playing, also gets the current match game number and scores.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/crosstable/{user1}/{user2}`.
+ /// - Remark: Generated from `#/paths//api/crosstable/{user1}/{user2}/get(apiCrosstable)`.
+ internal func apiCrosstable(_ input: Operations.apiCrosstable.Input) async throws -> Operations.apiCrosstable.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiCrosstable.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/crosstable/{}/{}",
+ parameters: [
+ input.path.user1,
+ input.path.user2
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "matchup",
+ value: input.query.matchup
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiCrosstable.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiCrosstable.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Crosstable.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Autocomplete usernames
+ ///
+ /// Provides autocompletion options for an incomplete username.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/player/autocomplete`.
+ /// - Remark: Generated from `#/paths//api/player/autocomplete/get(apiPlayerAutocomplete)`.
+ internal func apiPlayerAutocomplete(_ input: Operations.apiPlayerAutocomplete.Input) async throws -> Operations.apiPlayerAutocomplete.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiPlayerAutocomplete.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/player/autocomplete",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "term",
+ value: input.query.term
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "object",
+ value: input.query.object
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "friend",
+ value: input.query.friend
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiPlayerAutocomplete.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiPlayerAutocomplete.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Operations.apiPlayerAutocomplete.Output.Ok.Body.jsonPayload.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get notes for a user
+ ///
+ /// Get the private notes that you have added for a user.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/user/{username}/note`.
+ /// - Remark: Generated from `#/paths//api/user/{username}/note/get(readNote)`.
+ internal func readNote(_ input: Operations.readNote.Input) async throws -> Operations.readNote.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.readNote.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/user/{}/note",
+ parameters: [
+ input.path.username
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.readNote.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.readNote.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ [Components.Schemas.UserNote].self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Add a note for a user
+ ///
+ /// Add a private note available only to you about this account.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/user/{username}/note`.
+ /// - Remark: Generated from `#/paths//api/user/{username}/note/post(writeNote)`.
+ internal func writeNote(_ input: Operations.writeNote.Input) async throws -> Operations.writeNote.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.writeNote.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/user/{}/note",
+ parameters: [
+ input.path.username
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .urlEncodedForm(value):
+ body = try converter.setRequiredRequestBodyAsURLEncodedForm(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/x-www-form-urlencoded"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.writeNote.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get users followed by the logged in user
+ ///
+ /// Users are streamed as [ndjson](#section/Introduction/Streaming-with-ND-JSON).
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/rel/following`.
+ /// - Remark: Generated from `#/paths//api/rel/following/get(apiUserFollowing)`.
+ internal func apiUserFollowing(_ input: Operations.apiUserFollowing.Input) async throws -> Operations.apiUserFollowing.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiUserFollowing.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/rel/following",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiUserFollowing.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiUserFollowing.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-ndjson"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-ndjson":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_ndjson(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Follow a player
+ ///
+ /// Follow a player, adding them to your list of Lichess friends.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/rel/follow/{username}`.
+ /// - Remark: Generated from `#/paths//api/rel/follow/{username}/post(followUser)`.
+ internal func followUser(_ input: Operations.followUser.Input) async throws -> Operations.followUser.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.followUser.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/rel/follow/{}",
+ parameters: [
+ input.path.username
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.followUser.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Unfollow a player
+ ///
+ /// Unfollow a player, removing them from your list of Lichess friends.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/rel/unfollow/{username}`.
+ /// - Remark: Generated from `#/paths//api/rel/unfollow/{username}/post(unfollowUser)`.
+ internal func unfollowUser(_ input: Operations.unfollowUser.Input) async throws -> Operations.unfollowUser.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.unfollowUser.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/rel/unfollow/{}",
+ parameters: [
+ input.path.username
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.unfollowUser.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Stream incoming events
+ ///
+ ///
+ /// Stream the events reaching a lichess user in real time as [ndjson](#section/Introduction/Streaming-with-ND-JSON).
+ ///
+ /// An empty line is sent every 6 seconds for keep alive purposes.
+ ///
+ /// Each non-empty line is a JSON object containing a `type` field. Possible values are:
+ /// - `gameStart` Start of a game
+ /// - `gameFinish` Completion of a game
+ /// - `challenge` A player sends you a challenge or you challenge someone
+ /// - `challengeCanceled` A player cancels their challenge to you
+ /// - `challengeDeclined` The opponent declines your challenge
+ ///
+ /// When the stream opens, all current challenges and games are sent.
+ ///
+ /// - Remark: HTTP `GET /api/stream/event`.
+ /// - Remark: Generated from `#/paths//api/stream/event/get(apiStreamEvent)`.
+ internal func apiStreamEvent(_ input: Operations.apiStreamEvent.Input) async throws -> Operations.apiStreamEvent.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiStreamEvent.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/stream/event",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiStreamEvent.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiStreamEvent.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-ndjson"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-ndjson":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_ndjson(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Create a seek
+ ///
+ ///
+ /// Create a public seek, to start a game with a random player.
+ ///
+ /// ### Real-time seek
+ ///
+ /// Specify the `time` and `increment` clock values. The response is streamed but doesn't contain any information.
+ ///
+ /// **Keep the connection open to keep the seek active**.
+ ///
+ /// If the client closes the connection, the seek is canceled. This way, if the client terminates, the user won't be paired in a game they wouldn't play.
+ /// When the seek is accepted, or expires, the server closes the connection.
+ ///
+ /// **Make sure to also have an [Event stream](#operation/apiStreamEvent) open**, to be notified when a game starts.
+ /// We recommend opening the [Event stream](#operation/apiStreamEvent) first, then the seek stream. This way,
+ /// you won't miss the game event if the seek is accepted immediately.
+ ///
+ /// ### Correspondence seek
+ ///
+ /// Specify the `days` per turn value. The response is not streamed, it immediately completes with the seek ID. The seek remains active on the server until it is joined by someone.
+ ///
+ /// - Remark: HTTP `POST /api/board/seek`.
+ /// - Remark: Generated from `#/paths//api/board/seek/post(apiBoardSeek)`.
+ internal func apiBoardSeek(_ input: Operations.apiBoardSeek.Input) async throws -> Operations.apiBoardSeek.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiBoardSeek.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/board/seek",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .urlEncodedForm(value):
+ body = try converter.setRequiredRequestBodyAsURLEncodedForm(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/x-www-form-urlencoded"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiBoardSeek.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiBoardSeek.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "text/plain"
+ ]
+ )
+ switch chosenContentType {
+ case "text/plain":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .plainText(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiBoardSeek.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Stream Board game state
+ ///
+ /// Stream the state of a game being played with the Board API, as [ndjson](#section/Introduction/Streaming-with-ND-JSON).
+ ///
+ /// Use this endpoint to get updates about the game in real-time, with a single request.
+ ///
+ /// Each line is a JSON object containing a `type` field. Possible values are:
+ /// - `gameFull` Full game data. All values are immutable, except for the `state` field.
+ /// - `gameState` Current state of the game. Immutable values not included. Sent when a move is played, a draw is offered, or when the game ends.
+ /// - `chatLine` Chat message sent by a user in the `room` "player" or "spectator".
+ ///
+ /// - `opponentGone` Whether the opponent has left the game, and how long before you can claim a win or draw.
+ ///
+ ///
+ /// The first line is always of type `gameFull`.
+ ///
+ ///
+ /// The server closes the stream when the game ends, or if the game has already ended.
+ ///
+ /// - Remark: HTTP `GET /api/board/game/stream/{gameId}`.
+ /// - Remark: Generated from `#/paths//api/board/game/stream/{gameId}/get(boardGameStream)`.
+ internal func boardGameStream(_ input: Operations.boardGameStream.Input) async throws -> Operations.boardGameStream.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.boardGameStream.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/board/game/stream/{}",
+ parameters: [
+ input.path.gameId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.boardGameStream.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.boardGameStream.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-ndjson"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-ndjson":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_ndjson(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 404:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.boardGameStream.Output.NotFound.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.NotFound.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .notFound(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Make a Board move
+ ///
+ /// Make a move in a game being played with the Board API.
+ /// The move can also contain a draw offer/agreement.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/board/game/{gameId}/move/{move}`.
+ /// - Remark: Generated from `#/paths//api/board/game/{gameId}/move/{move}/post(boardGameMove)`.
+ internal func boardGameMove(_ input: Operations.boardGameMove.Input) async throws -> Operations.boardGameMove.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.boardGameMove.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/board/game/{}/move/{}",
+ parameters: [
+ input.path.gameId,
+ input.path.move
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "offeringDraw",
+ value: input.query.offeringDraw
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.boardGameMove.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.boardGameMove.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.boardGameMove.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Fetch the game chat
+ ///
+ /// Get the messages posted in the game chat
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/board/game/{gameId}/chat`.
+ /// - Remark: Generated from `#/paths//api/board/game/{gameId}/chat/get(boardGameChatGet)`.
+ internal func boardGameChatGet(_ input: Operations.boardGameChatGet.Input) async throws -> Operations.boardGameChatGet.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.boardGameChatGet.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/board/game/{}/chat",
+ parameters: [
+ input.path.gameId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.boardGameChatGet.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.boardGameChatGet.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-ndjson"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-ndjson":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_ndjson(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Write in the chat
+ ///
+ /// Post a message to the player or spectator chat, in a game being played with the Board API.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/board/game/{gameId}/chat`.
+ /// - Remark: Generated from `#/paths//api/board/game/{gameId}/chat/post(boardGameChatPost)`.
+ internal func boardGameChatPost(_ input: Operations.boardGameChatPost.Input) async throws -> Operations.boardGameChatPost.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.boardGameChatPost.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/board/game/{}/chat",
+ parameters: [
+ input.path.gameId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .urlEncodedForm(value):
+ body = try converter.setRequiredRequestBodyAsURLEncodedForm(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/x-www-form-urlencoded"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.boardGameChatPost.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.boardGameChatPost.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.boardGameChatPost.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Abort a game
+ ///
+ /// Abort a game being played with the Board API.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/board/game/{gameId}/abort`.
+ /// - Remark: Generated from `#/paths//api/board/game/{gameId}/abort/post(boardGameAbort)`.
+ internal func boardGameAbort(_ input: Operations.boardGameAbort.Input) async throws -> Operations.boardGameAbort.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.boardGameAbort.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/board/game/{}/abort",
+ parameters: [
+ input.path.gameId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.boardGameAbort.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.boardGameAbort.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.boardGameAbort.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Resign a game
+ ///
+ /// Resign a game being played with the Board API.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/board/game/{gameId}/resign`.
+ /// - Remark: Generated from `#/paths//api/board/game/{gameId}/resign/post(boardGameResign)`.
+ internal func boardGameResign(_ input: Operations.boardGameResign.Input) async throws -> Operations.boardGameResign.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.boardGameResign.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/board/game/{}/resign",
+ parameters: [
+ input.path.gameId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.boardGameResign.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.boardGameResign.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.boardGameResign.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Handle draw offers
+ ///
+ /// Create/accept/decline draw offers.
+ /// - `yes`: Offer a draw, or accept the opponent's draw offer.
+ /// - `no`: Decline a draw offer from the opponent.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/board/game/{gameId}/draw/{accept}`.
+ /// - Remark: Generated from `#/paths//api/board/game/{gameId}/draw/{accept}/post(boardGameDraw)`.
+ internal func boardGameDraw(_ input: Operations.boardGameDraw.Input) async throws -> Operations.boardGameDraw.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.boardGameDraw.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/board/game/{}/draw/{}",
+ parameters: [
+ input.path.gameId,
+ input.path.accept
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.boardGameDraw.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.boardGameDraw.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.boardGameDraw.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Handle takeback offers
+ ///
+ /// Create/accept/decline takebacks.
+ /// - `yes`: Propose a takeback, or accept the opponent's takeback offer.
+ /// - `no`: Decline a takeback offer from the opponent.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/board/game/{gameId}/takeback/{accept}`.
+ /// - Remark: Generated from `#/paths//api/board/game/{gameId}/takeback/{accept}/post(boardGameTakeback)`.
+ internal func boardGameTakeback(_ input: Operations.boardGameTakeback.Input) async throws -> Operations.boardGameTakeback.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.boardGameTakeback.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/board/game/{}/takeback/{}",
+ parameters: [
+ input.path.gameId,
+ input.path.accept
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.boardGameTakeback.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.boardGameTakeback.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.boardGameTakeback.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Claim victory of a game
+ ///
+ /// Claim victory when the opponent has left the game for a while.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/board/game/{gameId}/claim-victory`.
+ /// - Remark: Generated from `#/paths//api/board/game/{gameId}/claim-victory/post(boardGameClaimVictory)`.
+ internal func boardGameClaimVictory(_ input: Operations.boardGameClaimVictory.Input) async throws -> Operations.boardGameClaimVictory.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.boardGameClaimVictory.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/board/game/{}/claim-victory",
+ parameters: [
+ input.path.gameId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.boardGameClaimVictory.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.boardGameClaimVictory.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.boardGameClaimVictory.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Berserk a tournament game
+ ///
+ /// Go berserk on an arena tournament game. Halves the clock time, grants an extra point upon winning.
+ /// Only available in arena tournaments that allow berserk, and before each player has made a move.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/board/game/{gameId}/berserk`.
+ /// - Remark: Generated from `#/paths//api/board/game/{gameId}/berserk/post(boardGameBerserk)`.
+ internal func boardGameBerserk(_ input: Operations.boardGameBerserk.Input) async throws -> Operations.boardGameBerserk.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.boardGameBerserk.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/board/game/{}/berserk",
+ parameters: [
+ input.path.gameId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.boardGameBerserk.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.boardGameBerserk.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.boardGameBerserk.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get online bots
+ ///
+ /// Stream the [online bot users](https://lichess.org/player/bots), as [ndjson](#section/Introduction/Streaming-with-ND-JSON). Throttled to 50 bot users per second.
+ ///
+ /// - Remark: HTTP `GET /api/bot/online`.
+ /// - Remark: Generated from `#/paths//api/bot/online/get(apiBotOnline)`.
+ internal func apiBotOnline(_ input: Operations.apiBotOnline.Input) async throws -> Operations.apiBotOnline.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiBotOnline.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/bot/online",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "nb",
+ value: input.query.nb
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiBotOnline.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiBotOnline.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-ndjson"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-ndjson":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_ndjson(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Upgrade to Bot account
+ ///
+ /// Upgrade a lichess player account into a Bot account. Only Bot accounts can use the Bot API.
+ /// The account **cannot have played any game** before becoming a Bot account. The upgrade is **irreversible**. The account will only be able to play as a Bot.
+ /// To upgrade an account to Bot, use the [official lichess-bot client](https://github.com/lichess-bot-devs/lichess-bot), or follow these steps:
+ /// - Create an [API access token](https://lichess.org/account/oauth/token/create?scopes[]=bot:play) with "Play bot moves" permission.
+ /// - `curl -d '' https://lichess.org/api/bot/account/upgrade -H "Authorization: Bearer <yourTokenHere>"`
+ /// To know if an account has already been upgraded, use the [Get my profile API](#operation/accountMe):
+ /// the `title` field should be set to `BOT`.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/bot/account/upgrade`.
+ /// - Remark: Generated from `#/paths//api/bot/account/upgrade/post(botAccountUpgrade)`.
+ internal func botAccountUpgrade(_ input: Operations.botAccountUpgrade.Input) async throws -> Operations.botAccountUpgrade.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.botAccountUpgrade.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/bot/account/upgrade",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.botAccountUpgrade.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.botAccountUpgrade.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.botAccountUpgrade.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Stream Bot game state
+ ///
+ /// Stream the state of a game being played with the Bot API, as [ndjson](#section/Introduction/Streaming-with-ND-JSON).
+ ///
+ /// Use this endpoint to get updates about the game in real-time, with a single request.
+ ///
+ /// Each line is a JSON object containing a `type` field. Possible values are:
+ /// - `gameFull` Full game data. All values are immutable, except for the `state` field.
+ /// - `gameState` Current state of the game. Immutable values not included.
+ /// - `chatLine` Chat message sent by a user (or the bot itself) in the `room` "player" or "spectator".
+ ///
+ /// - `opponentGone` Whether the opponent has left the game, and how long before you can claim a win or draw.
+ ///
+ ///
+ /// The first line is always of type `gameFull`.
+ ///
+ /// - Remark: HTTP `GET /api/bot/game/stream/{gameId}`.
+ /// - Remark: Generated from `#/paths//api/bot/game/stream/{gameId}/get(botGameStream)`.
+ internal func botGameStream(_ input: Operations.botGameStream.Input) async throws -> Operations.botGameStream.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.botGameStream.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/bot/game/stream/{}",
+ parameters: [
+ input.path.gameId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.botGameStream.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.botGameStream.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-ndjson"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-ndjson":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_ndjson(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 404:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.botGameStream.Output.NotFound.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.NotFound.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .notFound(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Make a Bot move
+ ///
+ /// Make a move in a game being played with the Bot API.
+ /// The move can also contain a draw offer/agreement.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/bot/game/{gameId}/move/{move}`.
+ /// - Remark: Generated from `#/paths//api/bot/game/{gameId}/move/{move}/post(botGameMove)`.
+ internal func botGameMove(_ input: Operations.botGameMove.Input) async throws -> Operations.botGameMove.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.botGameMove.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/bot/game/{}/move/{}",
+ parameters: [
+ input.path.gameId,
+ input.path.move
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "offeringDraw",
+ value: input.query.offeringDraw
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.botGameMove.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.botGameMove.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.botGameMove.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Fetch the game chat
+ ///
+ /// Get the messages posted in the game chat
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/bot/game/{gameId}/chat`.
+ /// - Remark: Generated from `#/paths//api/bot/game/{gameId}/chat/get(botGameChatGet)`.
+ internal func botGameChatGet(_ input: Operations.botGameChatGet.Input) async throws -> Operations.botGameChatGet.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.botGameChatGet.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/bot/game/{}/chat",
+ parameters: [
+ input.path.gameId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.botGameChatGet.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.botGameChatGet.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-ndjson"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-ndjson":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_ndjson(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Write in the chat
+ ///
+ /// Post a message to the player or spectator chat, in a game being played with the Bot API.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/bot/game/{gameId}/chat`.
+ /// - Remark: Generated from `#/paths//api/bot/game/{gameId}/chat/post(botGameChat)`.
+ internal func botGameChat(_ input: Operations.botGameChat.Input) async throws -> Operations.botGameChat.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.botGameChat.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/bot/game/{}/chat",
+ parameters: [
+ input.path.gameId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .urlEncodedForm(value):
+ body = try converter.setRequiredRequestBodyAsURLEncodedForm(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/x-www-form-urlencoded"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.botGameChat.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.botGameChat.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.botGameChat.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Abort a game
+ ///
+ /// Abort a game being played with the Bot API.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/bot/game/{gameId}/abort`.
+ /// - Remark: Generated from `#/paths//api/bot/game/{gameId}/abort/post(botGameAbort)`.
+ internal func botGameAbort(_ input: Operations.botGameAbort.Input) async throws -> Operations.botGameAbort.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.botGameAbort.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/bot/game/{}/abort",
+ parameters: [
+ input.path.gameId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.botGameAbort.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.botGameAbort.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.botGameAbort.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Resign a game
+ ///
+ /// Resign a game being played with the Bot API.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/bot/game/{gameId}/resign`.
+ /// - Remark: Generated from `#/paths//api/bot/game/{gameId}/resign/post(botGameResign)`.
+ internal func botGameResign(_ input: Operations.botGameResign.Input) async throws -> Operations.botGameResign.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.botGameResign.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/bot/game/{}/resign",
+ parameters: [
+ input.path.gameId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.botGameResign.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.botGameResign.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.botGameResign.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Handle draw offers
+ ///
+ /// Create/accept/decline draw offers with the Bot API.
+ /// - `yes`: Offer a draw, or accept the opponent's draw offer.
+ /// - `no`: Decline a draw offer from the opponent.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/bot/game/{gameId}/draw/{accept}`.
+ /// - Remark: Generated from `#/paths//api/bot/game/{gameId}/draw/{accept}/post(botGameDraw)`.
+ internal func botGameDraw(_ input: Operations.botGameDraw.Input) async throws -> Operations.botGameDraw.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.botGameDraw.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/bot/game/{}/draw/{}",
+ parameters: [
+ input.path.gameId,
+ input.path.accept
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.botGameDraw.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.botGameDraw.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.botGameDraw.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Handle takeback offers
+ ///
+ /// Create/accept/decline takebacks with the Bot API.
+ /// - `yes`: Propose a takeback, or accept the opponent's takeback offer.
+ /// - `no`: Decline a takeback offer from the opponent.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/bot/game/{gameId}/takeback/{accept}`.
+ /// - Remark: Generated from `#/paths//api/bot/game/{gameId}/takeback/{accept}/post(botGameTakeback)`.
+ internal func botGameTakeback(_ input: Operations.botGameTakeback.Input) async throws -> Operations.botGameTakeback.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.botGameTakeback.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/bot/game/{}/takeback/{}",
+ parameters: [
+ input.path.gameId,
+ input.path.accept
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.botGameTakeback.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.botGameTakeback.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.botGameTakeback.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// List your challenges
+ ///
+ /// Get a list of challenges created by or targeted at you.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/challenge`.
+ /// - Remark: Generated from `#/paths//api/challenge/get(challengeList)`.
+ internal func challengeList(_ input: Operations.challengeList.Input) async throws -> Operations.challengeList.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.challengeList.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/challenge",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.challengeList.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.challengeList.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Operations.challengeList.Output.Ok.Body.jsonPayload.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Create a challenge
+ ///
+ /// Challenge someone to play. The targeted player can choose to accept or decline.
+ /// If the challenge is accepted, you will be notified on the [event stream](#operation/apiStreamEvent)
+ /// that a new game has started. The game ID will be the same as the challenge ID.
+ /// Challenges for realtime games (not correspondence) expire after 20s if not accepted.
+ /// To prevent that, use the `keepAliveStream` flag described below.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/challenge/{username}`.
+ /// - Remark: Generated from `#/paths//api/challenge/{username}/post(challengeCreate)`.
+ internal func challengeCreate(_ input: Operations.challengeCreate.Input) async throws -> Operations.challengeCreate.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.challengeCreate.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/challenge/{}",
+ parameters: [
+ input.path.username
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .urlEncodedForm(value):
+ body = try converter.setRequiredRequestBodyAsURLEncodedForm(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/x-www-form-urlencoded"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.challengeCreate.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.challengeCreate.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Operations.challengeCreate.Output.Ok.Body.jsonPayload.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.challengeCreate.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Accept a challenge
+ ///
+ /// Accept an incoming challenge.
+ /// You should receive a `gameStart` event on the [incoming events stream](#operation/apiStreamEvent).
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/challenge/{challengeId}/accept`.
+ /// - Remark: Generated from `#/paths//api/challenge/{challengeId}/accept/post(challengeAccept)`.
+ internal func challengeAccept(_ input: Operations.challengeAccept.Input) async throws -> Operations.challengeAccept.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.challengeAccept.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/challenge/{}/accept",
+ parameters: [
+ input.path.challengeId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.challengeAccept.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.challengeAccept.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 404:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.challengeAccept.Output.NotFound.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.NotFound.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .notFound(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Decline a challenge
+ ///
+ /// Decline an incoming challenge.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/challenge/{challengeId}/decline`.
+ /// - Remark: Generated from `#/paths//api/challenge/{challengeId}/decline/post(challengeDecline)`.
+ internal func challengeDecline(_ input: Operations.challengeDecline.Input) async throws -> Operations.challengeDecline.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.challengeDecline.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/challenge/{}/decline",
+ parameters: [
+ input.path.challengeId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case .none:
+ body = nil
+ case let .urlEncodedForm(value):
+ body = try converter.setOptionalRequestBodyAsURLEncodedForm(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/x-www-form-urlencoded"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.challengeDecline.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.challengeDecline.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 404:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.challengeDecline.Output.NotFound.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.NotFound.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .notFound(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Cancel a challenge
+ ///
+ /// Cancel a challenge you sent, or aborts the game if the challenge was accepted, but the game was not yet played.
+ /// Note that the ID of a game is the same as the ID of the challenge that created it.
+ /// Works for user challenges and open challenges alike.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/challenge/{challengeId}/cancel`.
+ /// - Remark: Generated from `#/paths//api/challenge/{challengeId}/cancel/post(challengeCancel)`.
+ internal func challengeCancel(_ input: Operations.challengeCancel.Input) async throws -> Operations.challengeCancel.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.challengeCancel.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/challenge/{}/cancel",
+ parameters: [
+ input.path.challengeId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "opponentToken",
+ value: input.query.opponentToken
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.challengeCancel.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.challengeCancel.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 404:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.challengeCancel.Output.NotFound.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.NotFound.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .notFound(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Challenge the AI
+ ///
+ /// Start a game with Lichess AI.
+ /// You will be notified on the [event stream](#operation/apiStreamEvent) that a new game has started.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/challenge/ai`.
+ /// - Remark: Generated from `#/paths//api/challenge/ai/post(challengeAi)`.
+ internal func challengeAi(_ input: Operations.challengeAi.Input) async throws -> Operations.challengeAi.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.challengeAi.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/challenge/ai",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .urlEncodedForm(value):
+ body = try converter.setRequiredRequestBodyAsURLEncodedForm(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/x-www-form-urlencoded"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 201:
+ let headers: Operations.challengeAi.Output.Created.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.challengeAi.Output.Created.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.GameJson.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .created(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.challengeAi.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Open-ended challenge
+ ///
+ /// Create a challenge that any 2 players can join.
+ /// Share the URL of the challenge. the first 2 players to click it will be paired for a game.
+ /// The response body also contains `whiteUrl` and `blackUrl`.
+ /// You can control which color each player gets by giving them these URLs,
+ /// instead of the main challenge URL.
+ /// Open challenges expire after 24h.
+ /// If the challenge creation is [authenticated with OAuth2](#section/Introduction/Authentication),
+ /// then you can use the [challenge cancel endpoint](#operation/challengeCancel) to cancel it.
+ /// To directly pair 2 known players, use [this endpoint](#operation/bulkPairingList) instead.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/challenge/open`.
+ /// - Remark: Generated from `#/paths//api/challenge/open/post(challengeOpen)`.
+ internal func challengeOpen(_ input: Operations.challengeOpen.Input) async throws -> Operations.challengeOpen.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.challengeOpen.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/challenge/open",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .urlEncodedForm(value):
+ body = try converter.setRequiredRequestBodyAsURLEncodedForm(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/x-www-form-urlencoded"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.challengeOpen.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.challengeOpen.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.ChallengeOpenJson.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.challengeOpen.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Start clocks of a game
+ ///
+ /// Start the clocks of a game immediately, even if a player has not yet made a move.
+ /// Requires the OAuth tokens of both players with `challenge:write` scope.
+ /// If the clocks have already started, the call will have no effect.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/challenge/{gameId}/start-clocks`.
+ /// - Remark: Generated from `#/paths//api/challenge/{gameId}/start-clocks/post(challengeStartClocks)`.
+ internal func challengeStartClocks(_ input: Operations.challengeStartClocks.Input) async throws -> Operations.challengeStartClocks.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.challengeStartClocks.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/challenge/{}/start-clocks",
+ parameters: [
+ input.path.gameId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "token1",
+ value: input.query.token1
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "token2",
+ value: input.query.token2
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.challengeStartClocks.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.challengeStartClocks.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// View your bulk pairings
+ ///
+ /// Get a list of bulk pairings you created.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/bulk-pairing`.
+ /// - Remark: Generated from `#/paths//api/bulk-pairing/get(bulkPairingList)`.
+ internal func bulkPairingList(_ input: Operations.bulkPairingList.Input) async throws -> Operations.bulkPairingList.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.bulkPairingList.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/bulk-pairing",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.bulkPairingList.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.bulkPairingList.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ [Components.Schemas.BulkPairing].self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Create a bulk pairing
+ ///
+ /// Schedule many games at once, up to 24h in advance.
+ /// OAuth tokens are required for all paired players, with the `challenge:write` scope.
+ /// You can schedule up to 500 games every 10 minutes. [Contact us](mailto:contact@lichess.org) if you need higher limits.
+ /// If games have a real-time clock, each player must have only one pairing.
+ /// For correspondence games, players can have multiple pairings within the same bulk.
+ /// The entire bulk is rejected if:
+ /// - a token is missing
+ /// - a token is present more than once (except in correspondence)
+ /// - a token lacks the `challenge:write` scope
+ /// - a player account is closed
+ /// - a player is paired more than once (except in correspondence)
+ /// - a bulk is already scheduled to start at the same time with the same player
+ /// - you have 20 scheduled bulks
+ /// - you have 1000 scheduled games
+ /// Partial bulks are never created. Either it all fails, or it all succeeds.
+ /// When it fails, it does so with an error message explaining the issue.
+ /// Failed bulks are not counted in the rate limiting, they are free.
+ /// Fix the issues, manually or programmatically, then retry to schedule the bulk.
+ /// A successful bulk creation returns a JSON bulk document. Its ID can be used for further operations.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/bulk-pairing`.
+ /// - Remark: Generated from `#/paths//api/bulk-pairing/post(bulkPairingCreate)`.
+ internal func bulkPairingCreate(_ input: Operations.bulkPairingCreate.Input) async throws -> Operations.bulkPairingCreate.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.bulkPairingCreate.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/bulk-pairing",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .urlEncodedForm(value):
+ body = try converter.setRequiredRequestBodyAsURLEncodedForm(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/x-www-form-urlencoded"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.bulkPairingCreate.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.bulkPairingCreate.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.BulkPairing.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.bulkPairingCreate.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Manually start clocks
+ ///
+ /// Immediately start all clocks of the games of a bulk pairing.
+ /// This overrides the `startClocksAt` value of an existing bulk pairing.
+ /// If the games have not yet been created (`bulk.pairAt` is in the future), then this does nothing.
+ /// If the clocks have already started (`bulk.startClocksAt` is in the past), then this does nothing.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/bulk-pairing/{id}/start-clocks`.
+ /// - Remark: Generated from `#/paths//api/bulk-pairing/{id}/start-clocks/post(bulkPairingStartClocks)`.
+ internal func bulkPairingStartClocks(_ input: Operations.bulkPairingStartClocks.Input) async throws -> Operations.bulkPairingStartClocks.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.bulkPairingStartClocks.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/bulk-pairing/{}/start-clocks",
+ parameters: [
+ input.path.id
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.bulkPairingStartClocks.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.bulkPairingStartClocks.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 404:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.bulkPairingStartClocks.Output.NotFound.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.NotFound.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .notFound(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Show a bulk pairing
+ ///
+ /// Get a single bulk pairing by its ID.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/bulk-pairing/{id}`.
+ /// - Remark: Generated from `#/paths//api/bulk-pairing/{id}/get(bulkPairingGet)`.
+ internal func bulkPairingGet(_ input: Operations.bulkPairingGet.Input) async throws -> Operations.bulkPairingGet.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.bulkPairingGet.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/bulk-pairing/{}",
+ parameters: [
+ input.path.id
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.bulkPairingGet.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.bulkPairingGet.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.BulkPairing.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 404:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.bulkPairingGet.Output.NotFound.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.NotFound.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .notFound(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Cancel a bulk pairing
+ ///
+ /// Cancel and delete a bulk pairing that is scheduled in the future.
+ /// If the games have already been created, then this does nothing.
+ /// Canceling a bulk pairing does not refund the rate limit cost of that bulk pairing.
+ ///
+ ///
+ /// - Remark: HTTP `DELETE /api/bulk-pairing/{id}`.
+ /// - Remark: Generated from `#/paths//api/bulk-pairing/{id}/delete(bulkPairingDelete)`.
+ internal func bulkPairingDelete(_ input: Operations.bulkPairingDelete.Input) async throws -> Operations.bulkPairingDelete.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.bulkPairingDelete.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/bulk-pairing/{}",
+ parameters: [
+ input.path.id
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .delete
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.bulkPairingDelete.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.bulkPairingDelete.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 404:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.bulkPairingDelete.Output.NotFound.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.NotFound.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .notFound(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Add time to the opponent clock
+ ///
+ /// Add seconds to the opponent's clock. Can be used to create games with time odds.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/round/{gameId}/add-time/{seconds}`.
+ /// - Remark: Generated from `#/paths//api/round/{gameId}/add-time/{seconds}/post(roundAddTime)`.
+ internal func roundAddTime(_ input: Operations.roundAddTime.Input) async throws -> Operations.roundAddTime.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.roundAddTime.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/round/{}/add-time/{}",
+ parameters: [
+ input.path.gameId,
+ input.path.seconds
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.roundAddTime.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.roundAddTime.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Admin challenge tokens
+ ///
+ /// **This endpoint can only be used by Lichess administrators. It will not work if you do not have the appropriate permissions.** Tournament organizers should instead use [OAuth](#tag/OAuth) to obtain `challenge:write` tokens from users in order to perform bulk pairing.*
+ /// Create and obtain `challenge:write` tokens for multiple users.
+ /// If a similar token already exists for a user, it is reused. This endpoint is idempotent.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/token/admin-challenge`.
+ /// - Remark: Generated from `#/paths//api/token/admin-challenge/post(adminChallengeTokens)`.
+ internal func adminChallengeTokens(_ input: Operations.adminChallengeTokens.Input) async throws -> Operations.adminChallengeTokens.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.adminChallengeTokens.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/token/admin-challenge",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .urlEncodedForm(value):
+ body = try converter.setRequiredRequestBodyAsURLEncodedForm(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/x-www-form-urlencoded"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.adminChallengeTokens.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.adminChallengeTokens.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ OpenAPIRuntime.OpenAPIValueContainer.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.adminChallengeTokens.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Send a private message
+ ///
+ /// Send a private message to another player.
+ ///
+ ///
+ /// - Remark: HTTP `POST /inbox/{username}`.
+ /// - Remark: Generated from `#/paths//inbox/{username}/post(inboxUsername)`.
+ internal func inboxUsername(_ input: Operations.inboxUsername.Input) async throws -> Operations.inboxUsername.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.inboxUsername.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/inbox/{}",
+ parameters: [
+ input.path.username
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .urlEncodedForm(value):
+ body = try converter.setRequiredRequestBodyAsURLEncodedForm(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/x-www-form-urlencoded"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.inboxUsername.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(body: body))
+ case 400:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.inboxUsername.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas._Error.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get cloud evaluation of a position.
+ ///
+ /// Get the cached evaluation of a position, if available.
+ /// Opening positions have more chances of being available. There are about 15 million positions in the database.
+ /// Up to 5 variations may be available. Variants are supported.
+ /// Use this endpoint to fetch a few positions here and there.
+ /// If you want to download a lot of positions, [get the full list](https://database.lichess.org/#evals) from our exported database.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/cloud-eval`.
+ /// - Remark: Generated from `#/paths//api/cloud-eval/get(apiCloudEval)`.
+ internal func apiCloudEval(_ input: Operations.apiCloudEval.Input) async throws -> Operations.apiCloudEval.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiCloudEval.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/cloud-eval",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "fen",
+ value: input.query.fen
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "multiPv",
+ value: input.query.multiPv
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "variant",
+ value: input.query.variant
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiCloudEval.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiCloudEval.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ OpenAPIRuntime.OpenAPIValueContainer.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// List external engines
+ ///
+ /// Lists all external engines that have been registered for the user,
+ /// and the credentials required to use them.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/external-engine`.
+ /// - Remark: Generated from `#/paths//api/external-engine/get(apiExternalEngineList)`.
+ internal func apiExternalEngineList(_ input: Operations.apiExternalEngineList.Input) async throws -> Operations.apiExternalEngineList.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiExternalEngineList.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/external-engine",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiExternalEngineList.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiExternalEngineList.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ [Components.Schemas.ExternalEngine].self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Create external engine
+ ///
+ /// Registers a new external engine for the user. It can then be selected
+ /// and used on the analysis board.
+ /// After registering, the provider should start waiting for analyis requests.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/external-engine`.
+ /// - Remark: Generated from `#/paths//api/external-engine/post(apiExternalEngineCreate)`.
+ internal func apiExternalEngineCreate(_ input: Operations.apiExternalEngineCreate.Input) async throws -> Operations.apiExternalEngineCreate.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiExternalEngineCreate.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/external-engine",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .json(value):
+ body = try converter.setRequiredRequestBodyAsJSON(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/json; charset=utf-8"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiExternalEngineCreate.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiExternalEngineCreate.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.ExternalEngine.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Get external engine
+ ///
+ /// Get properties and credentials of an external engine.
+ ///
+ ///
+ /// - Remark: HTTP `GET /api/external-engine/{id}`.
+ /// - Remark: Generated from `#/paths//api/external-engine/{id}/get(apiExternalEngineGet)`.
+ internal func apiExternalEngineGet(_ input: Operations.apiExternalEngineGet.Input) async throws -> Operations.apiExternalEngineGet.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiExternalEngineGet.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/external-engine/{}",
+ parameters: [
+ input.path.id
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiExternalEngineGet.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiExternalEngineGet.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.ExternalEngine.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Update external engine
+ ///
+ /// Updates the properties of an external engine.
+ ///
+ ///
+ /// - Remark: HTTP `PUT /api/external-engine/{id}`.
+ /// - Remark: Generated from `#/paths//api/external-engine/{id}/put(apiExternalEnginePut)`.
+ internal func apiExternalEnginePut(_ input: Operations.apiExternalEnginePut.Input) async throws -> Operations.apiExternalEnginePut.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiExternalEnginePut.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/external-engine/{}",
+ parameters: [
+ input.path.id
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .put
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .json(value):
+ body = try converter.setRequiredRequestBodyAsJSON(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/json; charset=utf-8"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiExternalEnginePut.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiExternalEnginePut.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.ExternalEngine.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Delete external engine
+ ///
+ /// Unregisters an external engine.
+ ///
+ ///
+ /// - Remark: HTTP `DELETE /api/external-engine/{id}`.
+ /// - Remark: Generated from `#/paths//api/external-engine/{id}/delete(apiExternalEngineDelete)`.
+ internal func apiExternalEngineDelete(_ input: Operations.apiExternalEngineDelete.Input) async throws -> Operations.apiExternalEngineDelete.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiExternalEngineDelete.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/external-engine/{}",
+ parameters: [
+ input.path.id
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .delete
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiExternalEngineDelete.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.Ok.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Analyse with external engine
+ ///
+ /// **Endpoint: `https://engine.lichess.ovh/api/external-engine/{id}/analyse`**
+ /// Request analysis from an external engine.
+ /// Response content is streamed as [newline delimited JSON](#section/Introduction/Streaming-with-ND-JSON).
+ /// The properties are based on the [UCI specification](https://backscattering.de/chess/uci/#engine).
+ /// Analysis stops when the client goes away, the requested limit
+ /// is reached, or the provider goes away.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/external-engine/{id}/analyse`.
+ /// - Remark: Generated from `#/paths//api/external-engine/{id}/analyse/post(apiExternalEngineAnalyse)`.
+ internal func apiExternalEngineAnalyse(_ input: Operations.apiExternalEngineAnalyse.Input) async throws -> Operations.apiExternalEngineAnalyse.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiExternalEngineAnalyse.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/external-engine/{}/analyse",
+ parameters: [
+ input.path.id
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .json(value):
+ body = try converter.setRequiredRequestBodyAsJSON(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/json; charset=utf-8"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiExternalEngineAnalyse.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiExternalEngineAnalyse.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-ndjson"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-ndjson":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_ndjson(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Acquire analysis request
+ ///
+ /// **Endpoint: `https://engine.lichess.ovh/api/external-engine/work`**
+ /// Wait for an analysis requests to any of the external engines that
+ /// have been registered with the given `secret`.
+ /// Uses long polling.
+ /// After acquiring a request, the provider should immediately
+ /// [start streaming the results](#tag/External-engine/operation/apiExternalEngineSubmit).
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/external-engine/work`.
+ /// - Remark: Generated from `#/paths//api/external-engine/work/post(apiExternalEngineAcquire)`.
+ internal func apiExternalEngineAcquire(_ input: Operations.apiExternalEngineAcquire.Input) async throws -> Operations.apiExternalEngineAcquire.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiExternalEngineAcquire.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/external-engine/work",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .json(value):
+ body = try converter.setRequiredRequestBodyAsJSON(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/json; charset=utf-8"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiExternalEngineAcquire.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiExternalEngineAcquire.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Operations.apiExternalEngineAcquire.Output.Ok.Body.jsonPayload.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 204:
+ let headers: Operations.apiExternalEngineAcquire.Output.NoContent.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ return .noContent(.init(headers: headers))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Answer analysis request
+ ///
+ /// **Endpoint: `https://engine.lichess.ovh/api/external-engine/work/{id}`**
+ /// Submit a stream of analysis as [UCI output](https://backscattering.de/chess/uci/#engine-info).
+ /// * The engine should always be in `UCI_Chess960` mode.
+ /// * `UCI_AnalyseMode` enabled if available.
+ /// * It produces `info` with at least:
+ /// - `depth`
+ /// - `multipv` (between 1 and 5)
+ /// - `score`
+ /// - `nodes`
+ /// - `time`
+ /// - `pv`
+ /// The server may close the connection at any time, indicating that
+ /// the requester has gone away and analysis should be stopped.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/external-engine/work/{id}`.
+ /// - Remark: Generated from `#/paths//api/external-engine/work/{id}/post(apiExternalEngineSubmit)`.
+ internal func apiExternalEngineSubmit(_ input: Operations.apiExternalEngineSubmit.Input) async throws -> Operations.apiExternalEngineSubmit.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiExternalEngineSubmit.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/external-engine/work/{}",
+ parameters: [
+ input.path.id
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .plainText(value):
+ body = try converter.setRequiredRequestBodyAsBinary(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "text/plain"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiExternalEngineSubmit.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ return .ok(.init(headers: headers))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Request authorization code
+ ///
+ /// OAuth2 authorization endpoint.
+ /// Start the OAuth2 Authorization Code Flow with PKCE by securely
+ /// generating two random strings unique to each authorization
+ /// request:
+ /// * `code_verifier`
+ /// * `state`
+ /// Store these in session storage. Make sure not to reveal `code_verifier`
+ /// to eavesdroppers. Do not show it in URLs, do not abuse `state` to store
+ /// it, do not send it over insecure connections. However it is fine if
+ /// the user themselves can extract `code_verifier`, which will always be
+ /// possible for fully client-side apps.
+ /// Then send the user to this endpoint. They will be prompted to grant
+ /// authorization and then be redirected back to the given `redirect_uri`.
+ /// If the authorization failed, the following query string parameters will
+ /// be appended to the redirection:
+ /// * `error`, in particular with value `access_denied` if the user
+ /// cancelled authorization
+ /// * `error_description` to aid debugging
+ /// * `state`, exactly as passed in the `state` parameter
+ /// If the authorization succeeded, the following query string parameters
+ /// will be appended to the redirection:
+ /// * `code`, containing a fresh short-lived authorization code
+ /// * `state`, exactly as passed in the `state` parameter
+ /// Next, to defend against cross site request forgery, check that the
+ /// returned `state` matches the `state` you originally generated.
+ /// Finally, continue by using the authorization code to
+ /// [obtain an access token](#operation/apiToken).
+ ///
+ ///
+ /// - Remark: HTTP `GET /oauth`.
+ /// - Remark: Generated from `#/paths//oauth/get(oauth)`.
+ internal func oauth(_ input: Operations.oauth.Input) async throws -> Operations.oauth.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.oauth.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/oauth",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "response_type",
+ value: input.query.response_type
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "client_id",
+ value: input.query.client_id
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "redirect_uri",
+ value: input.query.redirect_uri
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "code_challenge_method",
+ value: input.query.code_challenge_method
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "code_challenge",
+ value: input.query.code_challenge
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "scope",
+ value: input.query.scope
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "username",
+ value: input.query.username
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "state",
+ value: input.query.state
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ return .ok(.init())
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Obtain access token
+ ///
+ /// OAuth2 token endpoint. Exchanges an authorization code for an access token.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/token`.
+ /// - Remark: Generated from `#/paths//api/token/post(apiToken)`.
+ internal func apiToken(_ input: Operations.apiToken.Input) async throws -> Operations.apiToken.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiToken.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/token",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .urlEncodedForm(value):
+ body = try converter.setRequiredRequestBodyAsURLEncodedForm(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "application/x-www-form-urlencoded"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.apiToken.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiToken.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ OpenAPIRuntime.OpenAPIValueContainer.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ case 400:
+ let headers: Operations.apiToken.Output.BadRequest.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.apiToken.Output.BadRequest.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.OAuthError.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .badRequest(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Revoke access token
+ ///
+ /// Revokes the access token sent as Bearer for this request.
+ ///
+ /// - Remark: HTTP `DELETE /api/token`.
+ /// - Remark: Generated from `#/paths//api/token/delete(apiTokenDelete)`.
+ internal func apiTokenDelete(_ input: Operations.apiTokenDelete.Input) async throws -> Operations.apiTokenDelete.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.apiTokenDelete.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/token",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .delete
+ )
+ suppressMutabilityWarning(&request)
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 204:
+ let headers: Operations.apiTokenDelete.Output.NoContent.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ return .noContent(.init(headers: headers))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Test multiple OAuth tokens
+ ///
+ /// For up to 1000 OAuth tokens,
+ /// returns their associated user ID and scopes,
+ /// or `null` if the token is invalid.
+ /// The method is `POST` so a longer list of tokens can be sent in the request body.
+ ///
+ ///
+ /// - Remark: HTTP `POST /api/token/test`.
+ /// - Remark: Generated from `#/paths//api/token/test/post(tokenTest)`.
+ internal func tokenTest(_ input: Operations.tokenTest.Input) async throws -> Operations.tokenTest.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.tokenTest.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/api/token/test",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .post
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ let body: OpenAPIRuntime.HTTPBody?
+ switch input.body {
+ case let .plainText(value):
+ body = try converter.setRequiredRequestBodyAsBinary(
+ value,
+ headerFields: &request.headerFields,
+ contentType: "text/plain"
+ )
+ }
+ return (request, body)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.tokenTest.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Operations.tokenTest.Output.Ok.Body.jsonPayload.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(body: body))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Masters database
+ ///
+ /// **Endpoint: <https://explorer.lichess.ovh/masters>**
+ /// Example: `curl https://explorer.lichess.ovh/masters?play=d2d4,d7d5,c2c4,c7c6,c4d5`
+ ///
+ ///
+ /// - Remark: HTTP `GET /masters`.
+ /// - Remark: Generated from `#/paths//masters/get(openingExplorerMaster)`.
+ internal func openingExplorerMaster(_ input: Operations.openingExplorerMaster.Input) async throws -> Operations.openingExplorerMaster.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.openingExplorerMaster.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/masters",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "fen",
+ value: input.query.fen
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "play",
+ value: input.query.play
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "since",
+ value: input.query.since
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "until",
+ value: input.query.until
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "moves",
+ value: input.query.moves
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "topGames",
+ value: input.query.topGames
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.openingExplorerMaster.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.openingExplorerMaster.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.OpeningExplorerJson.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Lichess games
+ ///
+ /// **Endpoint: <https://explorer.lichess.ovh/lichess>**
+ /// Games sampled from all Lichess players.
+ /// Example: `curl https://explorer.lichess.ovh/lichess?variant=standard&speeds=blitz,rapid,classical&ratings=2200,2500&fen=rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR%20w%20KQkq%20-%200%201`
+ ///
+ ///
+ /// - Remark: HTTP `GET /lichess`.
+ /// - Remark: Generated from `#/paths//lichess/get(openingExplorerLichess)`.
+ internal func openingExplorerLichess(_ input: Operations.openingExplorerLichess.Input) async throws -> Operations.openingExplorerLichess.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.openingExplorerLichess.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/lichess",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "variant",
+ value: input.query.variant
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "fen",
+ value: input.query.fen
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "play",
+ value: input.query.play
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "speeds",
+ value: input.query.speeds
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "ratings",
+ value: input.query.ratings
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "since",
+ value: input.query.since
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "until",
+ value: input.query.until
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "moves",
+ value: input.query.moves
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "topGames",
+ value: input.query.topGames
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "recentGames",
+ value: input.query.recentGames
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "history",
+ value: input.query.history
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.openingExplorerLichess.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.openingExplorerLichess.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.OpeningExplorerJson.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Player games
+ ///
+ /// **Endpoint: <https://explorer.lichess.ovh/player>**
+ /// Games of a Lichess player.
+ /// Responds with a stream of [newline delimited JSON](#section/Introduction/Streaming-with-ND-JSON). Will start indexing
+ /// on demand, immediately respond with the current results, and stream
+ /// more updates until indexing is complete. The stream is throttled
+ /// and deduplicated. Empty lines may be sent to avoid timeouts.
+ /// Will index new games at most once per minute, and revisit previously
+ /// ongoing games at most once every day.
+ /// Example: `curl https://explorer.lichess.ovh/player?player=revoof&color=white&play=d2d4,d7d5&recentGames=1`
+ ///
+ ///
+ /// - Remark: HTTP `GET /player`.
+ /// - Remark: Generated from `#/paths//player/get(openingExplorerPlayer)`.
+ internal func openingExplorerPlayer(_ input: Operations.openingExplorerPlayer.Input) async throws -> Operations.openingExplorerPlayer.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.openingExplorerPlayer.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/player",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "player",
+ value: input.query.player
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "variant",
+ value: input.query.variant
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "fen",
+ value: input.query.fen
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "play",
+ value: input.query.play
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "speeds",
+ value: input.query.speeds
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "modes",
+ value: input.query.modes
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "since",
+ value: input.query.since
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "until",
+ value: input.query.until
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "moves",
+ value: input.query.moves
+ )
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "recentGames",
+ value: input.query.recentGames
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.openingExplorerPlayer.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.openingExplorerPlayer.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/nd-json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/nd-json":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_nd_hyphen_json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// OTB master game
+ ///
+ /// **Endpoint: `https://explorer.lichess.ovh/masters/pgn/{gameId}`**
+ /// Example: `curl https://explorer.lichess.ovh/masters/pgn/aAbqI4ey`
+ ///
+ ///
+ /// - Remark: HTTP `GET /master/pgn/{gameId}`.
+ /// - Remark: Generated from `#/paths//master/pgn/{gameId}/get(openingExplorerMasterGame)`.
+ internal func openingExplorerMasterGame(_ input: Operations.openingExplorerMasterGame.Input) async throws -> Operations.openingExplorerMasterGame.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.openingExplorerMasterGame.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/master/pgn/{}",
+ parameters: [
+ input.path.gameId
+ ]
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.openingExplorerMasterGame.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.openingExplorerMasterGame.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/x-chess-pgn"
+ ]
+ )
+ switch chosenContentType {
+ case "application/x-chess-pgn":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .application_x_hyphen_chess_hyphen_pgn(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Tablebase lookup
+ ///
+ /// **Endpoint: <https://tablebase.lichess.ovh>**
+ /// Example: `curl http://tablebase.lichess.ovh/standard?fen=4k3/6KP/8/8/8/8/7p/8_w_-_-_0_1`
+ ///
+ ///
+ /// - Remark: HTTP `GET /standard`.
+ /// - Remark: Generated from `#/paths//standard/get(tablebaseStandard)`.
+ internal func tablebaseStandard(_ input: Operations.tablebaseStandard.Input) async throws -> Operations.tablebaseStandard.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.tablebaseStandard.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/standard",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ try converter.setQueryItemAsURI(
+ in: &request,
+ style: .form,
+ explode: true,
+ name: "fen",
+ value: input.query.fen
+ )
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.tablebaseStandard.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.tablebaseStandard.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "application/json"
+ ]
+ )
+ switch chosenContentType {
+ case "application/json":
+ body = try await converter.getResponseBodyAsJSON(
+ Components.Schemas.TablebaseJson.self,
+ from: responseBody,
+ transforming: { value in
+ .json(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Tablebase lookup for Atomic chess
+ ///
+ /// **Endpoint: <https://tablebase.lichess.ovh>**
+ ///
+ ///
+ /// - Remark: HTTP `GET /atomic`.
+ /// - Remark: Generated from `#/paths//atomic/get(tablebaseAtomic)`.
+ internal func tablebaseAtomic(_ input: Operations.tablebaseAtomic.Input) async throws -> Operations.tablebaseAtomic.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.tablebaseAtomic.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/atomic",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.tablebaseAtomic.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.tablebaseAtomic.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "text/plain"
+ ]
+ )
+ switch chosenContentType {
+ case "text/plain":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .plainText(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+ /// Tablebase lookup for Antichess
+ ///
+ /// **Endpoint: <https://tablebase.lichess.ovh>**
+ ///
+ ///
+ /// - Remark: HTTP `GET /antichess`.
+ /// - Remark: Generated from `#/paths//antichess/get(antichessAtomic)`.
+ internal func antichessAtomic(_ input: Operations.antichessAtomic.Input) async throws -> Operations.antichessAtomic.Output {
+ try await client.send(
+ input: input,
+ forOperation: Operations.antichessAtomic.id,
+ serializer: { input in
+ let path = try converter.renderedPath(
+ template: "/antichess",
+ parameters: []
+ )
+ var request: HTTPTypes.HTTPRequest = .init(
+ soar_path: path,
+ method: .get
+ )
+ suppressMutabilityWarning(&request)
+ converter.setAcceptHeader(
+ in: &request.headerFields,
+ contentTypes: input.headers.accept
+ )
+ return (request, nil)
+ },
+ deserializer: { response, responseBody in
+ switch response.status.code {
+ case 200:
+ let headers: Operations.antichessAtomic.Output.Ok.Headers = .init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: try converter.getOptionalHeaderFieldAsURI(
+ in: response.headerFields,
+ name: "Access-Control-Allow-Origin",
+ as: Swift.String.self
+ ))
+ let contentType = converter.extractContentTypeIfPresent(in: response.headerFields)
+ let body: Operations.antichessAtomic.Output.Ok.Body
+ let chosenContentType = try converter.bestContentType(
+ received: contentType,
+ options: [
+ "text/plain"
+ ]
+ )
+ switch chosenContentType {
+ case "text/plain":
+ body = try converter.getResponseBodyAsBinary(
+ OpenAPIRuntime.HTTPBody.self,
+ from: responseBody,
+ transforming: { value in
+ .plainText(value)
+ }
+ )
+ default:
+ preconditionFailure("bestContentType chose an invalid content type.")
+ }
+ return .ok(.init(
+ headers: headers,
+ body: body
+ ))
+ default:
+ return .undocumented(
+ statusCode: response.status.code,
+ .init(
+ headerFields: response.headerFields,
+ body: responseBody
+ )
+ )
+ }
+ }
+ )
+ }
+}