diff options
-rw-r--r-- | .gitignore | 8 | ||||
-rw-r--r-- | Package.resolved | 95 | ||||
-rw-r--r-- | Package.swift | 30 | ||||
-rw-r--r-- | Sources/LichessClient/Generated/Client.swift | 14299 | ||||
-rw-r--r-- | Sources/LichessClient/Generated/Types.swift | 39108 | ||||
-rw-r--r-- | Sources/LichessClient/LichessClient+Broadcasts.swift | 110 | ||||
-rw-r--r-- | Sources/LichessClient/LichessClient+Tablebase.swift | 142 | ||||
-rw-r--r-- | Sources/LichessClient/LichessClient.swift | 29 | ||||
-rw-r--r-- | Sources/LichessClient/openapi-generator-config.yaml | 3 | ||||
-rw-r--r-- | Sources/LichessClient/openapi.json | 15619 | ||||
-rw-r--r-- | Tests/swift-lichessTests/swift_lichessTests.swift | 35 |
11 files changed, 69478 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0023a53 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +.DS_Store +/.build +/Packages +xcuserdata/ +DerivedData/ +.swiftpm/configuration/registries.json +.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +.netrc diff --git a/Package.resolved b/Package.resolved new file mode 100644 index 0000000..4b60359 --- /dev/null +++ b/Package.resolved @@ -0,0 +1,95 @@ +{ + "pins" : [ + { + "identity" : "openapikit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/mattpolzin/OpenAPIKit", + "state" : { + "revision" : "33a9984b4af03f00e68b8ee85f1273cb826af04f", + "version" : "3.1.3" + } + }, + { + "identity" : "swift-algorithms", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-algorithms", + "state" : { + "revision" : "f6919dfc309e7f1b56224378b11e28bab5bccc42", + "version" : "1.2.0" + } + }, + { + "identity" : "swift-argument-parser", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-argument-parser", + "state" : { + "revision" : "46989693916f56d1186bd59ac15124caef896560", + "version" : "1.3.1" + } + }, + { + "identity" : "swift-collections", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-collections", + "state" : { + "revision" : "94cf62b3ba8d4bed62680a282d4c25f9c63c2efb", + "version" : "1.1.0" + } + }, + { + "identity" : "swift-http-types", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-http-types", + "state" : { + "revision" : "12358d55a3824bd5fed310b999ea8cf83a9a1a65", + "version" : "1.0.3" + } + }, + { + "identity" : "swift-numerics", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-numerics.git", + "state" : { + "revision" : "0a5bc04095a675662cf24757cc0640aa2204253b", + "version" : "1.0.2" + } + }, + { + "identity" : "swift-openapi-generator", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-openapi-generator", + "state" : { + "revision" : "7992d77065f2787e7651cf6d9be9b99ad38f5166", + "version" : "1.2.1" + } + }, + { + "identity" : "swift-openapi-runtime", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-openapi-runtime", + "state" : { + "revision" : "76951d77a0609599d2dc233e7e40808a74767c6a", + "version" : "1.3.2" + } + }, + { + "identity" : "swift-openapi-urlsession", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-openapi-urlsession", + "state" : { + "revision" : "6efbfda5276bbbc8b4fec5d744f0ecd8c784eb47", + "version" : "1.0.1" + } + }, + { + "identity" : "yams", + "kind" : "remoteSourceControl", + "location" : "https://github.com/jpsim/Yams", + "state" : { + "revision" : "8a835d918245ca22f36663dd3862138805d7f707", + "version" : "5.1.0" + } + } + ], + "version" : 2 +} diff --git a/Package.swift b/Package.swift new file mode 100644 index 0000000..cd3a7aa --- /dev/null +++ b/Package.swift @@ -0,0 +1,30 @@ +// swift-tools-version: 5.9 + +import PackageDescription + +let package = Package( + name: "swift-lichess", + platforms: [.macOS(.v10_15), .iOS(.v13), .tvOS(.v13), .watchOS(.v6), .visionOS(.v1)], + products: [ + .library( + name: "LichessClient", + targets: ["LichessClient"]), + ], + dependencies: [ + .package(url: "https://github.com/apple/swift-openapi-generator", from: "1.0.0"), + .package(url: "https://github.com/apple/swift-openapi-runtime", from: "1.0.0"), + .package(url: "https://github.com/apple/swift-openapi-urlsession", from: "1.0.0"), + ], + targets: [ + .target( + name: "LichessClient", + dependencies: [ + .product(name: "OpenAPIRuntime", package: "swift-openapi-runtime"), + .product(name: "OpenAPIURLSession", package: "swift-openapi-urlsession"), + ] + ), + .testTarget( + name: "swift-lichessTests", + dependencies: ["LichessClient"]), + ] +) 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 + ) + ) + } + } + ) + } +} diff --git a/Sources/LichessClient/Generated/Types.swift b/Sources/LichessClient/Generated/Types.swift new file mode 100644 index 0000000..2dd9821 --- /dev/null +++ b/Sources/LichessClient/Generated/Types.swift @@ -0,0 +1,39108 @@ +// 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 +/// A type that performs HTTP operations defined by the OpenAPI document. +internal protocol APIProtocol: Sendable { + /// 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)`. + func apiUsersStatus(_ input: Operations.apiUsersStatus.Input) async throws -> Operations.apiUsersStatus.Output + /// 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)`. + func player(_ input: Operations.player.Input) async throws -> Operations.player.Output + /// 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)`. + func playerTopNbPerfType(_ input: Operations.playerTopNbPerfType.Input) async throws -> Operations.playerTopNbPerfType.Output + /// 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)`. + func apiUser(_ input: Operations.apiUser.Input) async throws -> Operations.apiUser.Output + /// 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)`. + func apiUserRatingHistory(_ input: Operations.apiUserRatingHistory.Input) async throws -> Operations.apiUserRatingHistory.Output + /// 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)`. + func apiUserPerf(_ input: Operations.apiUserPerf.Input) async throws -> Operations.apiUserPerf.Output + /// 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)`. + func apiUserActivity(_ input: Operations.apiUserActivity.Input) async throws -> Operations.apiUserActivity.Output + /// 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)`. + func apiPuzzleDaily(_ input: Operations.apiPuzzleDaily.Input) async throws -> Operations.apiPuzzleDaily.Output + /// 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)`. + func apiPuzzleId(_ input: Operations.apiPuzzleId.Input) async throws -> Operations.apiPuzzleId.Output + /// 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)`. + func apiPuzzleActivity(_ input: Operations.apiPuzzleActivity.Input) async throws -> Operations.apiPuzzleActivity.Output + /// 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)`. + func apiPuzzleDashboard(_ input: Operations.apiPuzzleDashboard.Input) async throws -> Operations.apiPuzzleDashboard.Output + /// 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)`. + func apiStormDashboard(_ input: Operations.apiStormDashboard.Input) async throws -> Operations.apiStormDashboard.Output + /// 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)`. + func racerPost(_ input: Operations.racerPost.Input) async throws -> Operations.racerPost.Output + /// 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)`. + func apiUsers(_ input: Operations.apiUsers.Input) async throws -> Operations.apiUsers.Output + /// Get my profile + /// + /// Public information about the logged in user. + /// + /// + /// - Remark: HTTP `GET /api/account`. + /// - Remark: Generated from `#/paths//api/account/get(accountMe)`. + func accountMe(_ input: Operations.accountMe.Input) async throws -> Operations.accountMe.Output + /// 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)`. + func accountEmail(_ input: Operations.accountEmail.Input) async throws -> Operations.accountEmail.Output + /// 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)`. + func account(_ input: Operations.account.Input) async throws -> Operations.account.Output + /// 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)`. + func accountKid(_ input: Operations.accountKid.Input) async throws -> Operations.accountKid.Output + /// 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)`. + func accountKidPost(_ input: Operations.accountKidPost.Input) async throws -> Operations.accountKidPost.Output + /// 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)`. + func timeline(_ input: Operations.timeline.Input) async throws -> Operations.timeline.Output + /// 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)`. + func gamePgn(_ input: Operations.gamePgn.Input) async throws -> Operations.gamePgn.Output + /// 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)`. + func apiUserCurrentGame(_ input: Operations.apiUserCurrentGame.Input) async throws -> Operations.apiUserCurrentGame.Output + /// 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)`. + func apiGamesUser(_ input: Operations.apiGamesUser.Input) async throws -> Operations.apiGamesUser.Output + /// 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)`. + func gamesExportIds(_ input: Operations.gamesExportIds.Input) async throws -> Operations.gamesExportIds.Output + /// 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)`. + func gamesByUsers(_ input: Operations.gamesByUsers.Input) async throws -> Operations.gamesByUsers.Output + /// 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)`. + func gamesByIds(_ input: Operations.gamesByIds.Input) async throws -> Operations.gamesByIds.Output + /// 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)`. + func gamesByIdsAdd(_ input: Operations.gamesByIdsAdd.Input) async throws -> Operations.gamesByIdsAdd.Output + /// 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)`. + func apiAccountPlaying(_ input: Operations.apiAccountPlaying.Input) async throws -> Operations.apiAccountPlaying.Output + /// 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)`. + func streamGame(_ input: Operations.streamGame.Input) async throws -> Operations.streamGame.Output + /// 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)`. + func gameImport(_ input: Operations.gameImport.Input) async throws -> Operations.gameImport.Output + /// 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)`. + func apiImportedGamesUser(_ input: Operations.apiImportedGamesUser.Input) async throws -> Operations.apiImportedGamesUser.Output + /// 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)`. + func tvChannels(_ input: Operations.tvChannels.Input) async throws -> Operations.tvChannels.Output + /// 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)`. + func tvFeed(_ input: Operations.tvFeed.Input) async throws -> Operations.tvFeed.Output + /// 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)`. + func tvChannelFeed(_ input: Operations.tvChannelFeed.Input) async throws -> Operations.tvChannelFeed.Output + /// 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)`. + func tvChannelGames(_ input: Operations.tvChannelGames.Input) async throws -> Operations.tvChannelGames.Output + /// 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)`. + func apiTournament(_ input: Operations.apiTournament.Input) async throws -> Operations.apiTournament.Output + /// 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)`. + func apiTournamentPost(_ input: Operations.apiTournamentPost.Input) async throws -> Operations.apiTournamentPost.Output + /// 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)`. + func tournament(_ input: Operations.tournament.Input) async throws -> Operations.tournament.Output + /// 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)`. + func apiTournamentUpdate(_ input: Operations.apiTournamentUpdate.Input) async throws -> Operations.apiTournamentUpdate.Output + /// 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)`. + func apiTournamentJoin(_ input: Operations.apiTournamentJoin.Input) async throws -> Operations.apiTournamentJoin.Output + /// 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)`. + func apiTournamentWithdraw(_ input: Operations.apiTournamentWithdraw.Input) async throws -> Operations.apiTournamentWithdraw.Output + /// 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)`. + func apiTournamentTerminate(_ input: Operations.apiTournamentTerminate.Input) async throws -> Operations.apiTournamentTerminate.Output + /// 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)`. + func apiTournamentTeamBattlePost(_ input: Operations.apiTournamentTeamBattlePost.Input) async throws -> Operations.apiTournamentTeamBattlePost.Output + /// 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)`. + func gamesByTournament(_ input: Operations.gamesByTournament.Input) async throws -> Operations.gamesByTournament.Output + /// 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)`. + func resultsByTournament(_ input: Operations.resultsByTournament.Input) async throws -> Operations.resultsByTournament.Output + /// 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)`. + func teamsByTournament(_ input: Operations.teamsByTournament.Input) async throws -> Operations.teamsByTournament.Output + /// 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)`. + func apiUserNameTournamentCreated(_ input: Operations.apiUserNameTournamentCreated.Input) async throws -> Operations.apiUserNameTournamentCreated.Output + /// 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)`. + func apiSwissNew(_ input: Operations.apiSwissNew.Input) async throws -> Operations.apiSwissNew.Output + /// 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)`. + func swiss(_ input: Operations.swiss.Input) async throws -> Operations.swiss.Output + /// 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)`. + func apiSwissUpdate(_ input: Operations.apiSwissUpdate.Input) async throws -> Operations.apiSwissUpdate.Output + /// 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)`. + func apiSwissScheduleNextRound(_ input: Operations.apiSwissScheduleNextRound.Input) async throws -> Operations.apiSwissScheduleNextRound.Output + /// 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)`. + func apiSwissJoin(_ input: Operations.apiSwissJoin.Input) async throws -> Operations.apiSwissJoin.Output + /// 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)`. + func apiSwissWithdraw(_ input: Operations.apiSwissWithdraw.Input) async throws -> Operations.apiSwissWithdraw.Output + /// 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)`. + func apiSwissTerminate(_ input: Operations.apiSwissTerminate.Input) async throws -> Operations.apiSwissTerminate.Output + /// 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)`. + func swissTrf(_ input: Operations.swissTrf.Input) async throws -> Operations.swissTrf.Output + /// 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)`. + func gamesBySwiss(_ input: Operations.gamesBySwiss.Input) async throws -> Operations.gamesBySwiss.Output + /// 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)`. + func resultsBySwiss(_ input: Operations.resultsBySwiss.Input) async throws -> Operations.resultsBySwiss.Output + /// 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)`. + func apiTeamSwiss(_ input: Operations.apiTeamSwiss.Input) async throws -> Operations.apiTeamSwiss.Output + /// 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)`. + func studyChapterPgn(_ input: Operations.studyChapterPgn.Input) async throws -> Operations.studyChapterPgn.Output + /// 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)`. + func studyAllChaptersPgn(_ input: Operations.studyAllChaptersPgn.Input) async throws -> Operations.studyAllChaptersPgn.Output + /// 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)`. + func studyAllChaptersHead(_ input: Operations.studyAllChaptersHead.Input) async throws -> Operations.studyAllChaptersHead.Output + /// 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)`. + func apiStudyImportPGN(_ input: Operations.apiStudyImportPGN.Input) async throws -> Operations.apiStudyImportPGN.Output + /// 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)`. + func studyExportAllPgn(_ input: Operations.studyExportAllPgn.Input) async throws -> Operations.studyExportAllPgn.Output + /// 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)`. + func studyListMetadata(_ input: Operations.studyListMetadata.Input) async throws -> Operations.studyListMetadata.Output + /// 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)`. + func apiStudyStudyIdChapterIdDelete(_ input: Operations.apiStudyStudyIdChapterIdDelete.Input) async throws -> Operations.apiStudyStudyIdChapterIdDelete.Output + /// 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)`. + func broadcastIndex(_ input: Operations.broadcastIndex.Input) async throws -> Operations.broadcastIndex.Output + /// 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)`. + func broadcastTourCreate(_ input: Operations.broadcastTourCreate.Input) async throws -> Operations.broadcastTourCreate.Output + /// 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)`. + func broadcastTourGet(_ input: Operations.broadcastTourGet.Input) async throws -> Operations.broadcastTourGet.Output + /// 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)`. + func broadcastLeaderboardGet(_ input: Operations.broadcastLeaderboardGet.Input) async throws -> Operations.broadcastLeaderboardGet.Output + /// 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)`. + func broadcastTourUpdate(_ input: Operations.broadcastTourUpdate.Input) async throws -> Operations.broadcastTourUpdate.Output + /// 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)`. + func broadcastRoundCreate(_ input: Operations.broadcastRoundCreate.Input) async throws -> Operations.broadcastRoundCreate.Output + /// 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)`. + func broadcastRoundGet(_ input: Operations.broadcastRoundGet.Input) async throws -> Operations.broadcastRoundGet.Output + /// 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)`. + func broadcastRoundUpdate(_ input: Operations.broadcastRoundUpdate.Input) async throws -> Operations.broadcastRoundUpdate.Output + /// 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)`. + func broadcastPush(_ input: Operations.broadcastPush.Input) async throws -> Operations.broadcastPush.Output + /// 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)`. + func broadcastStreamRoundPgn(_ input: Operations.broadcastStreamRoundPgn.Input) async throws -> Operations.broadcastStreamRoundPgn.Output + /// 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)`. + func broadcastRoundPgn(_ input: Operations.broadcastRoundPgn.Input) async throws -> Operations.broadcastRoundPgn.Output + /// 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)`. + func broadcastAllRoundsPgn(_ input: Operations.broadcastAllRoundsPgn.Input) async throws -> Operations.broadcastAllRoundsPgn.Output + /// 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)`. + func broadcastMyRoundsGet(_ input: Operations.broadcastMyRoundsGet.Input) async throws -> Operations.broadcastMyRoundsGet.Output + /// 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)`. + func apiSimul(_ input: Operations.apiSimul.Input) async throws -> Operations.apiSimul.Output + /// 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)`. + func teamShow(_ input: Operations.teamShow.Input) async throws -> Operations.teamShow.Output + /// Get popular teams + /// + /// Paginator of the most popular teams. + /// + /// + /// - Remark: HTTP `GET /api/team/all`. + /// - Remark: Generated from `#/paths//api/team/all/get(teamAll)`. + func teamAll(_ input: Operations.teamAll.Input) async throws -> Operations.teamAll.Output + /// 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)`. + func teamOfUsername(_ input: Operations.teamOfUsername.Input) async throws -> Operations.teamOfUsername.Output + /// 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)`. + func teamSearch(_ input: Operations.teamSearch.Input) async throws -> Operations.teamSearch.Output + /// 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)`. + func teamIdUsers(_ input: Operations.teamIdUsers.Input) async throws -> Operations.teamIdUsers.Output + /// 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)`. + func apiTeamArena(_ input: Operations.apiTeamArena.Input) async throws -> Operations.apiTeamArena.Output + /// 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)`. + func teamIdJoin(_ input: Operations.teamIdJoin.Input) async throws -> Operations.teamIdJoin.Output + /// 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)`. + func teamIdQuit(_ input: Operations.teamIdQuit.Input) async throws -> Operations.teamIdQuit.Output + /// 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)`. + func teamRequests(_ input: Operations.teamRequests.Input) async throws -> Operations.teamRequests.Output + /// 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)`. + func teamRequestAccept(_ input: Operations.teamRequestAccept.Input) async throws -> Operations.teamRequestAccept.Output + /// 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)`. + func teamRequestDecline(_ input: Operations.teamRequestDecline.Input) async throws -> Operations.teamRequestDecline.Output + /// 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)`. + func teamIdKickUserId(_ input: Operations.teamIdKickUserId.Input) async throws -> Operations.teamIdKickUserId.Output + /// 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)`. + func teamIdPmAll(_ input: Operations.teamIdPmAll.Input) async throws -> Operations.teamIdPmAll.Output + /// 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)`. + func streamerLive(_ input: Operations.streamerLive.Input) async throws -> Operations.streamerLive.Output + /// 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)`. + func apiCrosstable(_ input: Operations.apiCrosstable.Input) async throws -> Operations.apiCrosstable.Output + /// Autocomplete usernames + /// + /// Provides autocompletion options for an incomplete username. + /// + /// + /// - Remark: HTTP `GET /api/player/autocomplete`. + /// - Remark: Generated from `#/paths//api/player/autocomplete/get(apiPlayerAutocomplete)`. + func apiPlayerAutocomplete(_ input: Operations.apiPlayerAutocomplete.Input) async throws -> Operations.apiPlayerAutocomplete.Output + /// 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)`. + func readNote(_ input: Operations.readNote.Input) async throws -> Operations.readNote.Output + /// 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)`. + func writeNote(_ input: Operations.writeNote.Input) async throws -> Operations.writeNote.Output + /// 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)`. + func apiUserFollowing(_ input: Operations.apiUserFollowing.Input) async throws -> Operations.apiUserFollowing.Output + /// 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)`. + func followUser(_ input: Operations.followUser.Input) async throws -> Operations.followUser.Output + /// 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)`. + func unfollowUser(_ input: Operations.unfollowUser.Input) async throws -> Operations.unfollowUser.Output + /// 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)`. + func apiStreamEvent(_ input: Operations.apiStreamEvent.Input) async throws -> Operations.apiStreamEvent.Output + /// 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)`. + func apiBoardSeek(_ input: Operations.apiBoardSeek.Input) async throws -> Operations.apiBoardSeek.Output + /// 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)`. + func boardGameStream(_ input: Operations.boardGameStream.Input) async throws -> Operations.boardGameStream.Output + /// 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)`. + func boardGameMove(_ input: Operations.boardGameMove.Input) async throws -> Operations.boardGameMove.Output + /// 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)`. + func boardGameChatGet(_ input: Operations.boardGameChatGet.Input) async throws -> Operations.boardGameChatGet.Output + /// 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)`. + func boardGameChatPost(_ input: Operations.boardGameChatPost.Input) async throws -> Operations.boardGameChatPost.Output + /// 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)`. + func boardGameAbort(_ input: Operations.boardGameAbort.Input) async throws -> Operations.boardGameAbort.Output + /// 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)`. + func boardGameResign(_ input: Operations.boardGameResign.Input) async throws -> Operations.boardGameResign.Output + /// 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)`. + func boardGameDraw(_ input: Operations.boardGameDraw.Input) async throws -> Operations.boardGameDraw.Output + /// 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)`. + func boardGameTakeback(_ input: Operations.boardGameTakeback.Input) async throws -> Operations.boardGameTakeback.Output + /// 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)`. + func boardGameClaimVictory(_ input: Operations.boardGameClaimVictory.Input) async throws -> Operations.boardGameClaimVictory.Output + /// 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)`. + func boardGameBerserk(_ input: Operations.boardGameBerserk.Input) async throws -> Operations.boardGameBerserk.Output + /// 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)`. + func apiBotOnline(_ input: Operations.apiBotOnline.Input) async throws -> Operations.apiBotOnline.Output + /// 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)`. + func botAccountUpgrade(_ input: Operations.botAccountUpgrade.Input) async throws -> Operations.botAccountUpgrade.Output + /// 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)`. + func botGameStream(_ input: Operations.botGameStream.Input) async throws -> Operations.botGameStream.Output + /// 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)`. + func botGameMove(_ input: Operations.botGameMove.Input) async throws -> Operations.botGameMove.Output + /// 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)`. + func botGameChatGet(_ input: Operations.botGameChatGet.Input) async throws -> Operations.botGameChatGet.Output + /// 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)`. + func botGameChat(_ input: Operations.botGameChat.Input) async throws -> Operations.botGameChat.Output + /// 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)`. + func botGameAbort(_ input: Operations.botGameAbort.Input) async throws -> Operations.botGameAbort.Output + /// 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)`. + func botGameResign(_ input: Operations.botGameResign.Input) async throws -> Operations.botGameResign.Output + /// 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)`. + func botGameDraw(_ input: Operations.botGameDraw.Input) async throws -> Operations.botGameDraw.Output + /// 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)`. + func botGameTakeback(_ input: Operations.botGameTakeback.Input) async throws -> Operations.botGameTakeback.Output + /// 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)`. + func challengeList(_ input: Operations.challengeList.Input) async throws -> Operations.challengeList.Output + /// 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)`. + func challengeCreate(_ input: Operations.challengeCreate.Input) async throws -> Operations.challengeCreate.Output + /// 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)`. + func challengeAccept(_ input: Operations.challengeAccept.Input) async throws -> Operations.challengeAccept.Output + /// Decline a challenge + /// + /// Decline an incoming challenge. + /// + /// + /// - Remark: HTTP `POST /api/challenge/{challengeId}/decline`. + /// - Remark: Generated from `#/paths//api/challenge/{challengeId}/decline/post(challengeDecline)`. + func challengeDecline(_ input: Operations.challengeDecline.Input) async throws -> Operations.challengeDecline.Output + /// 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)`. + func challengeCancel(_ input: Operations.challengeCancel.Input) async throws -> Operations.challengeCancel.Output + /// 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)`. + func challengeAi(_ input: Operations.challengeAi.Input) async throws -> Operations.challengeAi.Output + /// 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)`. + func challengeOpen(_ input: Operations.challengeOpen.Input) async throws -> Operations.challengeOpen.Output + /// 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)`. + func challengeStartClocks(_ input: Operations.challengeStartClocks.Input) async throws -> Operations.challengeStartClocks.Output + /// 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)`. + func bulkPairingList(_ input: Operations.bulkPairingList.Input) async throws -> Operations.bulkPairingList.Output + /// 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)`. + func bulkPairingCreate(_ input: Operations.bulkPairingCreate.Input) async throws -> Operations.bulkPairingCreate.Output + /// 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)`. + func bulkPairingStartClocks(_ input: Operations.bulkPairingStartClocks.Input) async throws -> Operations.bulkPairingStartClocks.Output + /// 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)`. + func bulkPairingGet(_ input: Operations.bulkPairingGet.Input) async throws -> Operations.bulkPairingGet.Output + /// 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)`. + func bulkPairingDelete(_ input: Operations.bulkPairingDelete.Input) async throws -> Operations.bulkPairingDelete.Output + /// 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)`. + func roundAddTime(_ input: Operations.roundAddTime.Input) async throws -> Operations.roundAddTime.Output + /// 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)`. + func adminChallengeTokens(_ input: Operations.adminChallengeTokens.Input) async throws -> Operations.adminChallengeTokens.Output + /// Send a private message + /// + /// Send a private message to another player. + /// + /// + /// - Remark: HTTP `POST /inbox/{username}`. + /// - Remark: Generated from `#/paths//inbox/{username}/post(inboxUsername)`. + func inboxUsername(_ input: Operations.inboxUsername.Input) async throws -> Operations.inboxUsername.Output + /// 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)`. + func apiCloudEval(_ input: Operations.apiCloudEval.Input) async throws -> Operations.apiCloudEval.Output + /// 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)`. + func apiExternalEngineList(_ input: Operations.apiExternalEngineList.Input) async throws -> Operations.apiExternalEngineList.Output + /// 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)`. + func apiExternalEngineCreate(_ input: Operations.apiExternalEngineCreate.Input) async throws -> Operations.apiExternalEngineCreate.Output + /// 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)`. + func apiExternalEngineGet(_ input: Operations.apiExternalEngineGet.Input) async throws -> Operations.apiExternalEngineGet.Output + /// 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)`. + func apiExternalEnginePut(_ input: Operations.apiExternalEnginePut.Input) async throws -> Operations.apiExternalEnginePut.Output + /// Delete external engine + /// + /// Unregisters an external engine. + /// + /// + /// - Remark: HTTP `DELETE /api/external-engine/{id}`. + /// - Remark: Generated from `#/paths//api/external-engine/{id}/delete(apiExternalEngineDelete)`. + func apiExternalEngineDelete(_ input: Operations.apiExternalEngineDelete.Input) async throws -> Operations.apiExternalEngineDelete.Output + /// 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)`. + func apiExternalEngineAnalyse(_ input: Operations.apiExternalEngineAnalyse.Input) async throws -> Operations.apiExternalEngineAnalyse.Output + /// 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)`. + func apiExternalEngineAcquire(_ input: Operations.apiExternalEngineAcquire.Input) async throws -> Operations.apiExternalEngineAcquire.Output + /// 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)`. + func apiExternalEngineSubmit(_ input: Operations.apiExternalEngineSubmit.Input) async throws -> Operations.apiExternalEngineSubmit.Output + /// 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)`. + func oauth(_ input: Operations.oauth.Input) async throws -> Operations.oauth.Output + /// 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)`. + func apiToken(_ input: Operations.apiToken.Input) async throws -> Operations.apiToken.Output + /// 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)`. + func apiTokenDelete(_ input: Operations.apiTokenDelete.Input) async throws -> Operations.apiTokenDelete.Output + /// 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)`. + func tokenTest(_ input: Operations.tokenTest.Input) async throws -> Operations.tokenTest.Output + /// 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)`. + func openingExplorerMaster(_ input: Operations.openingExplorerMaster.Input) async throws -> Operations.openingExplorerMaster.Output + /// 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)`. + func openingExplorerLichess(_ input: Operations.openingExplorerLichess.Input) async throws -> Operations.openingExplorerLichess.Output + /// 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)`. + func openingExplorerPlayer(_ input: Operations.openingExplorerPlayer.Input) async throws -> Operations.openingExplorerPlayer.Output + /// 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)`. + func openingExplorerMasterGame(_ input: Operations.openingExplorerMasterGame.Input) async throws -> Operations.openingExplorerMasterGame.Output + /// 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)`. + func tablebaseStandard(_ input: Operations.tablebaseStandard.Input) async throws -> Operations.tablebaseStandard.Output + /// Tablebase lookup for Atomic chess + /// + /// **Endpoint: <https://tablebase.lichess.ovh>** + /// + /// + /// - Remark: HTTP `GET /atomic`. + /// - Remark: Generated from `#/paths//atomic/get(tablebaseAtomic)`. + func tablebaseAtomic(_ input: Operations.tablebaseAtomic.Input) async throws -> Operations.tablebaseAtomic.Output + /// Tablebase lookup for Antichess + /// + /// **Endpoint: <https://tablebase.lichess.ovh>** + /// + /// + /// - Remark: HTTP `GET /antichess`. + /// - Remark: Generated from `#/paths//antichess/get(antichessAtomic)`. + func antichessAtomic(_ input: Operations.antichessAtomic.Input) async throws -> Operations.antichessAtomic.Output +} + +/// Convenience overloads for operation inputs. +extension APIProtocol { + /// 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( + query: Operations.apiUsersStatus.Input.Query, + headers: Operations.apiUsersStatus.Input.Headers = .init() + ) async throws -> Operations.apiUsersStatus.Output { + try await apiUsersStatus(Operations.apiUsersStatus.Input( + query: query, + headers: headers + )) + } + /// 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(headers: Operations.player.Input.Headers = .init()) async throws -> Operations.player.Output { + try await player(Operations.player.Input(headers: headers)) + } + /// 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( + path: Operations.playerTopNbPerfType.Input.Path, + headers: Operations.playerTopNbPerfType.Input.Headers = .init() + ) async throws -> Operations.playerTopNbPerfType.Output { + try await playerTopNbPerfType(Operations.playerTopNbPerfType.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.apiUser.Input.Path, + query: Operations.apiUser.Input.Query = .init(), + headers: Operations.apiUser.Input.Headers = .init() + ) async throws -> Operations.apiUser.Output { + try await apiUser(Operations.apiUser.Input( + path: path, + query: query, + headers: headers + )) + } + /// 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( + path: Operations.apiUserRatingHistory.Input.Path, + headers: Operations.apiUserRatingHistory.Input.Headers = .init() + ) async throws -> Operations.apiUserRatingHistory.Output { + try await apiUserRatingHistory(Operations.apiUserRatingHistory.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.apiUserPerf.Input.Path, + headers: Operations.apiUserPerf.Input.Headers = .init() + ) async throws -> Operations.apiUserPerf.Output { + try await apiUserPerf(Operations.apiUserPerf.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.apiUserActivity.Input.Path, + headers: Operations.apiUserActivity.Input.Headers = .init() + ) async throws -> Operations.apiUserActivity.Output { + try await apiUserActivity(Operations.apiUserActivity.Input( + path: path, + headers: headers + )) + } + /// 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(headers: Operations.apiPuzzleDaily.Input.Headers = .init()) async throws -> Operations.apiPuzzleDaily.Output { + try await apiPuzzleDaily(Operations.apiPuzzleDaily.Input(headers: headers)) + } + /// 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( + path: Operations.apiPuzzleId.Input.Path, + headers: Operations.apiPuzzleId.Input.Headers = .init() + ) async throws -> Operations.apiPuzzleId.Output { + try await apiPuzzleId(Operations.apiPuzzleId.Input( + path: path, + headers: headers + )) + } + /// 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( + query: Operations.apiPuzzleActivity.Input.Query = .init(), + headers: Operations.apiPuzzleActivity.Input.Headers = .init() + ) async throws -> Operations.apiPuzzleActivity.Output { + try await apiPuzzleActivity(Operations.apiPuzzleActivity.Input( + query: query, + headers: headers + )) + } + /// 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( + path: Operations.apiPuzzleDashboard.Input.Path, + headers: Operations.apiPuzzleDashboard.Input.Headers = .init() + ) async throws -> Operations.apiPuzzleDashboard.Output { + try await apiPuzzleDashboard(Operations.apiPuzzleDashboard.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.apiStormDashboard.Input.Path, + query: Operations.apiStormDashboard.Input.Query = .init(), + headers: Operations.apiStormDashboard.Input.Headers = .init() + ) async throws -> Operations.apiStormDashboard.Output { + try await apiStormDashboard(Operations.apiStormDashboard.Input( + path: path, + query: query, + headers: headers + )) + } + /// 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(headers: Operations.racerPost.Input.Headers = .init()) async throws -> Operations.racerPost.Output { + try await racerPost(Operations.racerPost.Input(headers: headers)) + } + /// 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( + headers: Operations.apiUsers.Input.Headers = .init(), + body: Operations.apiUsers.Input.Body + ) async throws -> Operations.apiUsers.Output { + try await apiUsers(Operations.apiUsers.Input( + headers: headers, + body: body + )) + } + /// 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(headers: Operations.accountMe.Input.Headers = .init()) async throws -> Operations.accountMe.Output { + try await accountMe(Operations.accountMe.Input(headers: headers)) + } + /// 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(headers: Operations.accountEmail.Input.Headers = .init()) async throws -> Operations.accountEmail.Output { + try await accountEmail(Operations.accountEmail.Input(headers: headers)) + } + /// 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(headers: Operations.account.Input.Headers = .init()) async throws -> Operations.account.Output { + try await account(Operations.account.Input(headers: headers)) + } + /// 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(headers: Operations.accountKid.Input.Headers = .init()) async throws -> Operations.accountKid.Output { + try await accountKid(Operations.accountKid.Input(headers: headers)) + } + /// 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( + query: Operations.accountKidPost.Input.Query, + headers: Operations.accountKidPost.Input.Headers = .init() + ) async throws -> Operations.accountKidPost.Output { + try await accountKidPost(Operations.accountKidPost.Input( + query: query, + headers: headers + )) + } + /// 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( + query: Operations.timeline.Input.Query = .init(), + headers: Operations.timeline.Input.Headers = .init() + ) async throws -> Operations.timeline.Output { + try await timeline(Operations.timeline.Input( + query: query, + headers: headers + )) + } + /// 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( + path: Operations.gamePgn.Input.Path, + query: Operations.gamePgn.Input.Query = .init(), + headers: Operations.gamePgn.Input.Headers = .init() + ) async throws -> Operations.gamePgn.Output { + try await gamePgn(Operations.gamePgn.Input( + path: path, + query: query, + headers: headers + )) + } + /// 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( + path: Operations.apiUserCurrentGame.Input.Path, + query: Operations.apiUserCurrentGame.Input.Query = .init(), + headers: Operations.apiUserCurrentGame.Input.Headers = .init() + ) async throws -> Operations.apiUserCurrentGame.Output { + try await apiUserCurrentGame(Operations.apiUserCurrentGame.Input( + path: path, + query: query, + headers: headers + )) + } + /// 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( + path: Operations.apiGamesUser.Input.Path, + query: Operations.apiGamesUser.Input.Query = .init(), + headers: Operations.apiGamesUser.Input.Headers = .init() + ) async throws -> Operations.apiGamesUser.Output { + try await apiGamesUser(Operations.apiGamesUser.Input( + path: path, + query: query, + headers: headers + )) + } + /// 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( + query: Operations.gamesExportIds.Input.Query = .init(), + headers: Operations.gamesExportIds.Input.Headers = .init(), + body: Operations.gamesExportIds.Input.Body + ) async throws -> Operations.gamesExportIds.Output { + try await gamesExportIds(Operations.gamesExportIds.Input( + query: query, + headers: headers, + body: body + )) + } + /// 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( + query: Operations.gamesByUsers.Input.Query = .init(), + headers: Operations.gamesByUsers.Input.Headers = .init(), + body: Operations.gamesByUsers.Input.Body + ) async throws -> Operations.gamesByUsers.Output { + try await gamesByUsers(Operations.gamesByUsers.Input( + query: query, + headers: headers, + body: body + )) + } + /// 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( + path: Operations.gamesByIds.Input.Path, + headers: Operations.gamesByIds.Input.Headers = .init(), + body: Operations.gamesByIds.Input.Body + ) async throws -> Operations.gamesByIds.Output { + try await gamesByIds(Operations.gamesByIds.Input( + path: path, + headers: headers, + body: body + )) + } + /// 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( + path: Operations.gamesByIdsAdd.Input.Path, + headers: Operations.gamesByIdsAdd.Input.Headers = .init(), + body: Operations.gamesByIdsAdd.Input.Body + ) async throws -> Operations.gamesByIdsAdd.Output { + try await gamesByIdsAdd(Operations.gamesByIdsAdd.Input( + path: path, + headers: headers, + body: body + )) + } + /// 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( + query: Operations.apiAccountPlaying.Input.Query = .init(), + headers: Operations.apiAccountPlaying.Input.Headers = .init() + ) async throws -> Operations.apiAccountPlaying.Output { + try await apiAccountPlaying(Operations.apiAccountPlaying.Input( + query: query, + headers: headers + )) + } + /// 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( + path: Operations.streamGame.Input.Path, + headers: Operations.streamGame.Input.Headers = .init() + ) async throws -> Operations.streamGame.Output { + try await streamGame(Operations.streamGame.Input( + path: path, + headers: headers + )) + } + /// 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( + headers: Operations.gameImport.Input.Headers = .init(), + body: Operations.gameImport.Input.Body + ) async throws -> Operations.gameImport.Output { + try await gameImport(Operations.gameImport.Input( + headers: headers, + body: body + )) + } + /// 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(headers: Operations.apiImportedGamesUser.Input.Headers = .init()) async throws -> Operations.apiImportedGamesUser.Output { + try await apiImportedGamesUser(Operations.apiImportedGamesUser.Input(headers: headers)) + } + /// 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(headers: Operations.tvChannels.Input.Headers = .init()) async throws -> Operations.tvChannels.Output { + try await tvChannels(Operations.tvChannels.Input(headers: headers)) + } + /// 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(headers: Operations.tvFeed.Input.Headers = .init()) async throws -> Operations.tvFeed.Output { + try await tvFeed(Operations.tvFeed.Input(headers: headers)) + } + /// 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( + path: Operations.tvChannelFeed.Input.Path, + headers: Operations.tvChannelFeed.Input.Headers = .init() + ) async throws -> Operations.tvChannelFeed.Output { + try await tvChannelFeed(Operations.tvChannelFeed.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.tvChannelGames.Input.Path, + query: Operations.tvChannelGames.Input.Query = .init(), + headers: Operations.tvChannelGames.Input.Headers = .init() + ) async throws -> Operations.tvChannelGames.Output { + try await tvChannelGames(Operations.tvChannelGames.Input( + path: path, + query: query, + headers: headers + )) + } + /// 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(headers: Operations.apiTournament.Input.Headers = .init()) async throws -> Operations.apiTournament.Output { + try await apiTournament(Operations.apiTournament.Input(headers: headers)) + } + /// 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( + headers: Operations.apiTournamentPost.Input.Headers = .init(), + body: Operations.apiTournamentPost.Input.Body + ) async throws -> Operations.apiTournamentPost.Output { + try await apiTournamentPost(Operations.apiTournamentPost.Input( + headers: headers, + body: body + )) + } + /// 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( + path: Operations.tournament.Input.Path, + query: Operations.tournament.Input.Query = .init(), + headers: Operations.tournament.Input.Headers = .init() + ) async throws -> Operations.tournament.Output { + try await tournament(Operations.tournament.Input( + path: path, + query: query, + headers: headers + )) + } + /// 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( + path: Operations.apiTournamentUpdate.Input.Path, + headers: Operations.apiTournamentUpdate.Input.Headers = .init(), + body: Operations.apiTournamentUpdate.Input.Body + ) async throws -> Operations.apiTournamentUpdate.Output { + try await apiTournamentUpdate(Operations.apiTournamentUpdate.Input( + path: path, + headers: headers, + body: body + )) + } + /// 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( + path: Operations.apiTournamentJoin.Input.Path, + headers: Operations.apiTournamentJoin.Input.Headers = .init(), + body: Operations.apiTournamentJoin.Input.Body + ) async throws -> Operations.apiTournamentJoin.Output { + try await apiTournamentJoin(Operations.apiTournamentJoin.Input( + path: path, + headers: headers, + body: body + )) + } + /// 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( + path: Operations.apiTournamentWithdraw.Input.Path, + headers: Operations.apiTournamentWithdraw.Input.Headers = .init() + ) async throws -> Operations.apiTournamentWithdraw.Output { + try await apiTournamentWithdraw(Operations.apiTournamentWithdraw.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.apiTournamentTerminate.Input.Path, + headers: Operations.apiTournamentTerminate.Input.Headers = .init() + ) async throws -> Operations.apiTournamentTerminate.Output { + try await apiTournamentTerminate(Operations.apiTournamentTerminate.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.apiTournamentTeamBattlePost.Input.Path, + headers: Operations.apiTournamentTeamBattlePost.Input.Headers = .init(), + body: Operations.apiTournamentTeamBattlePost.Input.Body + ) async throws -> Operations.apiTournamentTeamBattlePost.Output { + try await apiTournamentTeamBattlePost(Operations.apiTournamentTeamBattlePost.Input( + path: path, + headers: headers, + body: body + )) + } + /// 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( + path: Operations.gamesByTournament.Input.Path, + query: Operations.gamesByTournament.Input.Query = .init(), + headers: Operations.gamesByTournament.Input.Headers = .init() + ) async throws -> Operations.gamesByTournament.Output { + try await gamesByTournament(Operations.gamesByTournament.Input( + path: path, + query: query, + headers: headers + )) + } + /// 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( + path: Operations.resultsByTournament.Input.Path, + query: Operations.resultsByTournament.Input.Query = .init(), + headers: Operations.resultsByTournament.Input.Headers = .init() + ) async throws -> Operations.resultsByTournament.Output { + try await resultsByTournament(Operations.resultsByTournament.Input( + path: path, + query: query, + headers: headers + )) + } + /// 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( + path: Operations.teamsByTournament.Input.Path, + headers: Operations.teamsByTournament.Input.Headers = .init() + ) async throws -> Operations.teamsByTournament.Output { + try await teamsByTournament(Operations.teamsByTournament.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.apiUserNameTournamentCreated.Input.Path, + query: Operations.apiUserNameTournamentCreated.Input.Query = .init(), + headers: Operations.apiUserNameTournamentCreated.Input.Headers = .init() + ) async throws -> Operations.apiUserNameTournamentCreated.Output { + try await apiUserNameTournamentCreated(Operations.apiUserNameTournamentCreated.Input( + path: path, + query: query, + headers: headers + )) + } + /// 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( + path: Operations.apiSwissNew.Input.Path, + headers: Operations.apiSwissNew.Input.Headers = .init(), + body: Operations.apiSwissNew.Input.Body + ) async throws -> Operations.apiSwissNew.Output { + try await apiSwissNew(Operations.apiSwissNew.Input( + path: path, + headers: headers, + body: body + )) + } + /// 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( + path: Operations.swiss.Input.Path, + headers: Operations.swiss.Input.Headers = .init() + ) async throws -> Operations.swiss.Output { + try await swiss(Operations.swiss.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.apiSwissUpdate.Input.Path, + headers: Operations.apiSwissUpdate.Input.Headers = .init(), + body: Operations.apiSwissUpdate.Input.Body + ) async throws -> Operations.apiSwissUpdate.Output { + try await apiSwissUpdate(Operations.apiSwissUpdate.Input( + path: path, + headers: headers, + body: body + )) + } + /// 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( + path: Operations.apiSwissScheduleNextRound.Input.Path, + headers: Operations.apiSwissScheduleNextRound.Input.Headers = .init(), + body: Operations.apiSwissScheduleNextRound.Input.Body + ) async throws -> Operations.apiSwissScheduleNextRound.Output { + try await apiSwissScheduleNextRound(Operations.apiSwissScheduleNextRound.Input( + path: path, + headers: headers, + body: body + )) + } + /// 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( + path: Operations.apiSwissJoin.Input.Path, + headers: Operations.apiSwissJoin.Input.Headers = .init(), + body: Operations.apiSwissJoin.Input.Body + ) async throws -> Operations.apiSwissJoin.Output { + try await apiSwissJoin(Operations.apiSwissJoin.Input( + path: path, + headers: headers, + body: body + )) + } + /// 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( + path: Operations.apiSwissWithdraw.Input.Path, + headers: Operations.apiSwissWithdraw.Input.Headers = .init() + ) async throws -> Operations.apiSwissWithdraw.Output { + try await apiSwissWithdraw(Operations.apiSwissWithdraw.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.apiSwissTerminate.Input.Path, + headers: Operations.apiSwissTerminate.Input.Headers = .init() + ) async throws -> Operations.apiSwissTerminate.Output { + try await apiSwissTerminate(Operations.apiSwissTerminate.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.swissTrf.Input.Path, + headers: Operations.swissTrf.Input.Headers = .init() + ) async throws -> Operations.swissTrf.Output { + try await swissTrf(Operations.swissTrf.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.gamesBySwiss.Input.Path, + query: Operations.gamesBySwiss.Input.Query = .init(), + headers: Operations.gamesBySwiss.Input.Headers = .init() + ) async throws -> Operations.gamesBySwiss.Output { + try await gamesBySwiss(Operations.gamesBySwiss.Input( + path: path, + query: query, + headers: headers + )) + } + /// 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( + path: Operations.resultsBySwiss.Input.Path, + query: Operations.resultsBySwiss.Input.Query = .init(), + headers: Operations.resultsBySwiss.Input.Headers = .init() + ) async throws -> Operations.resultsBySwiss.Output { + try await resultsBySwiss(Operations.resultsBySwiss.Input( + path: path, + query: query, + headers: headers + )) + } + /// 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( + path: Operations.apiTeamSwiss.Input.Path, + query: Operations.apiTeamSwiss.Input.Query = .init(), + headers: Operations.apiTeamSwiss.Input.Headers = .init() + ) async throws -> Operations.apiTeamSwiss.Output { + try await apiTeamSwiss(Operations.apiTeamSwiss.Input( + path: path, + query: query, + headers: headers + )) + } + /// 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( + path: Operations.studyChapterPgn.Input.Path, + query: Operations.studyChapterPgn.Input.Query = .init(), + headers: Operations.studyChapterPgn.Input.Headers = .init() + ) async throws -> Operations.studyChapterPgn.Output { + try await studyChapterPgn(Operations.studyChapterPgn.Input( + path: path, + query: query, + headers: headers + )) + } + /// 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( + path: Operations.studyAllChaptersPgn.Input.Path, + query: Operations.studyAllChaptersPgn.Input.Query = .init(), + headers: Operations.studyAllChaptersPgn.Input.Headers = .init() + ) async throws -> Operations.studyAllChaptersPgn.Output { + try await studyAllChaptersPgn(Operations.studyAllChaptersPgn.Input( + path: path, + query: query, + headers: headers + )) + } + /// 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(path: Operations.studyAllChaptersHead.Input.Path) async throws -> Operations.studyAllChaptersHead.Output { + try await studyAllChaptersHead(Operations.studyAllChaptersHead.Input(path: path)) + } + /// 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( + path: Operations.apiStudyImportPGN.Input.Path, + headers: Operations.apiStudyImportPGN.Input.Headers = .init(), + body: Operations.apiStudyImportPGN.Input.Body + ) async throws -> Operations.apiStudyImportPGN.Output { + try await apiStudyImportPGN(Operations.apiStudyImportPGN.Input( + path: path, + headers: headers, + body: body + )) + } + /// 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( + path: Operations.studyExportAllPgn.Input.Path, + query: Operations.studyExportAllPgn.Input.Query = .init(), + headers: Operations.studyExportAllPgn.Input.Headers = .init() + ) async throws -> Operations.studyExportAllPgn.Output { + try await studyExportAllPgn(Operations.studyExportAllPgn.Input( + path: path, + query: query, + headers: headers + )) + } + /// 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( + path: Operations.studyListMetadata.Input.Path, + headers: Operations.studyListMetadata.Input.Headers = .init() + ) async throws -> Operations.studyListMetadata.Output { + try await studyListMetadata(Operations.studyListMetadata.Input( + path: path, + headers: headers + )) + } + /// 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(path: Operations.apiStudyStudyIdChapterIdDelete.Input.Path) async throws -> Operations.apiStudyStudyIdChapterIdDelete.Output { + try await apiStudyStudyIdChapterIdDelete(Operations.apiStudyStudyIdChapterIdDelete.Input(path: path)) + } + /// 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( + query: Operations.broadcastIndex.Input.Query = .init(), + headers: Operations.broadcastIndex.Input.Headers = .init() + ) async throws -> Operations.broadcastIndex.Output { + try await broadcastIndex(Operations.broadcastIndex.Input( + query: query, + headers: headers + )) + } + /// 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( + headers: Operations.broadcastTourCreate.Input.Headers = .init(), + body: Operations.broadcastTourCreate.Input.Body + ) async throws -> Operations.broadcastTourCreate.Output { + try await broadcastTourCreate(Operations.broadcastTourCreate.Input( + headers: headers, + body: body + )) + } + /// 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( + path: Operations.broadcastTourGet.Input.Path, + headers: Operations.broadcastTourGet.Input.Headers = .init() + ) async throws -> Operations.broadcastTourGet.Output { + try await broadcastTourGet(Operations.broadcastTourGet.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.broadcastLeaderboardGet.Input.Path, + headers: Operations.broadcastLeaderboardGet.Input.Headers = .init() + ) async throws -> Operations.broadcastLeaderboardGet.Output { + try await broadcastLeaderboardGet(Operations.broadcastLeaderboardGet.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.broadcastTourUpdate.Input.Path, + headers: Operations.broadcastTourUpdate.Input.Headers = .init(), + body: Operations.broadcastTourUpdate.Input.Body + ) async throws -> Operations.broadcastTourUpdate.Output { + try await broadcastTourUpdate(Operations.broadcastTourUpdate.Input( + path: path, + headers: headers, + body: body + )) + } + /// 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( + path: Operations.broadcastRoundCreate.Input.Path, + headers: Operations.broadcastRoundCreate.Input.Headers = .init(), + body: Operations.broadcastRoundCreate.Input.Body + ) async throws -> Operations.broadcastRoundCreate.Output { + try await broadcastRoundCreate(Operations.broadcastRoundCreate.Input( + path: path, + headers: headers, + body: body + )) + } + /// 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( + path: Operations.broadcastRoundGet.Input.Path, + headers: Operations.broadcastRoundGet.Input.Headers = .init() + ) async throws -> Operations.broadcastRoundGet.Output { + try await broadcastRoundGet(Operations.broadcastRoundGet.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.broadcastRoundUpdate.Input.Path, + headers: Operations.broadcastRoundUpdate.Input.Headers = .init(), + body: Operations.broadcastRoundUpdate.Input.Body + ) async throws -> Operations.broadcastRoundUpdate.Output { + try await broadcastRoundUpdate(Operations.broadcastRoundUpdate.Input( + path: path, + headers: headers, + body: body + )) + } + /// 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( + path: Operations.broadcastPush.Input.Path, + headers: Operations.broadcastPush.Input.Headers = .init(), + body: Operations.broadcastPush.Input.Body + ) async throws -> Operations.broadcastPush.Output { + try await broadcastPush(Operations.broadcastPush.Input( + path: path, + headers: headers, + body: body + )) + } + /// 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( + path: Operations.broadcastStreamRoundPgn.Input.Path, + headers: Operations.broadcastStreamRoundPgn.Input.Headers = .init() + ) async throws -> Operations.broadcastStreamRoundPgn.Output { + try await broadcastStreamRoundPgn(Operations.broadcastStreamRoundPgn.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.broadcastRoundPgn.Input.Path, + headers: Operations.broadcastRoundPgn.Input.Headers = .init() + ) async throws -> Operations.broadcastRoundPgn.Output { + try await broadcastRoundPgn(Operations.broadcastRoundPgn.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.broadcastAllRoundsPgn.Input.Path, + headers: Operations.broadcastAllRoundsPgn.Input.Headers = .init() + ) async throws -> Operations.broadcastAllRoundsPgn.Output { + try await broadcastAllRoundsPgn(Operations.broadcastAllRoundsPgn.Input( + path: path, + headers: headers + )) + } + /// 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( + query: Operations.broadcastMyRoundsGet.Input.Query = .init(), + headers: Operations.broadcastMyRoundsGet.Input.Headers = .init() + ) async throws -> Operations.broadcastMyRoundsGet.Output { + try await broadcastMyRoundsGet(Operations.broadcastMyRoundsGet.Input( + query: query, + headers: headers + )) + } + /// 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(headers: Operations.apiSimul.Input.Headers = .init()) async throws -> Operations.apiSimul.Output { + try await apiSimul(Operations.apiSimul.Input(headers: headers)) + } + /// 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( + path: Operations.teamShow.Input.Path, + headers: Operations.teamShow.Input.Headers = .init() + ) async throws -> Operations.teamShow.Output { + try await teamShow(Operations.teamShow.Input( + path: path, + headers: headers + )) + } + /// 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( + query: Operations.teamAll.Input.Query = .init(), + headers: Operations.teamAll.Input.Headers = .init() + ) async throws -> Operations.teamAll.Output { + try await teamAll(Operations.teamAll.Input( + query: query, + headers: headers + )) + } + /// 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( + path: Operations.teamOfUsername.Input.Path, + headers: Operations.teamOfUsername.Input.Headers = .init() + ) async throws -> Operations.teamOfUsername.Output { + try await teamOfUsername(Operations.teamOfUsername.Input( + path: path, + headers: headers + )) + } + /// 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( + query: Operations.teamSearch.Input.Query = .init(), + headers: Operations.teamSearch.Input.Headers = .init() + ) async throws -> Operations.teamSearch.Output { + try await teamSearch(Operations.teamSearch.Input( + query: query, + headers: headers + )) + } + /// 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( + path: Operations.teamIdUsers.Input.Path, + headers: Operations.teamIdUsers.Input.Headers = .init() + ) async throws -> Operations.teamIdUsers.Output { + try await teamIdUsers(Operations.teamIdUsers.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.apiTeamArena.Input.Path, + query: Operations.apiTeamArena.Input.Query = .init(), + headers: Operations.apiTeamArena.Input.Headers = .init() + ) async throws -> Operations.apiTeamArena.Output { + try await apiTeamArena(Operations.apiTeamArena.Input( + path: path, + query: query, + headers: headers + )) + } + /// 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( + path: Operations.teamIdJoin.Input.Path, + headers: Operations.teamIdJoin.Input.Headers = .init(), + body: Operations.teamIdJoin.Input.Body + ) async throws -> Operations.teamIdJoin.Output { + try await teamIdJoin(Operations.teamIdJoin.Input( + path: path, + headers: headers, + body: body + )) + } + /// 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( + path: Operations.teamIdQuit.Input.Path, + headers: Operations.teamIdQuit.Input.Headers = .init() + ) async throws -> Operations.teamIdQuit.Output { + try await teamIdQuit(Operations.teamIdQuit.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.teamRequests.Input.Path, + query: Operations.teamRequests.Input.Query = .init(), + headers: Operations.teamRequests.Input.Headers = .init() + ) async throws -> Operations.teamRequests.Output { + try await teamRequests(Operations.teamRequests.Input( + path: path, + query: query, + headers: headers + )) + } + /// 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( + path: Operations.teamRequestAccept.Input.Path, + headers: Operations.teamRequestAccept.Input.Headers = .init() + ) async throws -> Operations.teamRequestAccept.Output { + try await teamRequestAccept(Operations.teamRequestAccept.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.teamRequestDecline.Input.Path, + headers: Operations.teamRequestDecline.Input.Headers = .init() + ) async throws -> Operations.teamRequestDecline.Output { + try await teamRequestDecline(Operations.teamRequestDecline.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.teamIdKickUserId.Input.Path, + headers: Operations.teamIdKickUserId.Input.Headers = .init() + ) async throws -> Operations.teamIdKickUserId.Output { + try await teamIdKickUserId(Operations.teamIdKickUserId.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.teamIdPmAll.Input.Path, + headers: Operations.teamIdPmAll.Input.Headers = .init(), + body: Operations.teamIdPmAll.Input.Body + ) async throws -> Operations.teamIdPmAll.Output { + try await teamIdPmAll(Operations.teamIdPmAll.Input( + path: path, + headers: headers, + body: body + )) + } + /// 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(headers: Operations.streamerLive.Input.Headers = .init()) async throws -> Operations.streamerLive.Output { + try await streamerLive(Operations.streamerLive.Input(headers: headers)) + } + /// 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( + path: Operations.apiCrosstable.Input.Path, + query: Operations.apiCrosstable.Input.Query = .init(), + headers: Operations.apiCrosstable.Input.Headers = .init() + ) async throws -> Operations.apiCrosstable.Output { + try await apiCrosstable(Operations.apiCrosstable.Input( + path: path, + query: query, + headers: headers + )) + } + /// 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( + query: Operations.apiPlayerAutocomplete.Input.Query, + headers: Operations.apiPlayerAutocomplete.Input.Headers = .init() + ) async throws -> Operations.apiPlayerAutocomplete.Output { + try await apiPlayerAutocomplete(Operations.apiPlayerAutocomplete.Input( + query: query, + headers: headers + )) + } + /// 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( + path: Operations.readNote.Input.Path, + headers: Operations.readNote.Input.Headers = .init() + ) async throws -> Operations.readNote.Output { + try await readNote(Operations.readNote.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.writeNote.Input.Path, + headers: Operations.writeNote.Input.Headers = .init(), + body: Operations.writeNote.Input.Body + ) async throws -> Operations.writeNote.Output { + try await writeNote(Operations.writeNote.Input( + path: path, + headers: headers, + body: body + )) + } + /// 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(headers: Operations.apiUserFollowing.Input.Headers = .init()) async throws -> Operations.apiUserFollowing.Output { + try await apiUserFollowing(Operations.apiUserFollowing.Input(headers: headers)) + } + /// 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( + path: Operations.followUser.Input.Path, + headers: Operations.followUser.Input.Headers = .init() + ) async throws -> Operations.followUser.Output { + try await followUser(Operations.followUser.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.unfollowUser.Input.Path, + headers: Operations.unfollowUser.Input.Headers = .init() + ) async throws -> Operations.unfollowUser.Output { + try await unfollowUser(Operations.unfollowUser.Input( + path: path, + headers: headers + )) + } + /// 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(headers: Operations.apiStreamEvent.Input.Headers = .init()) async throws -> Operations.apiStreamEvent.Output { + try await apiStreamEvent(Operations.apiStreamEvent.Input(headers: headers)) + } + /// 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( + headers: Operations.apiBoardSeek.Input.Headers = .init(), + body: Operations.apiBoardSeek.Input.Body + ) async throws -> Operations.apiBoardSeek.Output { + try await apiBoardSeek(Operations.apiBoardSeek.Input( + headers: headers, + body: body + )) + } + /// 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( + path: Operations.boardGameStream.Input.Path, + headers: Operations.boardGameStream.Input.Headers = .init() + ) async throws -> Operations.boardGameStream.Output { + try await boardGameStream(Operations.boardGameStream.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.boardGameMove.Input.Path, + query: Operations.boardGameMove.Input.Query = .init(), + headers: Operations.boardGameMove.Input.Headers = .init() + ) async throws -> Operations.boardGameMove.Output { + try await boardGameMove(Operations.boardGameMove.Input( + path: path, + query: query, + headers: headers + )) + } + /// 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( + path: Operations.boardGameChatGet.Input.Path, + headers: Operations.boardGameChatGet.Input.Headers = .init() + ) async throws -> Operations.boardGameChatGet.Output { + try await boardGameChatGet(Operations.boardGameChatGet.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.boardGameChatPost.Input.Path, + headers: Operations.boardGameChatPost.Input.Headers = .init(), + body: Operations.boardGameChatPost.Input.Body + ) async throws -> Operations.boardGameChatPost.Output { + try await boardGameChatPost(Operations.boardGameChatPost.Input( + path: path, + headers: headers, + body: body + )) + } + /// 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( + path: Operations.boardGameAbort.Input.Path, + headers: Operations.boardGameAbort.Input.Headers = .init() + ) async throws -> Operations.boardGameAbort.Output { + try await boardGameAbort(Operations.boardGameAbort.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.boardGameResign.Input.Path, + headers: Operations.boardGameResign.Input.Headers = .init() + ) async throws -> Operations.boardGameResign.Output { + try await boardGameResign(Operations.boardGameResign.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.boardGameDraw.Input.Path, + headers: Operations.boardGameDraw.Input.Headers = .init() + ) async throws -> Operations.boardGameDraw.Output { + try await boardGameDraw(Operations.boardGameDraw.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.boardGameTakeback.Input.Path, + headers: Operations.boardGameTakeback.Input.Headers = .init() + ) async throws -> Operations.boardGameTakeback.Output { + try await boardGameTakeback(Operations.boardGameTakeback.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.boardGameClaimVictory.Input.Path, + headers: Operations.boardGameClaimVictory.Input.Headers = .init() + ) async throws -> Operations.boardGameClaimVictory.Output { + try await boardGameClaimVictory(Operations.boardGameClaimVictory.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.boardGameBerserk.Input.Path, + headers: Operations.boardGameBerserk.Input.Headers = .init() + ) async throws -> Operations.boardGameBerserk.Output { + try await boardGameBerserk(Operations.boardGameBerserk.Input( + path: path, + headers: headers + )) + } + /// 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( + query: Operations.apiBotOnline.Input.Query = .init(), + headers: Operations.apiBotOnline.Input.Headers = .init() + ) async throws -> Operations.apiBotOnline.Output { + try await apiBotOnline(Operations.apiBotOnline.Input( + query: query, + headers: headers + )) + } + /// 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(headers: Operations.botAccountUpgrade.Input.Headers = .init()) async throws -> Operations.botAccountUpgrade.Output { + try await botAccountUpgrade(Operations.botAccountUpgrade.Input(headers: headers)) + } + /// 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( + path: Operations.botGameStream.Input.Path, + headers: Operations.botGameStream.Input.Headers = .init() + ) async throws -> Operations.botGameStream.Output { + try await botGameStream(Operations.botGameStream.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.botGameMove.Input.Path, + query: Operations.botGameMove.Input.Query = .init(), + headers: Operations.botGameMove.Input.Headers = .init() + ) async throws -> Operations.botGameMove.Output { + try await botGameMove(Operations.botGameMove.Input( + path: path, + query: query, + headers: headers + )) + } + /// 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( + path: Operations.botGameChatGet.Input.Path, + headers: Operations.botGameChatGet.Input.Headers = .init() + ) async throws -> Operations.botGameChatGet.Output { + try await botGameChatGet(Operations.botGameChatGet.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.botGameChat.Input.Path, + headers: Operations.botGameChat.Input.Headers = .init(), + body: Operations.botGameChat.Input.Body + ) async throws -> Operations.botGameChat.Output { + try await botGameChat(Operations.botGameChat.Input( + path: path, + headers: headers, + body: body + )) + } + /// 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( + path: Operations.botGameAbort.Input.Path, + headers: Operations.botGameAbort.Input.Headers = .init() + ) async throws -> Operations.botGameAbort.Output { + try await botGameAbort(Operations.botGameAbort.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.botGameResign.Input.Path, + headers: Operations.botGameResign.Input.Headers = .init() + ) async throws -> Operations.botGameResign.Output { + try await botGameResign(Operations.botGameResign.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.botGameDraw.Input.Path, + headers: Operations.botGameDraw.Input.Headers = .init() + ) async throws -> Operations.botGameDraw.Output { + try await botGameDraw(Operations.botGameDraw.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.botGameTakeback.Input.Path, + headers: Operations.botGameTakeback.Input.Headers = .init() + ) async throws -> Operations.botGameTakeback.Output { + try await botGameTakeback(Operations.botGameTakeback.Input( + path: path, + headers: headers + )) + } + /// 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(headers: Operations.challengeList.Input.Headers = .init()) async throws -> Operations.challengeList.Output { + try await challengeList(Operations.challengeList.Input(headers: headers)) + } + /// 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( + path: Operations.challengeCreate.Input.Path, + headers: Operations.challengeCreate.Input.Headers = .init(), + body: Operations.challengeCreate.Input.Body + ) async throws -> Operations.challengeCreate.Output { + try await challengeCreate(Operations.challengeCreate.Input( + path: path, + headers: headers, + body: body + )) + } + /// 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( + path: Operations.challengeAccept.Input.Path, + headers: Operations.challengeAccept.Input.Headers = .init() + ) async throws -> Operations.challengeAccept.Output { + try await challengeAccept(Operations.challengeAccept.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.challengeDecline.Input.Path, + headers: Operations.challengeDecline.Input.Headers = .init(), + body: Operations.challengeDecline.Input.Body? = nil + ) async throws -> Operations.challengeDecline.Output { + try await challengeDecline(Operations.challengeDecline.Input( + path: path, + headers: headers, + body: body + )) + } + /// 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( + path: Operations.challengeCancel.Input.Path, + query: Operations.challengeCancel.Input.Query = .init(), + headers: Operations.challengeCancel.Input.Headers = .init() + ) async throws -> Operations.challengeCancel.Output { + try await challengeCancel(Operations.challengeCancel.Input( + path: path, + query: query, + headers: headers + )) + } + /// 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( + headers: Operations.challengeAi.Input.Headers = .init(), + body: Operations.challengeAi.Input.Body + ) async throws -> Operations.challengeAi.Output { + try await challengeAi(Operations.challengeAi.Input( + headers: headers, + body: body + )) + } + /// 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( + headers: Operations.challengeOpen.Input.Headers = .init(), + body: Operations.challengeOpen.Input.Body + ) async throws -> Operations.challengeOpen.Output { + try await challengeOpen(Operations.challengeOpen.Input( + headers: headers, + body: body + )) + } + /// 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( + path: Operations.challengeStartClocks.Input.Path, + query: Operations.challengeStartClocks.Input.Query = .init(), + headers: Operations.challengeStartClocks.Input.Headers = .init() + ) async throws -> Operations.challengeStartClocks.Output { + try await challengeStartClocks(Operations.challengeStartClocks.Input( + path: path, + query: query, + headers: headers + )) + } + /// 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(headers: Operations.bulkPairingList.Input.Headers = .init()) async throws -> Operations.bulkPairingList.Output { + try await bulkPairingList(Operations.bulkPairingList.Input(headers: headers)) + } + /// 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( + headers: Operations.bulkPairingCreate.Input.Headers = .init(), + body: Operations.bulkPairingCreate.Input.Body + ) async throws -> Operations.bulkPairingCreate.Output { + try await bulkPairingCreate(Operations.bulkPairingCreate.Input( + headers: headers, + body: body + )) + } + /// 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( + path: Operations.bulkPairingStartClocks.Input.Path, + headers: Operations.bulkPairingStartClocks.Input.Headers = .init() + ) async throws -> Operations.bulkPairingStartClocks.Output { + try await bulkPairingStartClocks(Operations.bulkPairingStartClocks.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.bulkPairingGet.Input.Path, + headers: Operations.bulkPairingGet.Input.Headers = .init() + ) async throws -> Operations.bulkPairingGet.Output { + try await bulkPairingGet(Operations.bulkPairingGet.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.bulkPairingDelete.Input.Path, + headers: Operations.bulkPairingDelete.Input.Headers = .init() + ) async throws -> Operations.bulkPairingDelete.Output { + try await bulkPairingDelete(Operations.bulkPairingDelete.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.roundAddTime.Input.Path, + headers: Operations.roundAddTime.Input.Headers = .init() + ) async throws -> Operations.roundAddTime.Output { + try await roundAddTime(Operations.roundAddTime.Input( + path: path, + headers: headers + )) + } + /// 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( + headers: Operations.adminChallengeTokens.Input.Headers = .init(), + body: Operations.adminChallengeTokens.Input.Body + ) async throws -> Operations.adminChallengeTokens.Output { + try await adminChallengeTokens(Operations.adminChallengeTokens.Input( + headers: headers, + body: body + )) + } + /// 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( + path: Operations.inboxUsername.Input.Path, + headers: Operations.inboxUsername.Input.Headers = .init(), + body: Operations.inboxUsername.Input.Body + ) async throws -> Operations.inboxUsername.Output { + try await inboxUsername(Operations.inboxUsername.Input( + path: path, + headers: headers, + body: body + )) + } + /// 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( + query: Operations.apiCloudEval.Input.Query, + headers: Operations.apiCloudEval.Input.Headers = .init() + ) async throws -> Operations.apiCloudEval.Output { + try await apiCloudEval(Operations.apiCloudEval.Input( + query: query, + headers: headers + )) + } + /// 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(headers: Operations.apiExternalEngineList.Input.Headers = .init()) async throws -> Operations.apiExternalEngineList.Output { + try await apiExternalEngineList(Operations.apiExternalEngineList.Input(headers: headers)) + } + /// 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( + headers: Operations.apiExternalEngineCreate.Input.Headers = .init(), + body: Operations.apiExternalEngineCreate.Input.Body + ) async throws -> Operations.apiExternalEngineCreate.Output { + try await apiExternalEngineCreate(Operations.apiExternalEngineCreate.Input( + headers: headers, + body: body + )) + } + /// 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( + path: Operations.apiExternalEngineGet.Input.Path, + headers: Operations.apiExternalEngineGet.Input.Headers = .init() + ) async throws -> Operations.apiExternalEngineGet.Output { + try await apiExternalEngineGet(Operations.apiExternalEngineGet.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.apiExternalEnginePut.Input.Path, + headers: Operations.apiExternalEnginePut.Input.Headers = .init(), + body: Operations.apiExternalEnginePut.Input.Body + ) async throws -> Operations.apiExternalEnginePut.Output { + try await apiExternalEnginePut(Operations.apiExternalEnginePut.Input( + path: path, + headers: headers, + body: body + )) + } + /// 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( + path: Operations.apiExternalEngineDelete.Input.Path, + headers: Operations.apiExternalEngineDelete.Input.Headers = .init() + ) async throws -> Operations.apiExternalEngineDelete.Output { + try await apiExternalEngineDelete(Operations.apiExternalEngineDelete.Input( + path: path, + headers: headers + )) + } + /// 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( + path: Operations.apiExternalEngineAnalyse.Input.Path, + headers: Operations.apiExternalEngineAnalyse.Input.Headers = .init(), + body: Operations.apiExternalEngineAnalyse.Input.Body + ) async throws -> Operations.apiExternalEngineAnalyse.Output { + try await apiExternalEngineAnalyse(Operations.apiExternalEngineAnalyse.Input( + path: path, + headers: headers, + body: body + )) + } + /// 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( + headers: Operations.apiExternalEngineAcquire.Input.Headers = .init(), + body: Operations.apiExternalEngineAcquire.Input.Body + ) async throws -> Operations.apiExternalEngineAcquire.Output { + try await apiExternalEngineAcquire(Operations.apiExternalEngineAcquire.Input( + headers: headers, + body: body + )) + } + /// 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( + path: Operations.apiExternalEngineSubmit.Input.Path, + body: Operations.apiExternalEngineSubmit.Input.Body + ) async throws -> Operations.apiExternalEngineSubmit.Output { + try await apiExternalEngineSubmit(Operations.apiExternalEngineSubmit.Input( + path: path, + body: body + )) + } + /// 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(query: Operations.oauth.Input.Query) async throws -> Operations.oauth.Output { + try await oauth(Operations.oauth.Input(query: query)) + } + /// 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( + headers: Operations.apiToken.Input.Headers = .init(), + body: Operations.apiToken.Input.Body + ) async throws -> Operations.apiToken.Output { + try await apiToken(Operations.apiToken.Input( + headers: headers, + body: body + )) + } + /// 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() async throws -> Operations.apiTokenDelete.Output { + try await apiTokenDelete(Operations.apiTokenDelete.Input()) + } + /// 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( + headers: Operations.tokenTest.Input.Headers = .init(), + body: Operations.tokenTest.Input.Body + ) async throws -> Operations.tokenTest.Output { + try await tokenTest(Operations.tokenTest.Input( + headers: headers, + body: body + )) + } + /// 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( + query: Operations.openingExplorerMaster.Input.Query = .init(), + headers: Operations.openingExplorerMaster.Input.Headers = .init() + ) async throws -> Operations.openingExplorerMaster.Output { + try await openingExplorerMaster(Operations.openingExplorerMaster.Input( + query: query, + headers: headers + )) + } + /// 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( + query: Operations.openingExplorerLichess.Input.Query = .init(), + headers: Operations.openingExplorerLichess.Input.Headers = .init() + ) async throws -> Operations.openingExplorerLichess.Output { + try await openingExplorerLichess(Operations.openingExplorerLichess.Input( + query: query, + headers: headers + )) + } + /// 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( + query: Operations.openingExplorerPlayer.Input.Query = .init(), + headers: Operations.openingExplorerPlayer.Input.Headers = .init() + ) async throws -> Operations.openingExplorerPlayer.Output { + try await openingExplorerPlayer(Operations.openingExplorerPlayer.Input( + query: query, + headers: headers + )) + } + /// 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( + path: Operations.openingExplorerMasterGame.Input.Path, + headers: Operations.openingExplorerMasterGame.Input.Headers = .init() + ) async throws -> Operations.openingExplorerMasterGame.Output { + try await openingExplorerMasterGame(Operations.openingExplorerMasterGame.Input( + path: path, + headers: headers + )) + } + /// 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( + query: Operations.tablebaseStandard.Input.Query, + headers: Operations.tablebaseStandard.Input.Headers = .init() + ) async throws -> Operations.tablebaseStandard.Output { + try await tablebaseStandard(Operations.tablebaseStandard.Input( + query: query, + headers: headers + )) + } + /// Tablebase lookup for Atomic chess + /// + /// **Endpoint: <https://tablebase.lichess.ovh>** + /// + /// + /// - Remark: HTTP `GET /atomic`. + /// - Remark: Generated from `#/paths//atomic/get(tablebaseAtomic)`. + internal func tablebaseAtomic(headers: Operations.tablebaseAtomic.Input.Headers = .init()) async throws -> Operations.tablebaseAtomic.Output { + try await tablebaseAtomic(Operations.tablebaseAtomic.Input(headers: headers)) + } + /// Tablebase lookup for Antichess + /// + /// **Endpoint: <https://tablebase.lichess.ovh>** + /// + /// + /// - Remark: HTTP `GET /antichess`. + /// - Remark: Generated from `#/paths//antichess/get(antichessAtomic)`. + internal func antichessAtomic(headers: Operations.antichessAtomic.Input.Headers = .init()) async throws -> Operations.antichessAtomic.Output { + try await antichessAtomic(Operations.antichessAtomic.Input(headers: headers)) + } +} + +/// Server URLs defined in the OpenAPI document. +internal enum Servers { + internal static func server1() throws -> Foundation.URL { + try Foundation.URL( + validatingOpenAPIServerURL: "https://lichess.org", + variables: [] + ) + } +} + +/// Types generated from the components section of the OpenAPI document. +internal enum Components { + /// Types generated from the `#/components/schemas` section of the OpenAPI document. + internal enum Schemas { + /// - Remark: Generated from `#/components/schemas/Top10s`. + internal typealias Top10s = OpenAPIRuntime.OpenAPIValueContainer + /// - Remark: Generated from `#/components/schemas/Leaderboard`. + internal typealias Leaderboard = OpenAPIRuntime.OpenAPIValueContainer + /// - Remark: Generated from `#/components/schemas/Perf`. + internal struct Perf: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/Perf/games`. + internal var games: Swift.Int? + /// - Remark: Generated from `#/components/schemas/Perf/rating`. + internal var rating: Swift.Int? + /// - Remark: Generated from `#/components/schemas/Perf/rd`. + internal var rd: Swift.Int? + /// - Remark: Generated from `#/components/schemas/Perf/prog`. + internal var prog: Swift.Int? + /// only appears if a user's perf rating are [provisional](https://lichess.org/faq#provisional) + /// + /// - Remark: Generated from `#/components/schemas/Perf/prov`. + internal var prov: Swift.Bool? + /// Creates a new `Perf`. + /// + /// - Parameters: + /// - games: + /// - rating: + /// - rd: + /// - prog: + /// - prov: only appears if a user's perf rating are [provisional](https://lichess.org/faq#provisional) + internal init( + games: Swift.Int? = nil, + rating: Swift.Int? = nil, + rd: Swift.Int? = nil, + prog: Swift.Int? = nil, + prov: Swift.Bool? = nil + ) { + self.games = games + self.rating = rating + self.rd = rd + self.prog = prog + self.prov = prov + } + internal enum CodingKeys: String, CodingKey { + case games + case rating + case rd + case prog + case prov + } + } + /// - Remark: Generated from `#/components/schemas/PuzzleModePerf`. + internal struct PuzzleModePerf: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/PuzzleModePerf/runs`. + internal var runs: Swift.Int? + /// - Remark: Generated from `#/components/schemas/PuzzleModePerf/score`. + internal var score: Swift.Int? + /// Creates a new `PuzzleModePerf`. + /// + /// - Parameters: + /// - runs: + /// - score: + internal init( + runs: Swift.Int? = nil, + score: Swift.Int? = nil + ) { + self.runs = runs + self.score = score + } + internal enum CodingKeys: String, CodingKey { + case runs + case score + } + } + /// - Remark: Generated from `#/components/schemas/Perfs`. + internal struct Perfs: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/Perfs/chess960`. + internal var chess960: Components.Schemas.Perf? + /// - Remark: Generated from `#/components/schemas/Perfs/atomic`. + internal var atomic: Components.Schemas.Perf? + /// - Remark: Generated from `#/components/schemas/Perfs/racingKings`. + internal var racingKings: Components.Schemas.Perf? + /// - Remark: Generated from `#/components/schemas/Perfs/ultraBullet`. + internal var ultraBullet: Components.Schemas.Perf? + /// - Remark: Generated from `#/components/schemas/Perfs/blitz`. + internal var blitz: Components.Schemas.Perf? + /// - Remark: Generated from `#/components/schemas/Perfs/kingOfTheHill`. + internal var kingOfTheHill: Components.Schemas.Perf? + /// - Remark: Generated from `#/components/schemas/Perfs/bullet`. + internal var bullet: Components.Schemas.Perf? + /// - Remark: Generated from `#/components/schemas/Perfs/correspondence`. + internal var correspondence: Components.Schemas.Perf? + /// - Remark: Generated from `#/components/schemas/Perfs/horde`. + internal var horde: Components.Schemas.Perf? + /// - Remark: Generated from `#/components/schemas/Perfs/puzzle`. + internal var puzzle: Components.Schemas.Perf? + /// - Remark: Generated from `#/components/schemas/Perfs/classical`. + internal var classical: Components.Schemas.Perf? + /// - Remark: Generated from `#/components/schemas/Perfs/rapid`. + internal var rapid: Components.Schemas.Perf? + /// - Remark: Generated from `#/components/schemas/Perfs/storm`. + internal var storm: Components.Schemas.PuzzleModePerf? + /// - Remark: Generated from `#/components/schemas/Perfs/racer`. + internal var racer: Components.Schemas.PuzzleModePerf? + /// - Remark: Generated from `#/components/schemas/Perfs/streak`. + internal var streak: Components.Schemas.PuzzleModePerf? + /// Creates a new `Perfs`. + /// + /// - Parameters: + /// - chess960: + /// - atomic: + /// - racingKings: + /// - ultraBullet: + /// - blitz: + /// - kingOfTheHill: + /// - bullet: + /// - correspondence: + /// - horde: + /// - puzzle: + /// - classical: + /// - rapid: + /// - storm: + /// - racer: + /// - streak: + internal init( + chess960: Components.Schemas.Perf? = nil, + atomic: Components.Schemas.Perf? = nil, + racingKings: Components.Schemas.Perf? = nil, + ultraBullet: Components.Schemas.Perf? = nil, + blitz: Components.Schemas.Perf? = nil, + kingOfTheHill: Components.Schemas.Perf? = nil, + bullet: Components.Schemas.Perf? = nil, + correspondence: Components.Schemas.Perf? = nil, + horde: Components.Schemas.Perf? = nil, + puzzle: Components.Schemas.Perf? = nil, + classical: Components.Schemas.Perf? = nil, + rapid: Components.Schemas.Perf? = nil, + storm: Components.Schemas.PuzzleModePerf? = nil, + racer: Components.Schemas.PuzzleModePerf? = nil, + streak: Components.Schemas.PuzzleModePerf? = nil + ) { + self.chess960 = chess960 + self.atomic = atomic + self.racingKings = racingKings + self.ultraBullet = ultraBullet + self.blitz = blitz + self.kingOfTheHill = kingOfTheHill + self.bullet = bullet + self.correspondence = correspondence + self.horde = horde + self.puzzle = puzzle + self.classical = classical + self.rapid = rapid + self.storm = storm + self.racer = racer + self.streak = streak + } + internal enum CodingKeys: String, CodingKey { + case chess960 + case atomic + case racingKings + case ultraBullet + case blitz + case kingOfTheHill + case bullet + case correspondence + case horde + case puzzle + case classical + case rapid + case storm + case racer + case streak + } + } + /// - Remark: Generated from `#/components/schemas/Profile`. + internal struct Profile: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/Profile/country`. + internal var country: Swift.String? + /// - Remark: Generated from `#/components/schemas/Profile/location`. + internal var location: Swift.String? + /// - Remark: Generated from `#/components/schemas/Profile/bio`. + internal var bio: Swift.String? + /// - Remark: Generated from `#/components/schemas/Profile/firstName`. + internal var firstName: Swift.String? + /// - Remark: Generated from `#/components/schemas/Profile/lastName`. + internal var lastName: Swift.String? + /// only appears if a user has set them + /// + /// - Remark: Generated from `#/components/schemas/Profile/fideRating`. + internal var fideRating: Swift.Int? + /// only appears if a user has set them + /// + /// - Remark: Generated from `#/components/schemas/Profile/uscfRating`. + internal var uscfRating: Swift.Int? + /// only appears if a user has set them + /// + /// - Remark: Generated from `#/components/schemas/Profile/ecfRating`. + internal var ecfRating: Swift.Int? + /// only appears if a user has set them + /// + /// - Remark: Generated from `#/components/schemas/Profile/cfcRating`. + internal var cfcRating: Swift.Int? + /// only appears if a user has set them + /// + /// - Remark: Generated from `#/components/schemas/Profile/dsbRating`. + internal var dsbRating: Swift.Int? + /// - Remark: Generated from `#/components/schemas/Profile/links`. + internal var links: Swift.String? + /// Creates a new `Profile`. + /// + /// - Parameters: + /// - country: + /// - location: + /// - bio: + /// - firstName: + /// - lastName: + /// - fideRating: only appears if a user has set them + /// - uscfRating: only appears if a user has set them + /// - ecfRating: only appears if a user has set them + /// - cfcRating: only appears if a user has set them + /// - dsbRating: only appears if a user has set them + /// - links: + internal init( + country: Swift.String? = nil, + location: Swift.String? = nil, + bio: Swift.String? = nil, + firstName: Swift.String? = nil, + lastName: Swift.String? = nil, + fideRating: Swift.Int? = nil, + uscfRating: Swift.Int? = nil, + ecfRating: Swift.Int? = nil, + cfcRating: Swift.Int? = nil, + dsbRating: Swift.Int? = nil, + links: Swift.String? = nil + ) { + self.country = country + self.location = location + self.bio = bio + self.firstName = firstName + self.lastName = lastName + self.fideRating = fideRating + self.uscfRating = uscfRating + self.ecfRating = ecfRating + self.cfcRating = cfcRating + self.dsbRating = dsbRating + self.links = links + } + internal enum CodingKeys: String, CodingKey { + case country + case location + case bio + case firstName + case lastName + case fideRating + case uscfRating + case ecfRating + case cfcRating + case dsbRating + case links + } + } + /// - Remark: Generated from `#/components/schemas/PlayTime`. + internal struct PlayTime: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/PlayTime/total`. + internal var total: Swift.Int? + /// - Remark: Generated from `#/components/schemas/PlayTime/tv`. + internal var tv: Swift.Int? + /// Creates a new `PlayTime`. + /// + /// - Parameters: + /// - total: + /// - tv: + internal init( + total: Swift.Int? = nil, + tv: Swift.Int? = nil + ) { + self.total = total + self.tv = tv + } + internal enum CodingKeys: String, CodingKey { + case total + case tv + } + } + /// only appears if the user is a titled player or a bot user + /// + /// - Remark: Generated from `#/components/schemas/Title`. + @frozen internal enum Title: String, Codable, Hashable, Sendable { + case GM = "GM" + case WGM = "WGM" + case IM = "IM" + case WIM = "WIM" + case FM = "FM" + case WFM = "WFM" + case NM = "NM" + case CM = "CM" + case WCM = "WCM" + case WNM = "WNM" + case LM = "LM" + case BOT = "BOT" + } + /// - Remark: Generated from `#/components/schemas/User`. + internal struct User: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/User/id`. + internal var id: Swift.String? + /// - Remark: Generated from `#/components/schemas/User/username`. + internal var username: Swift.String? + /// - Remark: Generated from `#/components/schemas/User/perfs`. + internal var perfs: Components.Schemas.Perfs? + /// - Remark: Generated from `#/components/schemas/User/flair`. + internal var flair: Swift.String? + /// - Remark: Generated from `#/components/schemas/User/createdAt`. + internal var createdAt: Swift.Int64? + /// only appears if a user's account is closed + /// + /// - Remark: Generated from `#/components/schemas/User/disabled`. + internal var disabled: Swift.Bool? + /// only appears if a user's account is marked for the violation of [Lichess TOS](https://lichess.org/terms-of-service) + /// + /// - Remark: Generated from `#/components/schemas/User/tosViolation`. + internal var tosViolation: Swift.Bool? + /// - Remark: Generated from `#/components/schemas/User/profile`. + internal var profile: Components.Schemas.Profile? + /// - Remark: Generated from `#/components/schemas/User/seenAt`. + internal var seenAt: Swift.Int64? + /// - Remark: Generated from `#/components/schemas/User/patron`. + internal var patron: Swift.Bool? + /// - Remark: Generated from `#/components/schemas/User/verified`. + internal var verified: Swift.Bool? + /// - Remark: Generated from `#/components/schemas/User/playTime`. + internal var playTime: Components.Schemas.PlayTime? + /// - Remark: Generated from `#/components/schemas/User/title`. + internal var title: Components.Schemas.Title? + /// Creates a new `User`. + /// + /// - Parameters: + /// - id: + /// - username: + /// - perfs: + /// - flair: + /// - createdAt: + /// - disabled: only appears if a user's account is closed + /// - tosViolation: only appears if a user's account is marked for the violation of [Lichess TOS](https://lichess.org/terms-of-service) + /// - profile: + /// - seenAt: + /// - patron: + /// - verified: + /// - playTime: + /// - title: + internal init( + id: Swift.String? = nil, + username: Swift.String? = nil, + perfs: Components.Schemas.Perfs? = nil, + flair: Swift.String? = nil, + createdAt: Swift.Int64? = nil, + disabled: Swift.Bool? = nil, + tosViolation: Swift.Bool? = nil, + profile: Components.Schemas.Profile? = nil, + seenAt: Swift.Int64? = nil, + patron: Swift.Bool? = nil, + verified: Swift.Bool? = nil, + playTime: Components.Schemas.PlayTime? = nil, + title: Components.Schemas.Title? = nil + ) { + self.id = id + self.username = username + self.perfs = perfs + self.flair = flair + self.createdAt = createdAt + self.disabled = disabled + self.tosViolation = tosViolation + self.profile = profile + self.seenAt = seenAt + self.patron = patron + self.verified = verified + self.playTime = playTime + self.title = title + } + internal enum CodingKeys: String, CodingKey { + case id + case username + case perfs + case flair + case createdAt + case disabled + case tosViolation + case profile + case seenAt + case patron + case verified + case playTime + case title + } + } + /// - Remark: Generated from `#/components/schemas/Count`. + internal struct Count: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/Count/all`. + internal var all: Swift.Int? + /// - Remark: Generated from `#/components/schemas/Count/rated`. + internal var rated: Swift.Int? + /// - Remark: Generated from `#/components/schemas/Count/ai`. + internal var ai: Swift.Int? + /// - Remark: Generated from `#/components/schemas/Count/draw`. + internal var draw: Swift.Int? + /// - Remark: Generated from `#/components/schemas/Count/drawH`. + internal var drawH: Swift.Int? + /// - Remark: Generated from `#/components/schemas/Count/loss`. + internal var loss: Swift.Int? + /// - Remark: Generated from `#/components/schemas/Count/lossH`. + internal var lossH: Swift.Int? + /// - Remark: Generated from `#/components/schemas/Count/win`. + internal var win: Swift.Int? + /// - Remark: Generated from `#/components/schemas/Count/winH`. + internal var winH: Swift.Int? + /// - Remark: Generated from `#/components/schemas/Count/bookmark`. + internal var bookmark: Swift.Int? + /// - Remark: Generated from `#/components/schemas/Count/playing`. + internal var playing: Swift.Int? + /// - Remark: Generated from `#/components/schemas/Count/import`. + internal var _import: Swift.Int? + /// - Remark: Generated from `#/components/schemas/Count/me`. + internal var me: Swift.Int? + /// Creates a new `Count`. + /// + /// - Parameters: + /// - all: + /// - rated: + /// - ai: + /// - draw: + /// - drawH: + /// - loss: + /// - lossH: + /// - win: + /// - winH: + /// - bookmark: + /// - playing: + /// - _import: + /// - me: + internal init( + all: Swift.Int? = nil, + rated: Swift.Int? = nil, + ai: Swift.Int? = nil, + draw: Swift.Int? = nil, + drawH: Swift.Int? = nil, + loss: Swift.Int? = nil, + lossH: Swift.Int? = nil, + win: Swift.Int? = nil, + winH: Swift.Int? = nil, + bookmark: Swift.Int? = nil, + playing: Swift.Int? = nil, + _import: Swift.Int? = nil, + me: Swift.Int? = nil + ) { + self.all = all + self.rated = rated + self.ai = ai + self.draw = draw + self.drawH = drawH + self.loss = loss + self.lossH = lossH + self.win = win + self.winH = winH + self.bookmark = bookmark + self.playing = playing + self._import = _import + self.me = me + } + internal enum CodingKeys: String, CodingKey { + case all + case rated + case ai + case draw + case drawH + case loss + case lossH + case win + case winH + case bookmark + case playing + case _import = "import" + case me + } + } + /// - Remark: Generated from `#/components/schemas/UserExtended`. + internal struct UserExtended: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/UserExtended/value1`. + internal var value1: Components.Schemas.User + /// - Remark: Generated from `#/components/schemas/UserExtended/value2`. + internal struct Value2Payload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/UserExtended/value2/url`. + internal var url: Swift.String? + /// - Remark: Generated from `#/components/schemas/UserExtended/value2/playing`. + internal var playing: Swift.String? + /// - Remark: Generated from `#/components/schemas/UserExtended/value2/count`. + internal var count: Components.Schemas.Count? + /// - Remark: Generated from `#/components/schemas/UserExtended/value2/streaming`. + internal var streaming: Swift.Bool? + /// - Remark: Generated from `#/components/schemas/UserExtended/value2/streamer`. + internal var streamer: OpenAPIRuntime.OpenAPIValueContainer? + /// only appears if the request is [authenticated with OAuth2](#section/Introduction/Authentication) + /// + /// - Remark: Generated from `#/components/schemas/UserExtended/value2/followable`. + internal var followable: Swift.Bool? + /// only appears if the request is [authenticated with OAuth2](#section/Introduction/Authentication) + /// + /// - Remark: Generated from `#/components/schemas/UserExtended/value2/following`. + internal var following: Swift.Bool? + /// only appears if the request is [authenticated with OAuth2](#section/Introduction/Authentication) + /// + /// - Remark: Generated from `#/components/schemas/UserExtended/value2/blocking`. + internal var blocking: Swift.Bool? + /// only appears if the request is [authenticated with OAuth2](#section/Introduction/Authentication) + /// + /// - Remark: Generated from `#/components/schemas/UserExtended/value2/followsYou`. + internal var followsYou: Swift.Bool? + /// Creates a new `Value2Payload`. + /// + /// - Parameters: + /// - url: + /// - playing: + /// - count: + /// - streaming: + /// - streamer: + /// - followable: only appears if the request is [authenticated with OAuth2](#section/Introduction/Authentication) + /// - following: only appears if the request is [authenticated with OAuth2](#section/Introduction/Authentication) + /// - blocking: only appears if the request is [authenticated with OAuth2](#section/Introduction/Authentication) + /// - followsYou: only appears if the request is [authenticated with OAuth2](#section/Introduction/Authentication) + internal init( + url: Swift.String? = nil, + playing: Swift.String? = nil, + count: Components.Schemas.Count? = nil, + streaming: Swift.Bool? = nil, + streamer: OpenAPIRuntime.OpenAPIValueContainer? = nil, + followable: Swift.Bool? = nil, + following: Swift.Bool? = nil, + blocking: Swift.Bool? = nil, + followsYou: Swift.Bool? = nil + ) { + self.url = url + self.playing = playing + self.count = count + self.streaming = streaming + self.streamer = streamer + self.followable = followable + self.following = following + self.blocking = blocking + self.followsYou = followsYou + } + internal enum CodingKeys: String, CodingKey { + case url + case playing + case count + case streaming + case streamer + case followable + case following + case blocking + case followsYou + } + } + /// - Remark: Generated from `#/components/schemas/UserExtended/value2`. + internal var value2: Components.Schemas.UserExtended.Value2Payload + /// Creates a new `UserExtended`. + /// + /// - Parameters: + /// - value1: + /// - value2: + internal init( + value1: Components.Schemas.User, + value2: Components.Schemas.UserExtended.Value2Payload + ) { + self.value1 = value1 + self.value2 = value2 + } + internal init(from decoder: any Decoder) throws { + value1 = try .init(from: decoder) + value2 = try .init(from: decoder) + } + internal func encode(to encoder: any Encoder) throws { + try value1.encode(to: encoder) + try value2.encode(to: encoder) + } + } + /// - Remark: Generated from `#/components/schemas/RatingHistory`. + internal typealias RatingHistory = OpenAPIRuntime.OpenAPIValueContainer + /// - Remark: Generated from `#/components/schemas/PerfType`. + @frozen internal enum PerfType: String, Codable, Hashable, Sendable { + case ultraBullet = "ultraBullet" + case bullet = "bullet" + case blitz = "blitz" + case rapid = "rapid" + case classical = "classical" + case correspondence = "correspondence" + case chess960 = "chess960" + case crazyhouse = "crazyhouse" + case antichess = "antichess" + case atomic = "atomic" + case horde = "horde" + case kingOfTheHill = "kingOfTheHill" + case racingKings = "racingKings" + case threeCheck = "threeCheck" + } + /// - Remark: Generated from `#/components/schemas/PerfStat`. + internal typealias PerfStat = OpenAPIRuntime.OpenAPIValueContainer + /// - Remark: Generated from `#/components/schemas/PuzzleAndGame`. + internal typealias PuzzleAndGame = OpenAPIRuntime.OpenAPIValueContainer + /// - Remark: Generated from `#/components/schemas/PuzzleRoundJson`. + internal struct PuzzleRoundJson: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/PuzzleRoundJson/date`. + internal var date: Swift.Double? + /// - Remark: Generated from `#/components/schemas/PuzzleRoundJson/win`. + internal var win: Swift.Bool? + /// - Remark: Generated from `#/components/schemas/PuzzleRoundJson/puzzle`. + internal var puzzle: OpenAPIRuntime.OpenAPIObjectContainer? + /// Creates a new `PuzzleRoundJson`. + /// + /// - Parameters: + /// - date: + /// - win: + /// - puzzle: + internal init( + date: Swift.Double? = nil, + win: Swift.Bool? = nil, + puzzle: OpenAPIRuntime.OpenAPIObjectContainer? = nil + ) { + self.date = date + self.win = win + self.puzzle = puzzle + } + internal enum CodingKeys: String, CodingKey { + case date + case win + case puzzle + } + } + /// - Remark: Generated from `#/components/schemas/PuzzleDashboardJson`. + internal typealias PuzzleDashboardJson = OpenAPIRuntime.OpenAPIValueContainer + /// - Remark: Generated from `#/components/schemas/StormDashboardJson`. + internal typealias StormDashboardJson = OpenAPIRuntime.OpenAPIValueContainer + /// - Remark: Generated from `#/components/schemas/PuzzleRaceJson`. + internal typealias PuzzleRaceJson = OpenAPIRuntime.OpenAPIValueContainer + /// - Remark: Generated from `#/components/schemas/UserPreferences`. + internal struct UserPreferences: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/UserPreferences/dark`. + internal var dark: Swift.Bool? + /// - Remark: Generated from `#/components/schemas/UserPreferences/transp`. + internal var transp: Swift.Bool? + /// - Remark: Generated from `#/components/schemas/UserPreferences/bgImg`. + internal var bgImg: Swift.String? + /// - Remark: Generated from `#/components/schemas/UserPreferences/is3d`. + internal var is3d: Swift.Bool? + /// - Remark: Generated from `#/components/schemas/UserPreferences/theme`. + @frozen internal enum themePayload: String, Codable, Hashable, Sendable { + case blue = "blue" + case blue2 = "blue2" + case blue3 = "blue3" + case blue_hyphen_marble = "blue-marble" + case canvas = "canvas" + case wood = "wood" + case wood2 = "wood2" + case wood3 = "wood3" + case wood4 = "wood4" + case maple = "maple" + case maple2 = "maple2" + case brown = "brown" + case leather = "leather" + case green = "green" + case marble = "marble" + case green_hyphen_plastic = "green-plastic" + case grey = "grey" + case metal = "metal" + case olive = "olive" + case newspaper = "newspaper" + case purple = "purple" + case purple_hyphen_diag = "purple-diag" + case pink = "pink" + case ic = "ic" + } + /// - Remark: Generated from `#/components/schemas/UserPreferences/theme`. + internal var theme: Components.Schemas.UserPreferences.themePayload? + /// - Remark: Generated from `#/components/schemas/UserPreferences/pieceSet`. + @frozen internal enum pieceSetPayload: String, Codable, Hashable, Sendable { + case cburnett = "cburnett" + case merida = "merida" + case alpha = "alpha" + case pirouetti = "pirouetti" + case chessnut = "chessnut" + case chess7 = "chess7" + case reillycraig = "reillycraig" + case companion = "companion" + case riohacha = "riohacha" + case kosal = "kosal" + case leipzig = "leipzig" + case fantasy = "fantasy" + case spatial = "spatial" + case california = "california" + case pixel = "pixel" + case maestro = "maestro" + case fresca = "fresca" + case cardinal = "cardinal" + case gioco = "gioco" + case tatiana = "tatiana" + case staunty = "staunty" + case governor = "governor" + case dubrovny = "dubrovny" + case icpieces = "icpieces" + case shapes = "shapes" + case letter = "letter" + } + /// - Remark: Generated from `#/components/schemas/UserPreferences/pieceSet`. + internal var pieceSet: Components.Schemas.UserPreferences.pieceSetPayload? + /// - Remark: Generated from `#/components/schemas/UserPreferences/theme3d`. + @frozen internal enum theme3dPayload: String, Codable, Hashable, Sendable { + case Black_hyphen_White_hyphen_Aluminium = "Black-White-Aluminium" + case Brushed_hyphen_Aluminium = "Brushed-Aluminium" + case China_hyphen_Blue = "China-Blue" + case China_hyphen_Green = "China-Green" + case China_hyphen_Grey = "China-Grey" + case China_hyphen_Scarlet = "China-Scarlet" + case Classic_hyphen_Blue = "Classic-Blue" + case Gold_hyphen_Silver = "Gold-Silver" + case Light_hyphen_Wood = "Light-Wood" + case Power_hyphen_Coated = "Power-Coated" + case Rosewood = "Rosewood" + case Marble = "Marble" + case Wax = "Wax" + case Jade = "Jade" + case Woodi = "Woodi" + } + /// - Remark: Generated from `#/components/schemas/UserPreferences/theme3d`. + internal var theme3d: Components.Schemas.UserPreferences.theme3dPayload? + /// - Remark: Generated from `#/components/schemas/UserPreferences/pieceSet3d`. + @frozen internal enum pieceSet3dPayload: String, Codable, Hashable, Sendable { + case Basic = "Basic" + case Wood = "Wood" + case Metal = "Metal" + case RedVBlue = "RedVBlue" + case ModernJade = "ModernJade" + case ModernWood = "ModernWood" + case Glass = "Glass" + case Trimmed = "Trimmed" + case Experimental = "Experimental" + case Staunton = "Staunton" + case CubesAndPi = "CubesAndPi" + } + /// - Remark: Generated from `#/components/schemas/UserPreferences/pieceSet3d`. + internal var pieceSet3d: Components.Schemas.UserPreferences.pieceSet3dPayload? + /// - Remark: Generated from `#/components/schemas/UserPreferences/soundSet`. + @frozen internal enum soundSetPayload: String, Codable, Hashable, Sendable { + case silent = "silent" + case standard = "standard" + case piano = "piano" + case nes = "nes" + case sfx = "sfx" + case futuristic = "futuristic" + case robot = "robot" + case music = "music" + case speech = "speech" + } + /// - Remark: Generated from `#/components/schemas/UserPreferences/soundSet`. + internal var soundSet: Components.Schemas.UserPreferences.soundSetPayload? + /// - Remark: Generated from `#/components/schemas/UserPreferences/blindfold`. + internal var blindfold: Swift.Int? + /// - Remark: Generated from `#/components/schemas/UserPreferences/autoQueen`. + internal var autoQueen: Swift.Int? + /// - Remark: Generated from `#/components/schemas/UserPreferences/autoThreefold`. + internal var autoThreefold: Swift.Int? + /// - Remark: Generated from `#/components/schemas/UserPreferences/takeback`. + internal var takeback: Swift.Int? + /// - Remark: Generated from `#/components/schemas/UserPreferences/moretime`. + internal var moretime: Swift.Int? + /// - Remark: Generated from `#/components/schemas/UserPreferences/clockTenths`. + internal var clockTenths: Swift.Int? + /// - Remark: Generated from `#/components/schemas/UserPreferences/clockBar`. + internal var clockBar: Swift.Bool? + /// - Remark: Generated from `#/components/schemas/UserPreferences/clockSound`. + internal var clockSound: Swift.Bool? + /// - Remark: Generated from `#/components/schemas/UserPreferences/premove`. + internal var premove: Swift.Bool? + /// - Remark: Generated from `#/components/schemas/UserPreferences/animation`. + internal var animation: Swift.Int? + /// - Remark: Generated from `#/components/schemas/UserPreferences/captured`. + internal var captured: Swift.Bool? + /// - Remark: Generated from `#/components/schemas/UserPreferences/follow`. + internal var follow: Swift.Bool? + /// - Remark: Generated from `#/components/schemas/UserPreferences/highlight`. + internal var highlight: Swift.Bool? + /// - Remark: Generated from `#/components/schemas/UserPreferences/destination`. + internal var destination: Swift.Bool? + /// - Remark: Generated from `#/components/schemas/UserPreferences/coords`. + internal var coords: Swift.Int? + /// - Remark: Generated from `#/components/schemas/UserPreferences/replay`. + internal var replay: Swift.Int? + /// - Remark: Generated from `#/components/schemas/UserPreferences/challenge`. + internal var challenge: Swift.Int? + /// - Remark: Generated from `#/components/schemas/UserPreferences/message`. + internal var message: Swift.Int? + /// - Remark: Generated from `#/components/schemas/UserPreferences/coordColor`. + internal var coordColor: Swift.Int? + /// - Remark: Generated from `#/components/schemas/UserPreferences/submitMove`. + internal var submitMove: Swift.Int? + /// - Remark: Generated from `#/components/schemas/UserPreferences/confirmResign`. + internal var confirmResign: Swift.Int? + /// - Remark: Generated from `#/components/schemas/UserPreferences/insightShare`. + internal var insightShare: Swift.Int? + /// - Remark: Generated from `#/components/schemas/UserPreferences/keyboardMove`. + internal var keyboardMove: Swift.Int? + /// - Remark: Generated from `#/components/schemas/UserPreferences/zen`. + internal var zen: Swift.Int? + /// - Remark: Generated from `#/components/schemas/UserPreferences/moveEvent`. + internal var moveEvent: Swift.Int? + /// - Remark: Generated from `#/components/schemas/UserPreferences/rookCastle`. + internal var rookCastle: Swift.Int? + /// Creates a new `UserPreferences`. + /// + /// - Parameters: + /// - dark: + /// - transp: + /// - bgImg: + /// - is3d: + /// - theme: + /// - pieceSet: + /// - theme3d: + /// - pieceSet3d: + /// - soundSet: + /// - blindfold: + /// - autoQueen: + /// - autoThreefold: + /// - takeback: + /// - moretime: + /// - clockTenths: + /// - clockBar: + /// - clockSound: + /// - premove: + /// - animation: + /// - captured: + /// - follow: + /// - highlight: + /// - destination: + /// - coords: + /// - replay: + /// - challenge: + /// - message: + /// - coordColor: + /// - submitMove: + /// - confirmResign: + /// - insightShare: + /// - keyboardMove: + /// - zen: + /// - moveEvent: + /// - rookCastle: + internal init( + dark: Swift.Bool? = nil, + transp: Swift.Bool? = nil, + bgImg: Swift.String? = nil, + is3d: Swift.Bool? = nil, + theme: Components.Schemas.UserPreferences.themePayload? = nil, + pieceSet: Components.Schemas.UserPreferences.pieceSetPayload? = nil, + theme3d: Components.Schemas.UserPreferences.theme3dPayload? = nil, + pieceSet3d: Components.Schemas.UserPreferences.pieceSet3dPayload? = nil, + soundSet: Components.Schemas.UserPreferences.soundSetPayload? = nil, + blindfold: Swift.Int? = nil, + autoQueen: Swift.Int? = nil, + autoThreefold: Swift.Int? = nil, + takeback: Swift.Int? = nil, + moretime: Swift.Int? = nil, + clockTenths: Swift.Int? = nil, + clockBar: Swift.Bool? = nil, + clockSound: Swift.Bool? = nil, + premove: Swift.Bool? = nil, + animation: Swift.Int? = nil, + captured: Swift.Bool? = nil, + follow: Swift.Bool? = nil, + highlight: Swift.Bool? = nil, + destination: Swift.Bool? = nil, + coords: Swift.Int? = nil, + replay: Swift.Int? = nil, + challenge: Swift.Int? = nil, + message: Swift.Int? = nil, + coordColor: Swift.Int? = nil, + submitMove: Swift.Int? = nil, + confirmResign: Swift.Int? = nil, + insightShare: Swift.Int? = nil, + keyboardMove: Swift.Int? = nil, + zen: Swift.Int? = nil, + moveEvent: Swift.Int? = nil, + rookCastle: Swift.Int? = nil + ) { + self.dark = dark + self.transp = transp + self.bgImg = bgImg + self.is3d = is3d + self.theme = theme + self.pieceSet = pieceSet + self.theme3d = theme3d + self.pieceSet3d = pieceSet3d + self.soundSet = soundSet + self.blindfold = blindfold + self.autoQueen = autoQueen + self.autoThreefold = autoThreefold + self.takeback = takeback + self.moretime = moretime + self.clockTenths = clockTenths + self.clockBar = clockBar + self.clockSound = clockSound + self.premove = premove + self.animation = animation + self.captured = captured + self.follow = follow + self.highlight = highlight + self.destination = destination + self.coords = coords + self.replay = replay + self.challenge = challenge + self.message = message + self.coordColor = coordColor + self.submitMove = submitMove + self.confirmResign = confirmResign + self.insightShare = insightShare + self.keyboardMove = keyboardMove + self.zen = zen + self.moveEvent = moveEvent + self.rookCastle = rookCastle + } + internal enum CodingKeys: String, CodingKey { + case dark + case transp + case bgImg + case is3d + case theme + case pieceSet + case theme3d + case pieceSet3d + case soundSet + case blindfold + case autoQueen + case autoThreefold + case takeback + case moretime + case clockTenths + case clockBar + case clockSound + case premove + case animation + case captured + case follow + case highlight + case destination + case coords + case replay + case challenge + case message + case coordColor + case submitMove + case confirmResign + case insightShare + case keyboardMove + case zen + case moveEvent + case rookCastle + } + } + /// - Remark: Generated from `#/components/schemas/Ok`. + internal struct Ok: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/Ok/ok`. + internal var ok: Swift.Bool? + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - ok: + internal init(ok: Swift.Bool? = nil) { + self.ok = ok + } + internal enum CodingKeys: String, CodingKey { + case ok + } + } + /// - Remark: Generated from `#/components/schemas/Timeline`. + internal struct Timeline: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/Timeline/entries`. + internal var entries: OpenAPIRuntime.OpenAPIArrayContainer? + /// - Remark: Generated from `#/components/schemas/Timeline/users`. + internal var users: OpenAPIRuntime.OpenAPIObjectContainer? + /// Creates a new `Timeline`. + /// + /// - Parameters: + /// - entries: + /// - users: + internal init( + entries: OpenAPIRuntime.OpenAPIArrayContainer? = nil, + users: OpenAPIRuntime.OpenAPIObjectContainer? = nil + ) { + self.entries = entries + self.users = users + } + internal enum CodingKeys: String, CodingKey { + case entries + case users + } + } + /// - Remark: Generated from `#/components/schemas/GamePgn`. + internal typealias GamePgn = OpenAPIRuntime.OpenAPIValueContainer + /// - Remark: Generated from `#/components/schemas/VariantKey`. + @frozen internal enum VariantKey: String, Codable, Hashable, Sendable { + case standard = "standard" + case chess960 = "chess960" + case crazyhouse = "crazyhouse" + case antichess = "antichess" + case atomic = "atomic" + case horde = "horde" + case kingOfTheHill = "kingOfTheHill" + case racingKings = "racingKings" + case threeCheck = "threeCheck" + case fromPosition = "fromPosition" + } + /// - Remark: Generated from `#/components/schemas/Speed`. + @frozen internal enum Speed: String, Codable, Hashable, Sendable { + case ultraBullet = "ultraBullet" + case bullet = "bullet" + case blitz = "blitz" + case rapid = "rapid" + case classical = "classical" + case correspondence = "correspondence" + } + /// Game status code. https://github.com/lichess-org/scalachess/blob/0a7d6f2c63b1ca06cd3c958ed3264e738af5c5f6/src/main/scala/Status.scala#L16-L28 + /// + /// - Remark: Generated from `#/components/schemas/GameStatus`. + @frozen internal enum GameStatus: String, Codable, Hashable, Sendable { + case created = "created" + case started = "started" + case aborted = "aborted" + case mate = "mate" + case resign = "resign" + case stalemate = "stalemate" + case timeout = "timeout" + case draw = "draw" + case outoftime = "outoftime" + case cheat = "cheat" + case noStart = "noStart" + case unknownFinish = "unknownFinish" + case variantEnd = "variantEnd" + } + /// - Remark: Generated from `#/components/schemas/LightUser`. + internal struct LightUser: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/LightUser/id`. + internal var id: Swift.String + /// - Remark: Generated from `#/components/schemas/LightUser/name`. + internal var name: Swift.String + /// - Remark: Generated from `#/components/schemas/LightUser/title`. + internal var title: Components.Schemas.Title? + /// - Remark: Generated from `#/components/schemas/LightUser/patron`. + internal var patron: Swift.Bool? + /// Creates a new `LightUser`. + /// + /// - Parameters: + /// - id: + /// - name: + /// - title: + /// - patron: + internal init( + id: Swift.String, + name: Swift.String, + title: Components.Schemas.Title? = nil, + patron: Swift.Bool? = nil + ) { + self.id = id + self.name = name + self.title = title + self.patron = patron + } + internal enum CodingKeys: String, CodingKey { + case id + case name + case title + case patron + } + } + /// - Remark: Generated from `#/components/schemas/GameUser`. + internal struct GameUser: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/GameUser/user`. + internal var user: Components.Schemas.LightUser? + /// - Remark: Generated from `#/components/schemas/GameUser/rating`. + internal var rating: Swift.Double? + /// - Remark: Generated from `#/components/schemas/GameUser/ratingDiff`. + internal var ratingDiff: Swift.Double? + /// - Remark: Generated from `#/components/schemas/GameUser/name`. + internal var name: Swift.String? + /// - Remark: Generated from `#/components/schemas/GameUser/provisional`. + internal var provisional: Swift.Bool? + /// - Remark: Generated from `#/components/schemas/GameUser/aiLevel`. + internal var aiLevel: Swift.Double? + /// - Remark: Generated from `#/components/schemas/GameUser/analysis`. + internal struct analysisPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/GameUser/analysis/inaccuracy`. + internal var inaccuracy: Swift.Double + /// - Remark: Generated from `#/components/schemas/GameUser/analysis/mistake`. + internal var mistake: Swift.Double + /// - Remark: Generated from `#/components/schemas/GameUser/analysis/blunder`. + internal var blunder: Swift.Double + /// - Remark: Generated from `#/components/schemas/GameUser/analysis/acpl`. + internal var acpl: Swift.Double + /// Creates a new `analysisPayload`. + /// + /// - Parameters: + /// - inaccuracy: + /// - mistake: + /// - blunder: + /// - acpl: + internal init( + inaccuracy: Swift.Double, + mistake: Swift.Double, + blunder: Swift.Double, + acpl: Swift.Double + ) { + self.inaccuracy = inaccuracy + self.mistake = mistake + self.blunder = blunder + self.acpl = acpl + } + internal enum CodingKeys: String, CodingKey { + case inaccuracy + case mistake + case blunder + case acpl + } + } + /// - Remark: Generated from `#/components/schemas/GameUser/analysis`. + internal var analysis: Components.Schemas.GameUser.analysisPayload? + /// - Remark: Generated from `#/components/schemas/GameUser/team`. + internal var team: Swift.String? + /// Creates a new `GameUser`. + /// + /// - Parameters: + /// - user: + /// - rating: + /// - ratingDiff: + /// - name: + /// - provisional: + /// - aiLevel: + /// - analysis: + /// - team: + internal init( + user: Components.Schemas.LightUser? = nil, + rating: Swift.Double? = nil, + ratingDiff: Swift.Double? = nil, + name: Swift.String? = nil, + provisional: Swift.Bool? = nil, + aiLevel: Swift.Double? = nil, + analysis: Components.Schemas.GameUser.analysisPayload? = nil, + team: Swift.String? = nil + ) { + self.user = user + self.rating = rating + self.ratingDiff = ratingDiff + self.name = name + self.provisional = provisional + self.aiLevel = aiLevel + self.analysis = analysis + self.team = team + } + internal enum CodingKeys: String, CodingKey { + case user + case rating + case ratingDiff + case name + case provisional + case aiLevel + case analysis + case team + } + } + /// - Remark: Generated from `#/components/schemas/GameJson`. + internal struct GameJson: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/GameJson/id`. + internal var id: Swift.String + /// - Remark: Generated from `#/components/schemas/GameJson/rated`. + internal var rated: Swift.Bool + /// - Remark: Generated from `#/components/schemas/GameJson/variant`. + internal var variant: Components.Schemas.VariantKey + /// - Remark: Generated from `#/components/schemas/GameJson/speed`. + internal var speed: Components.Schemas.Speed + /// - Remark: Generated from `#/components/schemas/GameJson/perf`. + internal var perf: Swift.String + /// - Remark: Generated from `#/components/schemas/GameJson/createdAt`. + internal var createdAt: Swift.Double + /// - Remark: Generated from `#/components/schemas/GameJson/lastMoveAt`. + internal var lastMoveAt: Swift.Double + /// - Remark: Generated from `#/components/schemas/GameJson/status`. + internal var status: Components.Schemas.GameStatus + /// - Remark: Generated from `#/components/schemas/GameJson/players`. + internal struct playersPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/GameJson/players/white`. + internal var white: Components.Schemas.GameUser? + /// - Remark: Generated from `#/components/schemas/GameJson/players/black`. + internal var black: Components.Schemas.GameUser? + /// Creates a new `playersPayload`. + /// + /// - Parameters: + /// - white: + /// - black: + internal init( + white: Components.Schemas.GameUser? = nil, + black: Components.Schemas.GameUser? = nil + ) { + self.white = white + self.black = black + } + internal enum CodingKeys: String, CodingKey { + case white + case black + } + } + /// - Remark: Generated from `#/components/schemas/GameJson/players`. + internal var players: Components.Schemas.GameJson.playersPayload + /// - Remark: Generated from `#/components/schemas/GameJson/initialFen`. + internal var initialFen: Swift.String? + /// - Remark: Generated from `#/components/schemas/GameJson/winner`. + @frozen internal enum winnerPayload: String, Codable, Hashable, Sendable { + case white = "white" + case black = "black" + } + /// - Remark: Generated from `#/components/schemas/GameJson/winner`. + internal var winner: Components.Schemas.GameJson.winnerPayload? + /// - Remark: Generated from `#/components/schemas/GameJson/opening`. + internal struct openingPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/GameJson/opening/eco`. + internal var eco: Swift.String? + /// - Remark: Generated from `#/components/schemas/GameJson/opening/name`. + internal var name: Swift.String? + /// - Remark: Generated from `#/components/schemas/GameJson/opening/ply`. + internal var ply: Swift.Double? + /// Creates a new `openingPayload`. + /// + /// - Parameters: + /// - eco: + /// - name: + /// - ply: + internal init( + eco: Swift.String? = nil, + name: Swift.String? = nil, + ply: Swift.Double? = nil + ) { + self.eco = eco + self.name = name + self.ply = ply + } + internal enum CodingKeys: String, CodingKey { + case eco + case name + case ply + } + } + /// - Remark: Generated from `#/components/schemas/GameJson/opening`. + internal var opening: Components.Schemas.GameJson.openingPayload? + /// - Remark: Generated from `#/components/schemas/GameJson/moves`. + internal var moves: Swift.String? + /// - Remark: Generated from `#/components/schemas/GameJson/pgn`. + internal var pgn: Swift.String? + /// - Remark: Generated from `#/components/schemas/GameJson/daysPerTurn`. + internal var daysPerTurn: Swift.Double? + /// - Remark: Generated from `#/components/schemas/GameJson/analysisPayload`. + internal struct analysisPayloadPayload: Codable, Hashable, Sendable { + /// Evaluation in centipawns + /// + /// - Remark: Generated from `#/components/schemas/GameJson/analysisPayload/eval`. + internal var eval: Swift.Double? + /// Number of moves until forced mate + /// + /// - Remark: Generated from `#/components/schemas/GameJson/analysisPayload/mate`. + internal var mate: Swift.Double? + /// Best move in UCI notation (only if played move was inaccurate) + /// + /// - Remark: Generated from `#/components/schemas/GameJson/analysisPayload/best`. + internal var best: Swift.String? + /// Best variation in SAN notation (only if played move was inaccurate) + /// + /// - Remark: Generated from `#/components/schemas/GameJson/analysisPayload/variation`. + internal var variation: Swift.String? + /// Judgment annotation (only if played move was inaccurate) + /// + /// - Remark: Generated from `#/components/schemas/GameJson/analysisPayload/judgment`. + internal struct judgmentPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/GameJson/analysisPayload/judgment/name`. + @frozen internal enum namePayload: String, Codable, Hashable, Sendable { + case Inaccuracy = "Inaccuracy" + case Mistake = "Mistake" + case Blunder = "Blunder" + } + /// - Remark: Generated from `#/components/schemas/GameJson/analysisPayload/judgment/name`. + internal var name: Components.Schemas.GameJson.analysisPayloadPayload.judgmentPayload.namePayload? + /// - Remark: Generated from `#/components/schemas/GameJson/analysisPayload/judgment/comment`. + internal var comment: Swift.String? + /// Creates a new `judgmentPayload`. + /// + /// - Parameters: + /// - name: + /// - comment: + internal init( + name: Components.Schemas.GameJson.analysisPayloadPayload.judgmentPayload.namePayload? = nil, + comment: Swift.String? = nil + ) { + self.name = name + self.comment = comment + } + internal enum CodingKeys: String, CodingKey { + case name + case comment + } + } + /// Judgment annotation (only if played move was inaccurate) + /// + /// - Remark: Generated from `#/components/schemas/GameJson/analysisPayload/judgment`. + internal var judgment: Components.Schemas.GameJson.analysisPayloadPayload.judgmentPayload? + /// Creates a new `analysisPayloadPayload`. + /// + /// - Parameters: + /// - eval: Evaluation in centipawns + /// - mate: Number of moves until forced mate + /// - best: Best move in UCI notation (only if played move was inaccurate) + /// - variation: Best variation in SAN notation (only if played move was inaccurate) + /// - judgment: Judgment annotation (only if played move was inaccurate) + internal init( + eval: Swift.Double? = nil, + mate: Swift.Double? = nil, + best: Swift.String? = nil, + variation: Swift.String? = nil, + judgment: Components.Schemas.GameJson.analysisPayloadPayload.judgmentPayload? = nil + ) { + self.eval = eval + self.mate = mate + self.best = best + self.variation = variation + self.judgment = judgment + } + internal enum CodingKeys: String, CodingKey { + case eval + case mate + case best + case variation + case judgment + } + } + /// - Remark: Generated from `#/components/schemas/GameJson/analysis`. + internal typealias analysisPayload = [Components.Schemas.GameJson.analysisPayloadPayload] + /// - Remark: Generated from `#/components/schemas/GameJson/analysis`. + internal var analysis: Components.Schemas.GameJson.analysisPayload? + /// - Remark: Generated from `#/components/schemas/GameJson/tournament`. + internal var tournament: Swift.String? + /// - Remark: Generated from `#/components/schemas/GameJson/swiss`. + internal var swiss: Swift.String? + /// - Remark: Generated from `#/components/schemas/GameJson/clock`. + internal struct clockPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/GameJson/clock/initial`. + internal var initial: Swift.Double? + /// - Remark: Generated from `#/components/schemas/GameJson/clock/increment`. + internal var increment: Swift.Double? + /// - Remark: Generated from `#/components/schemas/GameJson/clock/totalTime`. + internal var totalTime: Swift.Double? + /// Creates a new `clockPayload`. + /// + /// - Parameters: + /// - initial: + /// - increment: + /// - totalTime: + internal init( + initial: Swift.Double? = nil, + increment: Swift.Double? = nil, + totalTime: Swift.Double? = nil + ) { + self.initial = initial + self.increment = increment + self.totalTime = totalTime + } + internal enum CodingKeys: String, CodingKey { + case initial + case increment + case totalTime + } + } + /// - Remark: Generated from `#/components/schemas/GameJson/clock`. + internal var clock: Components.Schemas.GameJson.clockPayload? + /// - Remark: Generated from `#/components/schemas/GameJson/division`. + internal struct divisionPayload: Codable, Hashable, Sendable { + /// Ply at which the middlegame begins + /// + /// - Remark: Generated from `#/components/schemas/GameJson/division/middle`. + internal var middle: Swift.Double? + /// Ply at which the endgame begins + /// + /// - Remark: Generated from `#/components/schemas/GameJson/division/end`. + internal var end: Swift.Double? + /// Creates a new `divisionPayload`. + /// + /// - Parameters: + /// - middle: Ply at which the middlegame begins + /// - end: Ply at which the endgame begins + internal init( + middle: Swift.Double? = nil, + end: Swift.Double? = nil + ) { + self.middle = middle + self.end = end + } + internal enum CodingKeys: String, CodingKey { + case middle + case end + } + } + /// - Remark: Generated from `#/components/schemas/GameJson/division`. + internal var division: Components.Schemas.GameJson.divisionPayload? + /// Creates a new `GameJson`. + /// + /// - Parameters: + /// - id: + /// - rated: + /// - variant: + /// - speed: + /// - perf: + /// - createdAt: + /// - lastMoveAt: + /// - status: + /// - players: + /// - initialFen: + /// - winner: + /// - opening: + /// - moves: + /// - pgn: + /// - daysPerTurn: + /// - analysis: + /// - tournament: + /// - swiss: + /// - clock: + /// - division: + internal init( + id: Swift.String, + rated: Swift.Bool, + variant: Components.Schemas.VariantKey, + speed: Components.Schemas.Speed, + perf: Swift.String, + createdAt: Swift.Double, + lastMoveAt: Swift.Double, + status: Components.Schemas.GameStatus, + players: Components.Schemas.GameJson.playersPayload, + initialFen: Swift.String? = nil, + winner: Components.Schemas.GameJson.winnerPayload? = nil, + opening: Components.Schemas.GameJson.openingPayload? = nil, + moves: Swift.String? = nil, + pgn: Swift.String? = nil, + daysPerTurn: Swift.Double? = nil, + analysis: Components.Schemas.GameJson.analysisPayload? = nil, + tournament: Swift.String? = nil, + swiss: Swift.String? = nil, + clock: Components.Schemas.GameJson.clockPayload? = nil, + division: Components.Schemas.GameJson.divisionPayload? = nil + ) { + self.id = id + self.rated = rated + self.variant = variant + self.speed = speed + self.perf = perf + self.createdAt = createdAt + self.lastMoveAt = lastMoveAt + self.status = status + self.players = players + self.initialFen = initialFen + self.winner = winner + self.opening = opening + self.moves = moves + self.pgn = pgn + self.daysPerTurn = daysPerTurn + self.analysis = analysis + self.tournament = tournament + self.swiss = swiss + self.clock = clock + self.division = division + } + internal enum CodingKeys: String, CodingKey { + case id + case rated + case variant + case speed + case perf + case createdAt + case lastMoveAt + case status + case players + case initialFen + case winner + case opening + case moves + case pgn + case daysPerTurn + case analysis + case tournament + case swiss + case clock + case division + } + } + /// - Remark: Generated from `#/components/schemas/GameStream`. + internal typealias GameStream = OpenAPIRuntime.OpenAPIValueContainer + /// - Remark: Generated from `#/components/schemas/MoveStream`. + internal typealias MoveStream = OpenAPIRuntime.OpenAPIValueContainer + /// - Remark: Generated from `#/components/schemas/TvFeed`. + internal struct TvFeed: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/TvFeed/t`. + internal var t: Swift.String? + /// - Remark: Generated from `#/components/schemas/TvFeed/d`. + internal var d: OpenAPIRuntime.OpenAPIObjectContainer? + /// Creates a new `TvFeed`. + /// + /// - Parameters: + /// - t: + /// - d: + internal init( + t: Swift.String? = nil, + d: OpenAPIRuntime.OpenAPIObjectContainer? = nil + ) { + self.t = t + self.d = d + } + internal enum CodingKeys: String, CodingKey { + case t + case d + } + } + /// - Remark: Generated from `#/components/schemas/Clock`. + internal struct Clock: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/Clock/limit`. + internal var limit: Swift.Int? + /// - Remark: Generated from `#/components/schemas/Clock/increment`. + internal var increment: Swift.Int? + /// Creates a new `Clock`. + /// + /// - Parameters: + /// - limit: + /// - increment: + internal init( + limit: Swift.Int? = nil, + increment: Swift.Int? = nil + ) { + self.limit = limit + self.increment = increment + } + internal enum CodingKeys: String, CodingKey { + case limit + case increment + } + } + /// - Remark: Generated from `#/components/schemas/Variant`. + internal struct Variant: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/Variant/key`. + internal var key: Components.Schemas.VariantKey? + /// - Remark: Generated from `#/components/schemas/Variant/name`. + internal var name: Swift.String? + /// - Remark: Generated from `#/components/schemas/Variant/short`. + internal var short: Swift.String? + /// Creates a new `Variant`. + /// + /// - Parameters: + /// - key: + /// - name: + /// - short: + internal init( + key: Components.Schemas.VariantKey? = nil, + name: Swift.String? = nil, + short: Swift.String? = nil + ) { + self.key = key + self.name = name + self.short = short + } + internal enum CodingKeys: String, CodingKey { + case key + case name + case short + } + } + /// 10: created, 20: started, 30: finished + /// + /// + /// - Remark: Generated from `#/components/schemas/ArenaStatus`. + @frozen internal enum ArenaStatus: Int, Codable, Hashable, Sendable { + case _10 = 10 + case _20 = 20 + case _30 = 30 + } + /// - Remark: Generated from `#/components/schemas/ArenaPerf`. + internal struct ArenaPerf: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/ArenaPerf/key`. + internal var key: Swift.String? + /// - Remark: Generated from `#/components/schemas/ArenaPerf/name`. + internal var name: Swift.String? + /// - Remark: Generated from `#/components/schemas/ArenaPerf/position`. + internal var position: Swift.Int? + /// - Remark: Generated from `#/components/schemas/ArenaPerf/icon`. + internal var icon: Swift.String? + /// Creates a new `ArenaPerf`. + /// + /// - Parameters: + /// - key: + /// - name: + /// - position: + /// - icon: + internal init( + key: Swift.String? = nil, + name: Swift.String? = nil, + position: Swift.Int? = nil, + icon: Swift.String? = nil + ) { + self.key = key + self.name = name + self.position = position + self.icon = icon + } + internal enum CodingKeys: String, CodingKey { + case key + case name + case position + case icon + } + } + /// - Remark: Generated from `#/components/schemas/ArenaRatingObj`. + internal struct ArenaRatingObj: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/ArenaRatingObj/perf`. + internal var perf: Components.Schemas.PerfType? + /// - Remark: Generated from `#/components/schemas/ArenaRatingObj/rating`. + internal var rating: Swift.Int? + /// Creates a new `ArenaRatingObj`. + /// + /// - Parameters: + /// - perf: + /// - rating: + internal init( + perf: Components.Schemas.PerfType? = nil, + rating: Swift.Int? = nil + ) { + self.perf = perf + self.rating = rating + } + internal enum CodingKeys: String, CodingKey { + case perf + case rating + } + } + /// - Remark: Generated from `#/components/schemas/ArenaPosition`. + @frozen internal enum ArenaPosition: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/ArenaPosition/case1`. + internal struct Case1Payload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/ArenaPosition/case1/eco`. + internal var eco: Swift.String? + /// - Remark: Generated from `#/components/schemas/ArenaPosition/case1/name`. + internal var name: Swift.String? + /// - Remark: Generated from `#/components/schemas/ArenaPosition/case1/fen`. + internal var fen: Swift.String? + /// - Remark: Generated from `#/components/schemas/ArenaPosition/case1/url`. + internal var url: Swift.String? + /// Creates a new `Case1Payload`. + /// + /// - Parameters: + /// - eco: + /// - name: + /// - fen: + /// - url: + internal init( + eco: Swift.String? = nil, + name: Swift.String? = nil, + fen: Swift.String? = nil, + url: Swift.String? = nil + ) { + self.eco = eco + self.name = name + self.fen = fen + self.url = url + } + internal enum CodingKeys: String, CodingKey { + case eco + case name + case fen + case url + } + } + /// - Remark: Generated from `#/components/schemas/ArenaPosition/case1`. + case case1(Components.Schemas.ArenaPosition.Case1Payload) + /// - Remark: Generated from `#/components/schemas/ArenaPosition/case2`. + internal struct Case2Payload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/ArenaPosition/case2/name`. + @frozen internal enum namePayload: String, Codable, Hashable, Sendable { + case Custom_space_position = "Custom position" + } + /// - Remark: Generated from `#/components/schemas/ArenaPosition/case2/name`. + internal var name: Components.Schemas.ArenaPosition.Case2Payload.namePayload? + /// - Remark: Generated from `#/components/schemas/ArenaPosition/case2/fen`. + internal var fen: Swift.String? + /// Creates a new `Case2Payload`. + /// + /// - Parameters: + /// - name: + /// - fen: + internal init( + name: Components.Schemas.ArenaPosition.Case2Payload.namePayload? = nil, + fen: Swift.String? = nil + ) { + self.name = name + self.fen = fen + } + internal enum CodingKeys: String, CodingKey { + case name + case fen + } + } + /// - Remark: Generated from `#/components/schemas/ArenaPosition/case2`. + case case2(Components.Schemas.ArenaPosition.Case2Payload) + internal init(from decoder: any Decoder) throws { + var errors: [any Error] = [] + do { + self = .case1(try .init(from: decoder)) + return + } catch { + errors.append(error) + } + do { + self = .case2(try .init(from: decoder)) + return + } catch { + errors.append(error) + } + throw Swift.DecodingError.failedToDecodeOneOfSchema( + type: Self.self, + codingPath: decoder.codingPath, + errors: errors + ) + } + internal func encode(to encoder: any Encoder) throws { + switch self { + case let .case1(value): + try value.encode(to: encoder) + case let .case2(value): + try value.encode(to: encoder) + } + } + } + /// - Remark: Generated from `#/components/schemas/ArenaTournament`. + internal struct ArenaTournament: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/ArenaTournament/id`. + internal var id: Swift.String? + /// - Remark: Generated from `#/components/schemas/ArenaTournament/createdBy`. + internal var createdBy: Swift.String? + /// - Remark: Generated from `#/components/schemas/ArenaTournament/system`. + @frozen internal enum systemPayload: String, Codable, Hashable, Sendable { + case arena = "arena" + } + /// - Remark: Generated from `#/components/schemas/ArenaTournament/system`. + internal var system: Components.Schemas.ArenaTournament.systemPayload? + /// - Remark: Generated from `#/components/schemas/ArenaTournament/minutes`. + internal var minutes: Swift.Int? + /// - Remark: Generated from `#/components/schemas/ArenaTournament/clock`. + internal var clock: Components.Schemas.Clock? + /// - Remark: Generated from `#/components/schemas/ArenaTournament/rated`. + internal var rated: Swift.Bool? + /// - Remark: Generated from `#/components/schemas/ArenaTournament/fullName`. + internal var fullName: Swift.String? + /// - Remark: Generated from `#/components/schemas/ArenaTournament/nbPlayers`. + internal var nbPlayers: Swift.Int? + /// - Remark: Generated from `#/components/schemas/ArenaTournament/variant`. + internal var variant: Components.Schemas.Variant? + /// - Remark: Generated from `#/components/schemas/ArenaTournament/startsAt`. + internal var startsAt: Swift.Int? + /// - Remark: Generated from `#/components/schemas/ArenaTournament/finishesAt`. + internal var finishesAt: Swift.Int? + /// - Remark: Generated from `#/components/schemas/ArenaTournament/status`. + internal var status: Components.Schemas.ArenaStatus? + /// - Remark: Generated from `#/components/schemas/ArenaTournament/perf`. + internal var perf: Components.Schemas.ArenaPerf? + /// - Remark: Generated from `#/components/schemas/ArenaTournament/secondsToStart`. + internal var secondsToStart: Swift.Int? + /// - Remark: Generated from `#/components/schemas/ArenaTournament/hasMaxRating`. + internal var hasMaxRating: Swift.Bool? + /// - Remark: Generated from `#/components/schemas/ArenaTournament/maxRating`. + internal var maxRating: Components.Schemas.ArenaRatingObj? + /// - Remark: Generated from `#/components/schemas/ArenaTournament/minRating`. + internal var minRating: Components.Schemas.ArenaRatingObj? + /// - Remark: Generated from `#/components/schemas/ArenaTournament/minRatedGames`. + internal struct minRatedGamesPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/ArenaTournament/minRatedGames/nb`. + internal var nb: Swift.Int? + /// - Remark: Generated from `#/components/schemas/ArenaTournament/minRatedGames/perf`. + internal var perf: Components.Schemas.PerfType? + /// Creates a new `minRatedGamesPayload`. + /// + /// - Parameters: + /// - nb: + /// - perf: + internal init( + nb: Swift.Int? = nil, + perf: Components.Schemas.PerfType? = nil + ) { + self.nb = nb + self.perf = perf + } + internal enum CodingKeys: String, CodingKey { + case nb + case perf + } + } + /// - Remark: Generated from `#/components/schemas/ArenaTournament/minRatedGames`. + internal var minRatedGames: Components.Schemas.ArenaTournament.minRatedGamesPayload? + /// - Remark: Generated from `#/components/schemas/ArenaTournament/onlyTitled`. + internal var onlyTitled: Swift.Bool? + /// - Remark: Generated from `#/components/schemas/ArenaTournament/teamMember`. + internal var teamMember: Swift.String? + /// - Remark: Generated from `#/components/schemas/ArenaTournament/private`. + internal var _private: Swift.Bool? + /// - Remark: Generated from `#/components/schemas/ArenaTournament/position`. + internal var position: Components.Schemas.ArenaPosition? + /// - Remark: Generated from `#/components/schemas/ArenaTournament/schedule`. + internal struct schedulePayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/ArenaTournament/schedule/freq`. + internal var freq: Swift.String? + /// - Remark: Generated from `#/components/schemas/ArenaTournament/schedule/speed`. + internal var speed: Swift.String? + /// Creates a new `schedulePayload`. + /// + /// - Parameters: + /// - freq: + /// - speed: + internal init( + freq: Swift.String? = nil, + speed: Swift.String? = nil + ) { + self.freq = freq + self.speed = speed + } + internal enum CodingKeys: String, CodingKey { + case freq + case speed + } + } + /// - Remark: Generated from `#/components/schemas/ArenaTournament/schedule`. + internal var schedule: Components.Schemas.ArenaTournament.schedulePayload? + /// - Remark: Generated from `#/components/schemas/ArenaTournament/teamBattle`. + internal struct teamBattlePayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/ArenaTournament/teamBattle/teams`. + internal var teams: [Swift.String]? + /// - Remark: Generated from `#/components/schemas/ArenaTournament/teamBattle/nbLeaders`. + internal var nbLeaders: Swift.Int? + /// Creates a new `teamBattlePayload`. + /// + /// - Parameters: + /// - teams: + /// - nbLeaders: + internal init( + teams: [Swift.String]? = nil, + nbLeaders: Swift.Int? = nil + ) { + self.teams = teams + self.nbLeaders = nbLeaders + } + internal enum CodingKeys: String, CodingKey { + case teams + case nbLeaders + } + } + /// - Remark: Generated from `#/components/schemas/ArenaTournament/teamBattle`. + internal var teamBattle: Components.Schemas.ArenaTournament.teamBattlePayload? + /// - Remark: Generated from `#/components/schemas/ArenaTournament/winner`. + internal struct winnerPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/ArenaTournament/winner/id`. + internal var id: Swift.String? + /// - Remark: Generated from `#/components/schemas/ArenaTournament/winner/name`. + internal var name: Swift.String? + /// - Remark: Generated from `#/components/schemas/ArenaTournament/winner/title`. + internal var title: Components.Schemas.Title? + /// Creates a new `winnerPayload`. + /// + /// - Parameters: + /// - id: + /// - name: + /// - title: + internal init( + id: Swift.String? = nil, + name: Swift.String? = nil, + title: Components.Schemas.Title? = nil + ) { + self.id = id + self.name = name + self.title = title + } + internal enum CodingKeys: String, CodingKey { + case id + case name + case title + } + } + /// - Remark: Generated from `#/components/schemas/ArenaTournament/winner`. + internal var winner: Components.Schemas.ArenaTournament.winnerPayload? + /// Creates a new `ArenaTournament`. + /// + /// - Parameters: + /// - id: + /// - createdBy: + /// - system: + /// - minutes: + /// - clock: + /// - rated: + /// - fullName: + /// - nbPlayers: + /// - variant: + /// - startsAt: + /// - finishesAt: + /// - status: + /// - perf: + /// - secondsToStart: + /// - hasMaxRating: + /// - maxRating: + /// - minRating: + /// - minRatedGames: + /// - onlyTitled: + /// - teamMember: + /// - _private: + /// - position: + /// - schedule: + /// - teamBattle: + /// - winner: + internal init( + id: Swift.String? = nil, + createdBy: Swift.String? = nil, + system: Components.Schemas.ArenaTournament.systemPayload? = nil, + minutes: Swift.Int? = nil, + clock: Components.Schemas.Clock? = nil, + rated: Swift.Bool? = nil, + fullName: Swift.String? = nil, + nbPlayers: Swift.Int? = nil, + variant: Components.Schemas.Variant? = nil, + startsAt: Swift.Int? = nil, + finishesAt: Swift.Int? = nil, + status: Components.Schemas.ArenaStatus? = nil, + perf: Components.Schemas.ArenaPerf? = nil, + secondsToStart: Swift.Int? = nil, + hasMaxRating: Swift.Bool? = nil, + maxRating: Components.Schemas.ArenaRatingObj? = nil, + minRating: Components.Schemas.ArenaRatingObj? = nil, + minRatedGames: Components.Schemas.ArenaTournament.minRatedGamesPayload? = nil, + onlyTitled: Swift.Bool? = nil, + teamMember: Swift.String? = nil, + _private: Swift.Bool? = nil, + position: Components.Schemas.ArenaPosition? = nil, + schedule: Components.Schemas.ArenaTournament.schedulePayload? = nil, + teamBattle: Components.Schemas.ArenaTournament.teamBattlePayload? = nil, + winner: Components.Schemas.ArenaTournament.winnerPayload? = nil + ) { + self.id = id + self.createdBy = createdBy + self.system = system + self.minutes = minutes + self.clock = clock + self.rated = rated + self.fullName = fullName + self.nbPlayers = nbPlayers + self.variant = variant + self.startsAt = startsAt + self.finishesAt = finishesAt + self.status = status + self.perf = perf + self.secondsToStart = secondsToStart + self.hasMaxRating = hasMaxRating + self.maxRating = maxRating + self.minRating = minRating + self.minRatedGames = minRatedGames + self.onlyTitled = onlyTitled + self.teamMember = teamMember + self._private = _private + self.position = position + self.schedule = schedule + self.teamBattle = teamBattle + self.winner = winner + } + internal enum CodingKeys: String, CodingKey { + case id + case createdBy + case system + case minutes + case clock + case rated + case fullName + case nbPlayers + case variant + case startsAt + case finishesAt + case status + case perf + case secondsToStart + case hasMaxRating + case maxRating + case minRating + case minRatedGames + case onlyTitled + case teamMember + case _private = "private" + case position + case schedule + case teamBattle + case winner + } + } + /// - Remark: Generated from `#/components/schemas/ArenaTournaments`. + internal struct ArenaTournaments: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/ArenaTournaments/created`. + internal var created: [Components.Schemas.ArenaTournament]? + /// - Remark: Generated from `#/components/schemas/ArenaTournaments/started`. + internal var started: [Components.Schemas.ArenaTournament]? + /// - Remark: Generated from `#/components/schemas/ArenaTournaments/finished`. + internal var finished: [Components.Schemas.ArenaTournament]? + /// Creates a new `ArenaTournaments`. + /// + /// - Parameters: + /// - created: + /// - started: + /// - finished: + internal init( + created: [Components.Schemas.ArenaTournament]? = nil, + started: [Components.Schemas.ArenaTournament]? = nil, + finished: [Components.Schemas.ArenaTournament]? = nil + ) { + self.created = created + self.started = started + self.finished = finished + } + internal enum CodingKeys: String, CodingKey { + case created + case started + case finished + } + } + /// Custom initial position (in FEN). Variant must be standard, fromPosition, or chess960 (if a valid 960 starting position), and the game cannot be rated. + /// + /// - Remark: Generated from `#/components/schemas/FromPositionFEN`. + internal typealias FromPositionFEN = Swift.String + /// - Remark: Generated from `#/components/schemas/ArenaTournamentVariantIsKey`. + internal typealias ArenaTournamentVariantIsKey = OpenAPIRuntime.OpenAPIValueContainer + /// - Remark: Generated from `#/components/schemas/Error`. + internal struct _Error: Codable, Hashable, Sendable { + /// The cause of the error. + /// + /// - Remark: Generated from `#/components/schemas/Error/error`. + internal var error: Swift.String? + /// Creates a new `_Error`. + /// + /// - Parameters: + /// - error: The cause of the error. + internal init(error: Swift.String? = nil) { + self.error = error + } + internal enum CodingKeys: String, CodingKey { + case error + } + } + /// - Remark: Generated from `#/components/schemas/SwissTournament`. + internal typealias SwissTournament = OpenAPIRuntime.OpenAPIValueContainer + /// - Remark: Generated from `#/components/schemas/SwissUnauthorisedEdit`. + internal struct SwissUnauthorisedEdit: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/SwissUnauthorisedEdit/error`. + internal var error: Swift.String? + /// Creates a new `SwissUnauthorisedEdit`. + /// + /// - Parameters: + /// - error: + internal init(error: Swift.String? = nil) { + self.error = error + } + internal enum CodingKeys: String, CodingKey { + case error + } + } + /// - Remark: Generated from `#/components/schemas/StudyPgn`. + internal typealias StudyPgn = OpenAPIRuntime.OpenAPIValueContainer + /// - Remark: Generated from `#/components/schemas/StudyImportPgnChapters`. + internal typealias StudyImportPgnChapters = OpenAPIRuntime.OpenAPIValueContainer + /// - Remark: Generated from `#/components/schemas/StudyMetadata`. + internal typealias StudyMetadata = OpenAPIRuntime.OpenAPIValueContainer + /// - Remark: Generated from `#/components/schemas/BroadcastTour`. + internal typealias BroadcastTour = OpenAPIRuntime.OpenAPIValueContainer + /// - Remark: Generated from `#/components/schemas/BroadcastForm`. + internal struct BroadcastForm: Codable, Hashable, Sendable { + /// Name of the broadcast tournament. Length must be between 3 and 80 characters. + /// + /// Example: `Sinquefield Cup` + /// + /// + /// - Remark: Generated from `#/components/schemas/BroadcastForm/name`. + internal var name: Swift.String + /// Short description of the broadcast tournament. Length must be between 3 and 400 characters. + /// + /// Example: `An 11 round classical tournament featuring the 9 highest rated players in the world. Including Carlsen, Caruana, Ding, Aronian, Nakamura and more.` + /// + /// + /// - Remark: Generated from `#/components/schemas/BroadcastForm/description`. + internal var description: Swift.String + /// Compute and display a simple leaderboard based on game results + /// + /// - Remark: Generated from `#/components/schemas/BroadcastForm/autoLeaderboard`. + internal var autoLeaderboard: Swift.Bool + /// Optional long description of the broadcast. Markdown is supported. Length must be less than 20,000 characters. + /// + /// - Remark: Generated from `#/components/schemas/BroadcastForm/markdown`. + internal var markdown: Swift.String? + /// Optional, for Lichess admins only, use to feature on /broadcast. + /// + /// * `3` for normal + /// * `4` for high + /// * `5` for best + /// + /// + /// - Remark: Generated from `#/components/schemas/BroadcastForm/tier`. + internal var tier: Swift.Int? + /// Optional replace player names, ratings and titles. + /// + /// One line per player, formatted as such: + /// + /// `player name = FIDE ID` + /// + /// Example: + /// + /// `Magnus Carlsen = 1503014` + /// + /// Player names ignore case and punctuation, and match all possible combinations of 2 words: + /// "Jorge Rick Vito" will match "Jorge Rick", "jorge vito", "Rick, Vito", etc. + /// + /// Alternatively, you may set tags manually, like so: + /// + /// `player name / rating / title / new name` + /// + /// All values are optional. Example: + /// + /// `Magnus Carlsen / 2863 / GM` + /// `YouGotLittUp / 1890 / / Louis Litt` + /// + /// + /// - Remark: Generated from `#/components/schemas/BroadcastForm/players`. + internal var players: OpenAPIRuntime.OpenAPIValueContainer? + /// Creates a new `BroadcastForm`. + /// + /// - Parameters: + /// - name: Name of the broadcast tournament. Length must be between 3 and 80 characters. + /// - description: Short description of the broadcast tournament. Length must be between 3 and 400 characters. + /// - autoLeaderboard: Compute and display a simple leaderboard based on game results + /// - markdown: Optional long description of the broadcast. Markdown is supported. Length must be less than 20,000 characters. + /// - tier: Optional, for Lichess admins only, use to feature on /broadcast. + /// - players: Optional replace player names, ratings and titles. + internal init( + name: Swift.String, + description: Swift.String, + autoLeaderboard: Swift.Bool, + markdown: Swift.String? = nil, + tier: Swift.Int? = nil, + players: OpenAPIRuntime.OpenAPIValueContainer? = nil + ) { + self.name = name + self.description = description + self.autoLeaderboard = autoLeaderboard + self.markdown = markdown + self.tier = tier + self.players = players + } + internal enum CodingKeys: String, CodingKey { + case name + case description + case autoLeaderboard + case markdown + case tier + case players + } + } + /// - Remark: Generated from `#/components/schemas/BroadcastLeaderboardEntry`. + internal struct BroadcastLeaderboardEntry: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/BroadcastLeaderboardEntry/name`. + internal var name: Swift.String? + /// - Remark: Generated from `#/components/schemas/BroadcastLeaderboardEntry/score`. + internal var score: Swift.Double? + /// - Remark: Generated from `#/components/schemas/BroadcastLeaderboardEntry/played`. + internal var played: Swift.Int? + /// - Remark: Generated from `#/components/schemas/BroadcastLeaderboardEntry/rating`. + internal var rating: Swift.Int? + /// - Remark: Generated from `#/components/schemas/BroadcastLeaderboardEntry/title`. + internal var title: Swift.String? + /// - Remark: Generated from `#/components/schemas/BroadcastLeaderboardEntry/fideId`. + internal var fideId: Swift.Int? + /// - Remark: Generated from `#/components/schemas/BroadcastLeaderboardEntry/fed`. + internal var fed: Swift.String? + /// Creates a new `BroadcastLeaderboardEntry`. + /// + /// - Parameters: + /// - name: + /// - score: + /// - played: + /// - rating: + /// - title: + /// - fideId: + /// - fed: + internal init( + name: Swift.String? = nil, + score: Swift.Double? = nil, + played: Swift.Int? = nil, + rating: Swift.Int? = nil, + title: Swift.String? = nil, + fideId: Swift.Int? = nil, + fed: Swift.String? = nil + ) { + self.name = name + self.score = score + self.played = played + self.rating = rating + self.title = title + self.fideId = fideId + self.fed = fed + } + internal enum CodingKeys: String, CodingKey { + case name + case score + case played + case rating + case title + case fideId + case fed + } + } + /// - Remark: Generated from `#/components/schemas/BroadcastRound`. + internal typealias BroadcastRound = OpenAPIRuntime.OpenAPIValueContainer + /// - Remark: Generated from `#/components/schemas/BroadcastPgnPush`. + internal struct BroadcastPgnPush: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/BroadcastPgnPush/gamesPayload`. + internal struct gamesPayloadPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/BroadcastPgnPush/gamesPayload/tags`. + internal var tags: OpenAPIRuntime.OpenAPIObjectContainer? + /// - Remark: Generated from `#/components/schemas/BroadcastPgnPush/gamesPayload/moves`. + internal var moves: Swift.Int? + /// - Remark: Generated from `#/components/schemas/BroadcastPgnPush/gamesPayload/error`. + internal var error: Swift.String? + /// Creates a new `gamesPayloadPayload`. + /// + /// - Parameters: + /// - tags: + /// - moves: + /// - error: + internal init( + tags: OpenAPIRuntime.OpenAPIObjectContainer? = nil, + moves: Swift.Int? = nil, + error: Swift.String? = nil + ) { + self.tags = tags + self.moves = moves + self.error = error + } + internal enum CodingKeys: String, CodingKey { + case tags + case moves + case error + } + } + /// - Remark: Generated from `#/components/schemas/BroadcastPgnPush/games`. + internal typealias gamesPayload = [Components.Schemas.BroadcastPgnPush.gamesPayloadPayload] + /// - Remark: Generated from `#/components/schemas/BroadcastPgnPush/games`. + internal var games: Components.Schemas.BroadcastPgnPush.gamesPayload? + /// Creates a new `BroadcastPgnPush`. + /// + /// - Parameters: + /// - games: + internal init(games: Components.Schemas.BroadcastPgnPush.gamesPayload? = nil) { + self.games = games + } + internal enum CodingKeys: String, CodingKey { + case games + } + } + /// - Remark: Generated from `#/components/schemas/BroadcastMyRound`. + internal typealias BroadcastMyRound = OpenAPIRuntime.OpenAPIValueContainer + /// - Remark: Generated from `#/components/schemas/Simul`. + internal typealias Simul = OpenAPIRuntime.OpenAPIValueContainer + /// - Remark: Generated from `#/components/schemas/Team`. + internal struct Team: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/Team/id`. + internal var id: Swift.String? + /// - Remark: Generated from `#/components/schemas/Team/name`. + internal var name: Swift.String? + /// - Remark: Generated from `#/components/schemas/Team/description`. + internal var description: Swift.String? + /// - Remark: Generated from `#/components/schemas/Team/open`. + internal var open: Swift.Bool? + /// - Remark: Generated from `#/components/schemas/Team/leaders`. + internal var leaders: [Components.Schemas.LightUser]? + /// - Remark: Generated from `#/components/schemas/Team/nbMembers`. + internal var nbMembers: Swift.Int? + /// Creates a new `Team`. + /// + /// - Parameters: + /// - id: + /// - name: + /// - description: + /// - open: + /// - leaders: + /// - nbMembers: + internal init( + id: Swift.String? = nil, + name: Swift.String? = nil, + description: Swift.String? = nil, + open: Swift.Bool? = nil, + leaders: [Components.Schemas.LightUser]? = nil, + nbMembers: Swift.Int? = nil + ) { + self.id = id + self.name = name + self.description = description + self.open = open + self.leaders = leaders + self.nbMembers = nbMembers + } + internal enum CodingKeys: String, CodingKey { + case id + case name + case description + case open + case leaders + case nbMembers + } + } + /// - Remark: Generated from `#/components/schemas/TeamPaginatorJson`. + internal struct TeamPaginatorJson: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/TeamPaginatorJson/currentPage`. + internal var currentPage: Swift.Double? + /// - Remark: Generated from `#/components/schemas/TeamPaginatorJson/maxPerPage`. + internal var maxPerPage: Swift.Double? + /// - Remark: Generated from `#/components/schemas/TeamPaginatorJson/currentPageResults`. + internal var currentPageResults: [Components.Schemas.Team]? + /// - Remark: Generated from `#/components/schemas/TeamPaginatorJson/nbResults`. + internal var nbResults: Swift.Double? + /// - Remark: Generated from `#/components/schemas/TeamPaginatorJson/previousPage`. + internal var previousPage: Swift.Double? + /// - Remark: Generated from `#/components/schemas/TeamPaginatorJson/nextPage`. + internal var nextPage: Swift.Double? + /// - Remark: Generated from `#/components/schemas/TeamPaginatorJson/nbPages`. + internal var nbPages: Swift.Double? + /// Creates a new `TeamPaginatorJson`. + /// + /// - Parameters: + /// - currentPage: + /// - maxPerPage: + /// - currentPageResults: + /// - nbResults: + /// - previousPage: + /// - nextPage: + /// - nbPages: + internal init( + currentPage: Swift.Double? = nil, + maxPerPage: Swift.Double? = nil, + currentPageResults: [Components.Schemas.Team]? = nil, + nbResults: Swift.Double? = nil, + previousPage: Swift.Double? = nil, + nextPage: Swift.Double? = nil, + nbPages: Swift.Double? = nil + ) { + self.currentPage = currentPage + self.maxPerPage = maxPerPage + self.currentPageResults = currentPageResults + self.nbResults = nbResults + self.previousPage = previousPage + self.nextPage = nextPage + self.nbPages = nbPages + } + internal enum CodingKeys: String, CodingKey { + case currentPage + case maxPerPage + case currentPageResults + case nbResults + case previousPage + case nextPage + case nbPages + } + } + /// - Remark: Generated from `#/components/schemas/TeamRequest`. + internal struct TeamRequest: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/TeamRequest/teamId`. + internal var teamId: Swift.String? + /// - Remark: Generated from `#/components/schemas/TeamRequest/userId`. + internal var userId: Swift.String? + /// - Remark: Generated from `#/components/schemas/TeamRequest/date`. + internal var date: Swift.Double? + /// - Remark: Generated from `#/components/schemas/TeamRequest/message`. + internal var message: Swift.String? + /// Creates a new `TeamRequest`. + /// + /// - Parameters: + /// - teamId: + /// - userId: + /// - date: + /// - message: + internal init( + teamId: Swift.String? = nil, + userId: Swift.String? = nil, + date: Swift.Double? = nil, + message: Swift.String? = nil + ) { + self.teamId = teamId + self.userId = userId + self.date = date + self.message = message + } + internal enum CodingKeys: String, CodingKey { + case teamId + case userId + case date + case message + } + } + /// - Remark: Generated from `#/components/schemas/TeamRequestWithUser`. + internal struct TeamRequestWithUser: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/TeamRequestWithUser/request`. + internal var request: Components.Schemas.TeamRequest? + /// - Remark: Generated from `#/components/schemas/TeamRequestWithUser/user`. + internal var user: Components.Schemas.User? + /// Creates a new `TeamRequestWithUser`. + /// + /// - Parameters: + /// - request: + /// - user: + internal init( + request: Components.Schemas.TeamRequest? = nil, + user: Components.Schemas.User? = nil + ) { + self.request = request + self.user = user + } + internal enum CodingKeys: String, CodingKey { + case request + case user + } + } + /// - Remark: Generated from `#/components/schemas/Crosstable`. + internal typealias Crosstable = OpenAPIRuntime.OpenAPIValueContainer + /// - Remark: Generated from `#/components/schemas/LightUserOnline`. + internal struct LightUserOnline: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/LightUserOnline/value1`. + internal var value1: Components.Schemas.LightUser + /// - Remark: Generated from `#/components/schemas/LightUserOnline/value2`. + internal struct Value2Payload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/LightUserOnline/value2/online`. + internal var online: Swift.Bool? + /// Creates a new `Value2Payload`. + /// + /// - Parameters: + /// - online: + internal init(online: Swift.Bool? = nil) { + self.online = online + } + internal enum CodingKeys: String, CodingKey { + case online + } + } + /// - Remark: Generated from `#/components/schemas/LightUserOnline/value2`. + internal var value2: Components.Schemas.LightUserOnline.Value2Payload + /// Creates a new `LightUserOnline`. + /// + /// - Parameters: + /// - value1: + /// - value2: + internal init( + value1: Components.Schemas.LightUser, + value2: Components.Schemas.LightUserOnline.Value2Payload + ) { + self.value1 = value1 + self.value2 = value2 + } + internal init(from decoder: any Decoder) throws { + value1 = try .init(from: decoder) + value2 = try .init(from: decoder) + } + internal func encode(to encoder: any Encoder) throws { + try value1.encode(to: encoder) + try value2.encode(to: encoder) + } + } + /// - Remark: Generated from `#/components/schemas/UserNote`. + internal struct UserNote: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/UserNote/from`. + internal var from: Components.Schemas.LightUser? + /// - Remark: Generated from `#/components/schemas/UserNote/to`. + internal var to: Components.Schemas.LightUser? + /// - Remark: Generated from `#/components/schemas/UserNote/text`. + internal var text: Swift.String? + /// - Remark: Generated from `#/components/schemas/UserNote/date`. + internal var date: Swift.Int64? + /// Creates a new `UserNote`. + /// + /// - Parameters: + /// - from: + /// - to: + /// - text: + /// - date: + internal init( + from: Components.Schemas.LightUser? = nil, + to: Components.Schemas.LightUser? = nil, + text: Swift.String? = nil, + date: Swift.Int64? = nil + ) { + self.from = from + self.to = to + self.text = text + self.date = date + } + internal enum CodingKeys: String, CodingKey { + case from + case to + case text + case date + } + } + /// - Remark: Generated from `#/components/schemas/GameEventInfo`. + internal struct GameEventInfo: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/GameEventInfo/id`. + internal var id: Swift.String? + /// - Remark: Generated from `#/components/schemas/GameEventInfo/source`. + @frozen internal enum sourcePayload: String, Codable, Hashable, Sendable { + case lobby = "lobby" + case friend = "friend" + case ai = "ai" + case api = "api" + case tournament = "tournament" + case position = "position" + case _import = "import" + case importlive = "importlive" + case simul = "simul" + case relay = "relay" + case pool = "pool" + case swiss = "swiss" + } + /// - Remark: Generated from `#/components/schemas/GameEventInfo/source`. + internal var source: Components.Schemas.GameEventInfo.sourcePayload? + /// - Remark: Generated from `#/components/schemas/GameEventInfo/status`. + internal struct statusPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/GameEventInfo/status/id`. + @frozen internal enum idPayload: Int, Codable, Hashable, Sendable { + case _10 = 10 + case _20 = 20 + case _25 = 25 + case _30 = 30 + case _31 = 31 + case _32 = 32 + case _33 = 33 + case _34 = 34 + case _35 = 35 + case _36 = 36 + case _37 = 37 + case _38 = 38 + case _60 = 60 + } + /// - Remark: Generated from `#/components/schemas/GameEventInfo/status/id`. + internal var id: Components.Schemas.GameEventInfo.statusPayload.idPayload? + /// - Remark: Generated from `#/components/schemas/GameEventInfo/status/name`. + internal var name: Components.Schemas.GameStatus? + /// Creates a new `statusPayload`. + /// + /// - Parameters: + /// - id: + /// - name: + internal init( + id: Components.Schemas.GameEventInfo.statusPayload.idPayload? = nil, + name: Components.Schemas.GameStatus? = nil + ) { + self.id = id + self.name = name + } + internal enum CodingKeys: String, CodingKey { + case id + case name + } + } + /// - Remark: Generated from `#/components/schemas/GameEventInfo/status`. + internal var status: Components.Schemas.GameEventInfo.statusPayload? + /// - Remark: Generated from `#/components/schemas/GameEventInfo/winner`. + @frozen internal enum winnerPayload: String, Codable, Hashable, Sendable { + case white = "white" + case black = "black" + } + /// - Remark: Generated from `#/components/schemas/GameEventInfo/winner`. + internal var winner: Components.Schemas.GameEventInfo.winnerPayload? + /// - Remark: Generated from `#/components/schemas/GameEventInfo/compat`. + internal struct compatPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/GameEventInfo/compat/bot`. + internal var bot: Swift.Bool? + /// - Remark: Generated from `#/components/schemas/GameEventInfo/compat/board`. + internal var board: Swift.Bool? + /// Creates a new `compatPayload`. + /// + /// - Parameters: + /// - bot: + /// - board: + internal init( + bot: Swift.Bool? = nil, + board: Swift.Bool? = nil + ) { + self.bot = bot + self.board = board + } + internal enum CodingKeys: String, CodingKey { + case bot + case board + } + } + /// - Remark: Generated from `#/components/schemas/GameEventInfo/compat`. + internal var compat: Components.Schemas.GameEventInfo.compatPayload? + /// Creates a new `GameEventInfo`. + /// + /// - Parameters: + /// - id: + /// - source: + /// - status: + /// - winner: + /// - compat: + internal init( + id: Swift.String? = nil, + source: Components.Schemas.GameEventInfo.sourcePayload? = nil, + status: Components.Schemas.GameEventInfo.statusPayload? = nil, + winner: Components.Schemas.GameEventInfo.winnerPayload? = nil, + compat: Components.Schemas.GameEventInfo.compatPayload? = nil + ) { + self.id = id + self.source = source + self.status = status + self.winner = winner + self.compat = compat + } + internal enum CodingKeys: String, CodingKey { + case id + case source + case status + case winner + case compat + } + } + /// - Remark: Generated from `#/components/schemas/GameStartEvent`. + internal struct GameStartEvent: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/GameStartEvent/type`. + @frozen internal enum _typePayload: String, Codable, Hashable, Sendable { + case gameStart = "gameStart" + } + /// - Remark: Generated from `#/components/schemas/GameStartEvent/type`. + internal var _type: Components.Schemas.GameStartEvent._typePayload? + /// - Remark: Generated from `#/components/schemas/GameStartEvent/game`. + internal var game: Components.Schemas.GameEventInfo? + /// Creates a new `GameStartEvent`. + /// + /// - Parameters: + /// - _type: + /// - game: + internal init( + _type: Components.Schemas.GameStartEvent._typePayload? = nil, + game: Components.Schemas.GameEventInfo? = nil + ) { + self._type = _type + self.game = game + } + internal enum CodingKeys: String, CodingKey { + case _type = "type" + case game + } + } + /// - Remark: Generated from `#/components/schemas/GameFinishEvent`. + internal struct GameFinishEvent: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/GameFinishEvent/type`. + @frozen internal enum _typePayload: String, Codable, Hashable, Sendable { + case gameFinish = "gameFinish" + } + /// - Remark: Generated from `#/components/schemas/GameFinishEvent/type`. + internal var _type: Components.Schemas.GameFinishEvent._typePayload? + /// - Remark: Generated from `#/components/schemas/GameFinishEvent/game`. + internal var game: Components.Schemas.GameEventInfo? + /// Creates a new `GameFinishEvent`. + /// + /// - Parameters: + /// - _type: + /// - game: + internal init( + _type: Components.Schemas.GameFinishEvent._typePayload? = nil, + game: Components.Schemas.GameEventInfo? = nil + ) { + self._type = _type + self.game = game + } + internal enum CodingKeys: String, CodingKey { + case _type = "type" + case game + } + } + /// - Remark: Generated from `#/components/schemas/ChallengeUser`. + internal struct ChallengeUser: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/ChallengeUser/value1`. + internal var value1: Components.Schemas.LightUser + /// Creates a new `ChallengeUser`. + /// + /// - Parameters: + /// - value1: + internal init(value1: Components.Schemas.LightUser) { + self.value1 = value1 + } + internal init(from decoder: any Decoder) throws { + value1 = try .init(from: decoder) + } + internal func encode(to encoder: any Encoder) throws { + try value1.encode(to: encoder) + } + } + /// - Remark: Generated from `#/components/schemas/ChallengeJson`. + internal struct ChallengeJson: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/ChallengeJson/id`. + internal var id: Swift.String + /// - Remark: Generated from `#/components/schemas/ChallengeJson/url`. + internal var url: Swift.String + /// - Remark: Generated from `#/components/schemas/ChallengeJson/status`. + @frozen internal enum statusPayload: String, Codable, Hashable, Sendable { + case created = "created" + case offline = "offline" + case canceled = "canceled" + case declined = "declined" + case accepted = "accepted" + } + /// - Remark: Generated from `#/components/schemas/ChallengeJson/status`. + internal var status: Components.Schemas.ChallengeJson.statusPayload + /// - Remark: Generated from `#/components/schemas/ChallengeJson/challenger`. + internal var challenger: Components.Schemas.ChallengeUser + /// - Remark: Generated from `#/components/schemas/ChallengeJson/destUser`. + @frozen internal enum destUserPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/ChallengeJson/destUser/case1`. + case ChallengeUser(Components.Schemas.ChallengeUser) + /// - Remark: Generated from `#/components/schemas/ChallengeJson/destUser/case2`. + case case2(OpenAPIRuntime.OpenAPIValueContainer) + internal init(from decoder: any Decoder) throws { + var errors: [any Error] = [] + do { + self = .ChallengeUser(try .init(from: decoder)) + return + } catch { + errors.append(error) + } + do { + self = .case2(try .init(from: decoder)) + return + } catch { + errors.append(error) + } + throw Swift.DecodingError.failedToDecodeOneOfSchema( + type: Self.self, + codingPath: decoder.codingPath, + errors: errors + ) + } + internal func encode(to encoder: any Encoder) throws { + switch self { + case let .ChallengeUser(value): + try value.encode(to: encoder) + case let .case2(value): + try value.encode(to: encoder) + } + } + } + /// - Remark: Generated from `#/components/schemas/ChallengeJson/destUser`. + internal var destUser: Components.Schemas.ChallengeJson.destUserPayload + /// - Remark: Generated from `#/components/schemas/ChallengeJson/variant`. + internal var variant: Components.Schemas.Variant + /// - Remark: Generated from `#/components/schemas/ChallengeJson/rated`. + internal var rated: Swift.Bool + /// - Remark: Generated from `#/components/schemas/ChallengeJson/speed`. + internal var speed: Components.Schemas.Speed + /// - Remark: Generated from `#/components/schemas/ChallengeJson/timeControl`. + @frozen internal enum timeControlPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/ChallengeJson/timeControl/case1`. + internal struct Case1Payload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/ChallengeJson/timeControl/case1/type`. + internal var _type: Swift.String? + /// - Remark: Generated from `#/components/schemas/ChallengeJson/timeControl/case1/limit`. + internal var limit: Swift.Double? + /// - Remark: Generated from `#/components/schemas/ChallengeJson/timeControl/case1/increment`. + internal var increment: Swift.Double? + /// - Remark: Generated from `#/components/schemas/ChallengeJson/timeControl/case1/show`. + internal var show: Swift.String? + /// Creates a new `Case1Payload`. + /// + /// - Parameters: + /// - _type: + /// - limit: + /// - increment: + /// - show: + internal init( + _type: Swift.String? = nil, + limit: Swift.Double? = nil, + increment: Swift.Double? = nil, + show: Swift.String? = nil + ) { + self._type = _type + self.limit = limit + self.increment = increment + self.show = show + } + internal enum CodingKeys: String, CodingKey { + case _type = "type" + case limit + case increment + case show + } + internal init(from decoder: any Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + _type = try container.decodeIfPresent( + Swift.String.self, + forKey: ._type + ) + limit = try container.decodeIfPresent( + Swift.Double.self, + forKey: .limit + ) + increment = try container.decodeIfPresent( + Swift.Double.self, + forKey: .increment + ) + show = try container.decodeIfPresent( + Swift.String.self, + forKey: .show + ) + try decoder.ensureNoAdditionalProperties(knownKeys: [ + "type", + "limit", + "increment", + "show" + ]) + } + } + /// - Remark: Generated from `#/components/schemas/ChallengeJson/timeControl/case1`. + case case1(Components.Schemas.ChallengeJson.timeControlPayload.Case1Payload) + /// - Remark: Generated from `#/components/schemas/ChallengeJson/timeControl/case2`. + internal struct Case2Payload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/ChallengeJson/timeControl/case2/type`. + internal var _type: Swift.String? + /// - Remark: Generated from `#/components/schemas/ChallengeJson/timeControl/case2/daysPerTurn`. + internal var daysPerTurn: Swift.Double? + /// Creates a new `Case2Payload`. + /// + /// - Parameters: + /// - _type: + /// - daysPerTurn: + internal init( + _type: Swift.String? = nil, + daysPerTurn: Swift.Double? = nil + ) { + self._type = _type + self.daysPerTurn = daysPerTurn + } + internal enum CodingKeys: String, CodingKey { + case _type = "type" + case daysPerTurn + } + internal init(from decoder: any Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + _type = try container.decodeIfPresent( + Swift.String.self, + forKey: ._type + ) + daysPerTurn = try container.decodeIfPresent( + Swift.Double.self, + forKey: .daysPerTurn + ) + try decoder.ensureNoAdditionalProperties(knownKeys: [ + "type", + "daysPerTurn" + ]) + } + } + /// - Remark: Generated from `#/components/schemas/ChallengeJson/timeControl/case2`. + case case2(Components.Schemas.ChallengeJson.timeControlPayload.Case2Payload) + /// - Remark: Generated from `#/components/schemas/ChallengeJson/timeControl/case3`. + internal struct Case3Payload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/ChallengeJson/timeControl/case3/type`. + internal var _type: Swift.String? + /// Creates a new `Case3Payload`. + /// + /// - Parameters: + /// - _type: + internal init(_type: Swift.String? = nil) { + self._type = _type + } + internal enum CodingKeys: String, CodingKey { + case _type = "type" + } + internal init(from decoder: any Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + _type = try container.decodeIfPresent( + Swift.String.self, + forKey: ._type + ) + try decoder.ensureNoAdditionalProperties(knownKeys: [ + "type" + ]) + } + } + /// - Remark: Generated from `#/components/schemas/ChallengeJson/timeControl/case3`. + case case3(Components.Schemas.ChallengeJson.timeControlPayload.Case3Payload) + internal init(from decoder: any Decoder) throws { + var errors: [any Error] = [] + do { + self = .case1(try .init(from: decoder)) + return + } catch { + errors.append(error) + } + do { + self = .case2(try .init(from: decoder)) + return + } catch { + errors.append(error) + } + do { + self = .case3(try .init(from: decoder)) + return + } catch { + errors.append(error) + } + throw Swift.DecodingError.failedToDecodeOneOfSchema( + type: Self.self, + codingPath: decoder.codingPath, + errors: errors + ) + } + internal func encode(to encoder: any Encoder) throws { + switch self { + case let .case1(value): + try value.encode(to: encoder) + case let .case2(value): + try value.encode(to: encoder) + case let .case3(value): + try value.encode(to: encoder) + } + } + } + /// - Remark: Generated from `#/components/schemas/ChallengeJson/timeControl`. + internal var timeControl: Components.Schemas.ChallengeJson.timeControlPayload + /// - Remark: Generated from `#/components/schemas/ChallengeJson/color`. + @frozen internal enum colorPayload: String, Codable, Hashable, Sendable { + case white = "white" + case black = "black" + case random = "random" + } + /// - Remark: Generated from `#/components/schemas/ChallengeJson/color`. + internal var color: Components.Schemas.ChallengeJson.colorPayload + /// - Remark: Generated from `#/components/schemas/ChallengeJson/perf`. + internal struct perfPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/ChallengeJson/perf/icon`. + internal var icon: Swift.String? + /// - Remark: Generated from `#/components/schemas/ChallengeJson/perf/name`. + internal var name: Swift.String? + /// Creates a new `perfPayload`. + /// + /// - Parameters: + /// - icon: + /// - name: + internal init( + icon: Swift.String? = nil, + name: Swift.String? = nil + ) { + self.icon = icon + self.name = name + } + internal enum CodingKeys: String, CodingKey { + case icon + case name + } + } + /// - Remark: Generated from `#/components/schemas/ChallengeJson/perf`. + internal var perf: Components.Schemas.ChallengeJson.perfPayload + /// - Remark: Generated from `#/components/schemas/ChallengeJson/direction`. + @frozen internal enum directionPayload: String, Codable, Hashable, Sendable { + case _in = "in" + case out = "out" + } + /// - Remark: Generated from `#/components/schemas/ChallengeJson/direction`. + internal var direction: Components.Schemas.ChallengeJson.directionPayload? + /// - Remark: Generated from `#/components/schemas/ChallengeJson/initialFen`. + internal var initialFen: Swift.String? + /// Human readable, possibly translated reason why the challenge was declined. + /// + /// - Remark: Generated from `#/components/schemas/ChallengeJson/declineReason`. + internal var declineReason: Swift.String? + /// Untranslated, computer-matchable reason why the challenge was declined. + /// + /// - Remark: Generated from `#/components/schemas/ChallengeJson/declineReasonKey`. + internal var declineReasonKey: Swift.String? + /// Creates a new `ChallengeJson`. + /// + /// - Parameters: + /// - id: + /// - url: + /// - status: + /// - challenger: + /// - destUser: + /// - variant: + /// - rated: + /// - speed: + /// - timeControl: + /// - color: + /// - perf: + /// - direction: + /// - initialFen: + /// - declineReason: Human readable, possibly translated reason why the challenge was declined. + /// - declineReasonKey: Untranslated, computer-matchable reason why the challenge was declined. + internal init( + id: Swift.String, + url: Swift.String, + status: Components.Schemas.ChallengeJson.statusPayload, + challenger: Components.Schemas.ChallengeUser, + destUser: Components.Schemas.ChallengeJson.destUserPayload, + variant: Components.Schemas.Variant, + rated: Swift.Bool, + speed: Components.Schemas.Speed, + timeControl: Components.Schemas.ChallengeJson.timeControlPayload, + color: Components.Schemas.ChallengeJson.colorPayload, + perf: Components.Schemas.ChallengeJson.perfPayload, + direction: Components.Schemas.ChallengeJson.directionPayload? = nil, + initialFen: Swift.String? = nil, + declineReason: Swift.String? = nil, + declineReasonKey: Swift.String? = nil + ) { + self.id = id + self.url = url + self.status = status + self.challenger = challenger + self.destUser = destUser + self.variant = variant + self.rated = rated + self.speed = speed + self.timeControl = timeControl + self.color = color + self.perf = perf + self.direction = direction + self.initialFen = initialFen + self.declineReason = declineReason + self.declineReasonKey = declineReasonKey + } + internal enum CodingKeys: String, CodingKey { + case id + case url + case status + case challenger + case destUser + case variant + case rated + case speed + case timeControl + case color + case perf + case direction + case initialFen + case declineReason + case declineReasonKey + } + } + /// - Remark: Generated from `#/components/schemas/ChallengeEvent`. + internal struct ChallengeEvent: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/ChallengeEvent/type`. + @frozen internal enum _typePayload: String, Codable, Hashable, Sendable { + case challenge = "challenge" + } + /// - Remark: Generated from `#/components/schemas/ChallengeEvent/type`. + internal var _type: Components.Schemas.ChallengeEvent._typePayload? + /// - Remark: Generated from `#/components/schemas/ChallengeEvent/challenge`. + internal var challenge: Components.Schemas.ChallengeJson? + /// Creates a new `ChallengeEvent`. + /// + /// - Parameters: + /// - _type: + /// - challenge: + internal init( + _type: Components.Schemas.ChallengeEvent._typePayload? = nil, + challenge: Components.Schemas.ChallengeJson? = nil + ) { + self._type = _type + self.challenge = challenge + } + internal enum CodingKeys: String, CodingKey { + case _type = "type" + case challenge + } + } + /// - Remark: Generated from `#/components/schemas/ChallengeCanceledEvent`. + internal struct ChallengeCanceledEvent: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/ChallengeCanceledEvent/type`. + @frozen internal enum _typePayload: String, Codable, Hashable, Sendable { + case challengeCanceled = "challengeCanceled" + } + /// - Remark: Generated from `#/components/schemas/ChallengeCanceledEvent/type`. + internal var _type: Components.Schemas.ChallengeCanceledEvent._typePayload? + /// - Remark: Generated from `#/components/schemas/ChallengeCanceledEvent/challenge`. + internal var challenge: Components.Schemas.ChallengeJson? + /// Creates a new `ChallengeCanceledEvent`. + /// + /// - Parameters: + /// - _type: + /// - challenge: + internal init( + _type: Components.Schemas.ChallengeCanceledEvent._typePayload? = nil, + challenge: Components.Schemas.ChallengeJson? = nil + ) { + self._type = _type + self.challenge = challenge + } + internal enum CodingKeys: String, CodingKey { + case _type = "type" + case challenge + } + } + /// - Remark: Generated from `#/components/schemas/ChallengeCanceledJson`. + internal struct ChallengeCanceledJson: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/ChallengeCanceledJson/id`. + internal var id: Swift.String? + /// Creates a new `ChallengeCanceledJson`. + /// + /// - Parameters: + /// - id: + internal init(id: Swift.String? = nil) { + self.id = id + } + internal enum CodingKeys: String, CodingKey { + case id + } + } + /// - Remark: Generated from `#/components/schemas/ChallengeDeclinedEvent`. + internal struct ChallengeDeclinedEvent: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/ChallengeDeclinedEvent/type`. + @frozen internal enum _typePayload: String, Codable, Hashable, Sendable { + case challengeDeclined = "challengeDeclined" + } + /// - Remark: Generated from `#/components/schemas/ChallengeDeclinedEvent/type`. + internal var _type: Components.Schemas.ChallengeDeclinedEvent._typePayload? + /// - Remark: Generated from `#/components/schemas/ChallengeDeclinedEvent/challenge`. + internal var challenge: Components.Schemas.ChallengeCanceledJson? + /// Creates a new `ChallengeDeclinedEvent`. + /// + /// - Parameters: + /// - _type: + /// - challenge: + internal init( + _type: Components.Schemas.ChallengeDeclinedEvent._typePayload? = nil, + challenge: Components.Schemas.ChallengeCanceledJson? = nil + ) { + self._type = _type + self.challenge = challenge + } + internal enum CodingKeys: String, CodingKey { + case _type = "type" + case challenge + } + } + /// - Remark: Generated from `#/components/schemas/GameEventPlayer`. + internal struct GameEventPlayer: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/GameEventPlayer/aiLevel`. + internal var aiLevel: Swift.Double? + /// - Remark: Generated from `#/components/schemas/GameEventPlayer/id`. + internal var id: Swift.String? + /// - Remark: Generated from `#/components/schemas/GameEventPlayer/name`. + internal var name: Swift.String? + /// - Remark: Generated from `#/components/schemas/GameEventPlayer/title`. + internal var title: Swift.String? + /// - Remark: Generated from `#/components/schemas/GameEventPlayer/rating`. + internal var rating: Swift.Double? + /// - Remark: Generated from `#/components/schemas/GameEventPlayer/provisional`. + internal var provisional: Swift.Bool? + /// Creates a new `GameEventPlayer`. + /// + /// - Parameters: + /// - aiLevel: + /// - id: + /// - name: + /// - title: + /// - rating: + /// - provisional: + internal init( + aiLevel: Swift.Double? = nil, + id: Swift.String? = nil, + name: Swift.String? = nil, + title: Swift.String? = nil, + rating: Swift.Double? = nil, + provisional: Swift.Bool? = nil + ) { + self.aiLevel = aiLevel + self.id = id + self.name = name + self.title = title + self.rating = rating + self.provisional = provisional + } + internal enum CodingKeys: String, CodingKey { + case aiLevel + case id + case name + case title + case rating + case provisional + } + } + /// - Remark: Generated from `#/components/schemas/GameStateEvent`. + internal struct GameStateEvent: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/GameStateEvent/type`. + @frozen internal enum _typePayload: String, Codable, Hashable, Sendable { + case gameState = "gameState" + } + /// - Remark: Generated from `#/components/schemas/GameStateEvent/type`. + internal var _type: Components.Schemas.GameStateEvent._typePayload + /// Current moves in UCI format + /// + /// - Remark: Generated from `#/components/schemas/GameStateEvent/moves`. + internal var moves: Swift.String + /// Integer of milliseconds White has left on the clock + /// + /// - Remark: Generated from `#/components/schemas/GameStateEvent/wtime`. + internal var wtime: Swift.Int + /// Integer of milliseconds Black has left on the clock + /// + /// - Remark: Generated from `#/components/schemas/GameStateEvent/btime`. + internal var btime: Swift.Int + /// Integer of White Fisher increment. + /// + /// - Remark: Generated from `#/components/schemas/GameStateEvent/winc`. + internal var winc: Swift.Int + /// Integer of Black Fisher increment. + /// + /// - Remark: Generated from `#/components/schemas/GameStateEvent/binc`. + internal var binc: Swift.Int + /// - Remark: Generated from `#/components/schemas/GameStateEvent/status`. + internal var status: Components.Schemas.GameStatus + /// Color of the winner, if any + /// + /// - Remark: Generated from `#/components/schemas/GameStateEvent/winner`. + internal var winner: Swift.String? + /// true if white is offering draw, else omitted + /// + /// - Remark: Generated from `#/components/schemas/GameStateEvent/wdraw`. + internal var wdraw: Swift.Bool? + /// true if black is offering draw, else omitted + /// + /// - Remark: Generated from `#/components/schemas/GameStateEvent/bdraw`. + internal var bdraw: Swift.Bool? + /// true if white is proposing takeback, else omitted + /// + /// - Remark: Generated from `#/components/schemas/GameStateEvent/wtakeback`. + internal var wtakeback: Swift.Bool? + /// true if black is proposing takeback, else omitted + /// + /// - Remark: Generated from `#/components/schemas/GameStateEvent/btakeback`. + internal var btakeback: Swift.Bool? + /// Creates a new `GameStateEvent`. + /// + /// - Parameters: + /// - _type: + /// - moves: Current moves in UCI format + /// - wtime: Integer of milliseconds White has left on the clock + /// - btime: Integer of milliseconds Black has left on the clock + /// - winc: Integer of White Fisher increment. + /// - binc: Integer of Black Fisher increment. + /// - status: + /// - winner: Color of the winner, if any + /// - wdraw: true if white is offering draw, else omitted + /// - bdraw: true if black is offering draw, else omitted + /// - wtakeback: true if white is proposing takeback, else omitted + /// - btakeback: true if black is proposing takeback, else omitted + internal init( + _type: Components.Schemas.GameStateEvent._typePayload, + moves: Swift.String, + wtime: Swift.Int, + btime: Swift.Int, + winc: Swift.Int, + binc: Swift.Int, + status: Components.Schemas.GameStatus, + winner: Swift.String? = nil, + wdraw: Swift.Bool? = nil, + bdraw: Swift.Bool? = nil, + wtakeback: Swift.Bool? = nil, + btakeback: Swift.Bool? = nil + ) { + self._type = _type + self.moves = moves + self.wtime = wtime + self.btime = btime + self.winc = winc + self.binc = binc + self.status = status + self.winner = winner + self.wdraw = wdraw + self.bdraw = bdraw + self.wtakeback = wtakeback + self.btakeback = btakeback + } + internal enum CodingKeys: String, CodingKey { + case _type = "type" + case moves + case wtime + case btime + case winc + case binc + case status + case winner + case wdraw + case bdraw + case wtakeback + case btakeback + } + } + /// - Remark: Generated from `#/components/schemas/GameFullEvent`. + internal struct GameFullEvent: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/GameFullEvent/type`. + @frozen internal enum _typePayload: String, Codable, Hashable, Sendable { + case gameFull = "gameFull" + } + /// - Remark: Generated from `#/components/schemas/GameFullEvent/type`. + internal var _type: Components.Schemas.GameFullEvent._typePayload + /// - Remark: Generated from `#/components/schemas/GameFullEvent/id`. + internal var id: Swift.String + /// - Remark: Generated from `#/components/schemas/GameFullEvent/variant`. + internal var variant: Components.Schemas.Variant + /// - Remark: Generated from `#/components/schemas/GameFullEvent/clock`. + @frozen internal enum clockPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/GameFullEvent/clock/case1`. + case Clock(Components.Schemas.Clock) + /// - Remark: Generated from `#/components/schemas/GameFullEvent/clock/case2`. + case case2(OpenAPIRuntime.OpenAPIValueContainer) + internal init(from decoder: any Decoder) throws { + var errors: [any Error] = [] + do { + self = .Clock(try .init(from: decoder)) + return + } catch { + errors.append(error) + } + do { + self = .case2(try .init(from: decoder)) + return + } catch { + errors.append(error) + } + throw Swift.DecodingError.failedToDecodeOneOfSchema( + type: Self.self, + codingPath: decoder.codingPath, + errors: errors + ) + } + internal func encode(to encoder: any Encoder) throws { + switch self { + case let .Clock(value): + try value.encode(to: encoder) + case let .case2(value): + try value.encode(to: encoder) + } + } + } + /// - Remark: Generated from `#/components/schemas/GameFullEvent/clock`. + internal var clock: Components.Schemas.GameFullEvent.clockPayload + /// - Remark: Generated from `#/components/schemas/GameFullEvent/speed`. + internal var speed: Components.Schemas.Speed + /// - Remark: Generated from `#/components/schemas/GameFullEvent/perf`. + internal struct perfPayload: Codable, Hashable, Sendable { + /// Translated perf name (e.g. "Classical" or "Blitz") + /// + /// - Remark: Generated from `#/components/schemas/GameFullEvent/perf/name`. + internal var name: Swift.String? + /// Creates a new `perfPayload`. + /// + /// - Parameters: + /// - name: Translated perf name (e.g. "Classical" or "Blitz") + internal init(name: Swift.String? = nil) { + self.name = name + } + internal enum CodingKeys: String, CodingKey { + case name + } + } + /// - Remark: Generated from `#/components/schemas/GameFullEvent/perf`. + internal var perf: Components.Schemas.GameFullEvent.perfPayload + /// - Remark: Generated from `#/components/schemas/GameFullEvent/rated`. + internal var rated: Swift.Bool + /// - Remark: Generated from `#/components/schemas/GameFullEvent/createdAt`. + internal var createdAt: Swift.Double + /// - Remark: Generated from `#/components/schemas/GameFullEvent/white`. + internal var white: Components.Schemas.GameEventPlayer + /// - Remark: Generated from `#/components/schemas/GameFullEvent/black`. + internal var black: Components.Schemas.GameEventPlayer + /// - Remark: Generated from `#/components/schemas/GameFullEvent/initialFen`. + internal var initialFen: Swift.String + /// - Remark: Generated from `#/components/schemas/GameFullEvent/state`. + internal var state: Components.Schemas.GameStateEvent + /// - Remark: Generated from `#/components/schemas/GameFullEvent/tournamentId`. + internal var tournamentId: Swift.String? + /// Creates a new `GameFullEvent`. + /// + /// - Parameters: + /// - _type: + /// - id: + /// - variant: + /// - clock: + /// - speed: + /// - perf: + /// - rated: + /// - createdAt: + /// - white: + /// - black: + /// - initialFen: + /// - state: + /// - tournamentId: + internal init( + _type: Components.Schemas.GameFullEvent._typePayload, + id: Swift.String, + variant: Components.Schemas.Variant, + clock: Components.Schemas.GameFullEvent.clockPayload, + speed: Components.Schemas.Speed, + perf: Components.Schemas.GameFullEvent.perfPayload, + rated: Swift.Bool, + createdAt: Swift.Double, + white: Components.Schemas.GameEventPlayer, + black: Components.Schemas.GameEventPlayer, + initialFen: Swift.String, + state: Components.Schemas.GameStateEvent, + tournamentId: Swift.String? = nil + ) { + self._type = _type + self.id = id + self.variant = variant + self.clock = clock + self.speed = speed + self.perf = perf + self.rated = rated + self.createdAt = createdAt + self.white = white + self.black = black + self.initialFen = initialFen + self.state = state + self.tournamentId = tournamentId + } + internal enum CodingKeys: String, CodingKey { + case _type = "type" + case id + case variant + case clock + case speed + case perf + case rated + case createdAt + case white + case black + case initialFen + case state + case tournamentId + } + } + /// - Remark: Generated from `#/components/schemas/ChatLineEvent`. + internal struct ChatLineEvent: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/ChatLineEvent/type`. + @frozen internal enum _typePayload: String, Codable, Hashable, Sendable { + case chatLine = "chatLine" + } + /// - Remark: Generated from `#/components/schemas/ChatLineEvent/type`. + internal var _type: Components.Schemas.ChatLineEvent._typePayload + /// - Remark: Generated from `#/components/schemas/ChatLineEvent/room`. + @frozen internal enum roomPayload: String, Codable, Hashable, Sendable { + case player = "player" + case spectator = "spectator" + } + /// - Remark: Generated from `#/components/schemas/ChatLineEvent/room`. + internal var room: Components.Schemas.ChatLineEvent.roomPayload + /// - Remark: Generated from `#/components/schemas/ChatLineEvent/username`. + internal var username: Swift.String + /// - Remark: Generated from `#/components/schemas/ChatLineEvent/text`. + internal var text: Swift.String + /// Creates a new `ChatLineEvent`. + /// + /// - Parameters: + /// - _type: + /// - room: + /// - username: + /// - text: + internal init( + _type: Components.Schemas.ChatLineEvent._typePayload, + room: Components.Schemas.ChatLineEvent.roomPayload, + username: Swift.String, + text: Swift.String + ) { + self._type = _type + self.room = room + self.username = username + self.text = text + } + internal enum CodingKeys: String, CodingKey { + case _type = "type" + case room + case username + case text + } + } + /// - Remark: Generated from `#/components/schemas/OpponentGone`. + internal struct OpponentGone: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/OpponentGone/type`. + @frozen internal enum _typePayload: String, Codable, Hashable, Sendable { + case opponentGone = "opponentGone" + } + /// - Remark: Generated from `#/components/schemas/OpponentGone/type`. + internal var _type: Components.Schemas.OpponentGone._typePayload + /// - Remark: Generated from `#/components/schemas/OpponentGone/gone`. + internal var gone: Swift.Bool + /// - Remark: Generated from `#/components/schemas/OpponentGone/claimWinInSeconds`. + internal var claimWinInSeconds: Swift.Double? + /// Creates a new `OpponentGone`. + /// + /// - Parameters: + /// - _type: + /// - gone: + /// - claimWinInSeconds: + internal init( + _type: Components.Schemas.OpponentGone._typePayload, + gone: Swift.Bool, + claimWinInSeconds: Swift.Double? = nil + ) { + self._type = _type + self.gone = gone + self.claimWinInSeconds = claimWinInSeconds + } + internal enum CodingKeys: String, CodingKey { + case _type = "type" + case gone + case claimWinInSeconds + } + } + /// - Remark: Generated from `#/components/schemas/NotFound`. + internal struct NotFound: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/NotFound/error`. + internal var error: Swift.String? + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - error: + internal init(error: Swift.String? = nil) { + self.error = error + } + internal enum CodingKeys: String, CodingKey { + case error + } + } + /// - Remark: Generated from `#/components/schemas/GameChat`. + internal typealias GameChat = OpenAPIRuntime.OpenAPIValueContainer + /// - Remark: Generated from `#/components/schemas/ChallengeOpenJson`. + internal typealias ChallengeOpenJson = OpenAPIRuntime.OpenAPIValueContainer + /// - Remark: Generated from `#/components/schemas/BulkPairing`. + internal typealias BulkPairing = OpenAPIRuntime.OpenAPIValueContainer + /// - Remark: Generated from `#/components/schemas/UciVariant`. + @frozen internal enum UciVariant: String, Codable, Hashable, Sendable { + case chess = "chess" + case crazyhouse = "crazyhouse" + case antichess = "antichess" + case atomic = "atomic" + case horde = "horde" + case kingofthehill = "kingofthehill" + case racingkings = "racingkings" + case _3check = "3check" + } + /// - Remark: Generated from `#/components/schemas/ExternalEngine`. + internal struct ExternalEngine: Codable, Hashable, Sendable { + /// Unique engine registration ID. + /// + /// - Remark: Generated from `#/components/schemas/ExternalEngine/id`. + internal var id: Swift.String + /// Display name of the engine. + /// + /// - Remark: Generated from `#/components/schemas/ExternalEngine/name`. + internal var name: Swift.String + /// A secret token that can be used to + /// [*request* analysis](#tag/External-engine/operation/apiExternalEngineAnalyse) + /// from this external engine. + /// + /// + /// - Remark: Generated from `#/components/schemas/ExternalEngine/clientSecret`. + internal var clientSecret: Swift.String + /// The user this engine has been registered for. + /// + /// - Remark: Generated from `#/components/schemas/ExternalEngine/userId`. + internal var userId: Swift.String + /// Maximum number of available threads. + /// + /// - Remark: Generated from `#/components/schemas/ExternalEngine/maxThreads`. + internal var maxThreads: Swift.Int + /// Maximum available hash table size, in MiB. + /// + /// - Remark: Generated from `#/components/schemas/ExternalEngine/maxHash`. + internal var maxHash: Swift.Int + /// Estimated depth of normal search. + /// + /// - Remark: Generated from `#/components/schemas/ExternalEngine/defaultDepth`. + internal var defaultDepth: Swift.Int + /// List of supported chess variants. + /// + /// - Remark: Generated from `#/components/schemas/ExternalEngine/variants`. + internal var variants: [Components.Schemas.UciVariant] + /// Arbitrary data that the engine provider can use for identification + /// or bookkeeping. + /// + /// Users can read this information, but updating it requires knowing + /// or changing the `providerSecret`. + /// + /// + /// - Remark: Generated from `#/components/schemas/ExternalEngine/providerData`. + internal var providerData: Swift.String? + /// Creates a new `ExternalEngine`. + /// + /// - Parameters: + /// - id: Unique engine registration ID. + /// - name: Display name of the engine. + /// - clientSecret: A secret token that can be used to + /// - userId: The user this engine has been registered for. + /// - maxThreads: Maximum number of available threads. + /// - maxHash: Maximum available hash table size, in MiB. + /// - defaultDepth: Estimated depth of normal search. + /// - variants: List of supported chess variants. + /// - providerData: Arbitrary data that the engine provider can use for identification + internal init( + id: Swift.String, + name: Swift.String, + clientSecret: Swift.String, + userId: Swift.String, + maxThreads: Swift.Int, + maxHash: Swift.Int, + defaultDepth: Swift.Int, + variants: [Components.Schemas.UciVariant], + providerData: Swift.String? = nil + ) { + self.id = id + self.name = name + self.clientSecret = clientSecret + self.userId = userId + self.maxThreads = maxThreads + self.maxHash = maxHash + self.defaultDepth = defaultDepth + self.variants = variants + self.providerData = providerData + } + internal enum CodingKeys: String, CodingKey { + case id + case name + case clientSecret + case userId + case maxThreads + case maxHash + case defaultDepth + case variants + case providerData + } + } + /// - Remark: Generated from `#/components/schemas/ExternalEngineRegistration`. + internal struct ExternalEngineRegistration: Codable, Hashable, Sendable { + /// Display name of the engine. + /// + /// - Remark: Generated from `#/components/schemas/ExternalEngineRegistration/name`. + internal var name: Swift.String + /// Maximum number of available threads. + /// + /// - Remark: Generated from `#/components/schemas/ExternalEngineRegistration/maxThreads`. + internal var maxThreads: Swift.Int + /// Maximum available hash table size, in MiB. + /// + /// - Remark: Generated from `#/components/schemas/ExternalEngineRegistration/maxHash`. + internal var maxHash: Swift.Int + /// Estimated depth of normal search. + /// + /// - Remark: Generated from `#/components/schemas/ExternalEngineRegistration/defaultDepth`. + internal var defaultDepth: Swift.Int + /// Optional list of supported chess variants. + /// + /// - Remark: Generated from `#/components/schemas/ExternalEngineRegistration/variants`. + internal var variants: [Components.Schemas.UciVariant]? + /// A random token that can be used to + /// [wait for analysis requests](#tag/External-engine/operation/apiExternalEngineAcquire) + /// and provide analysis. + /// + /// The engine provider should securely generate a random string. + /// + /// The token will not be readable again, even by the user. + /// + /// The analysis provider can register multiple engines with the same + /// token, even for different users, and wait for analysis requests + /// from any of them. In this case, the request must not be made via + /// CORS, so that the token is not revealed to any of the users. + /// + /// + /// - Remark: Generated from `#/components/schemas/ExternalEngineRegistration/providerSecret`. + internal var providerSecret: Swift.String + /// Arbitrary data that the engine provider can use for identification + /// or bookkeeping. + /// + /// Users can read this information, but updating it requires knowing + /// or changing the `providerSecret`. + /// + /// + /// - Remark: Generated from `#/components/schemas/ExternalEngineRegistration/providerData`. + internal var providerData: Swift.String? + /// Creates a new `ExternalEngineRegistration`. + /// + /// - Parameters: + /// - name: Display name of the engine. + /// - maxThreads: Maximum number of available threads. + /// - maxHash: Maximum available hash table size, in MiB. + /// - defaultDepth: Estimated depth of normal search. + /// - variants: Optional list of supported chess variants. + /// - providerSecret: A random token that can be used to + /// - providerData: Arbitrary data that the engine provider can use for identification + internal init( + name: Swift.String, + maxThreads: Swift.Int, + maxHash: Swift.Int, + defaultDepth: Swift.Int, + variants: [Components.Schemas.UciVariant]? = nil, + providerSecret: Swift.String, + providerData: Swift.String? = nil + ) { + self.name = name + self.maxThreads = maxThreads + self.maxHash = maxHash + self.defaultDepth = defaultDepth + self.variants = variants + self.providerSecret = providerSecret + self.providerData = providerData + } + internal enum CodingKeys: String, CodingKey { + case name + case maxThreads + case maxHash + case defaultDepth + case variants + case providerSecret + case providerData + } + } + /// - Remark: Generated from `#/components/schemas/ExternalEngineWork`. + internal struct ExternalEngineWork: Codable, Hashable, Sendable { + /// Arbitary string that identifies the analysis session. + /// Providers may wish to clear the hash table between sessions. + /// + /// + /// - Remark: Generated from `#/components/schemas/ExternalEngineWork/sessionId`. + internal var sessionId: Swift.String + /// Number of threads to use for analysis. + /// + /// - Remark: Generated from `#/components/schemas/ExternalEngineWork/threads`. + internal var threads: Swift.Int + /// Hash table size to use for analysis, in MiB. + /// + /// - Remark: Generated from `#/components/schemas/ExternalEngineWork/hash`. + internal var hash: Swift.Int + /// Request an infinite search (rather than roughly aiming for + /// `defaultDepth`). + /// + /// + /// - Remark: Generated from `#/components/schemas/ExternalEngineWork/infinite`. + internal var infinite: Swift.Bool? + /// Requested number of principal variations. + /// + /// - Remark: Generated from `#/components/schemas/ExternalEngineWork/multiPv`. + internal var multiPv: Swift.Int + /// - Remark: Generated from `#/components/schemas/ExternalEngineWork/variant`. + internal var variant: Components.Schemas.UciVariant + /// Initial position of the game. + /// + /// - Remark: Generated from `#/components/schemas/ExternalEngineWork/initialFen`. + internal var initialFen: Swift.String + /// List of moves played from the initial position, in UCI notation. + /// + /// - Remark: Generated from `#/components/schemas/ExternalEngineWork/moves`. + internal var moves: [Swift.String] + /// Creates a new `ExternalEngineWork`. + /// + /// - Parameters: + /// - sessionId: Arbitary string that identifies the analysis session. + /// - threads: Number of threads to use for analysis. + /// - hash: Hash table size to use for analysis, in MiB. + /// - infinite: Request an infinite search (rather than roughly aiming for + /// - multiPv: Requested number of principal variations. + /// - variant: + /// - initialFen: Initial position of the game. + /// - moves: List of moves played from the initial position, in UCI notation. + internal init( + sessionId: Swift.String, + threads: Swift.Int, + hash: Swift.Int, + infinite: Swift.Bool? = nil, + multiPv: Swift.Int, + variant: Components.Schemas.UciVariant, + initialFen: Swift.String, + moves: [Swift.String] + ) { + self.sessionId = sessionId + self.threads = threads + self.hash = hash + self.infinite = infinite + self.multiPv = multiPv + self.variant = variant + self.initialFen = initialFen + self.moves = moves + } + internal enum CodingKeys: String, CodingKey { + case sessionId + case threads + case hash + case infinite + case multiPv + case variant + case initialFen + case moves + } + } + /// - Remark: Generated from `#/components/schemas/OAuthError`. + internal struct OAuthError: Codable, Hashable, Sendable { + /// The cause of the error. + /// + /// - Remark: Generated from `#/components/schemas/OAuthError/error`. + internal var error: Swift.String? + /// The reason why the request was rejected. + /// + /// - Remark: Generated from `#/components/schemas/OAuthError/error_description`. + internal var error_description: Swift.String? + /// Creates a new `OAuthError`. + /// + /// - Parameters: + /// - error: The cause of the error. + /// - error_description: The reason why the request was rejected. + internal init( + error: Swift.String? = nil, + error_description: Swift.String? = nil + ) { + self.error = error + self.error_description = error_description + } + internal enum CodingKeys: String, CodingKey { + case error + case error_description + } + } + /// - Remark: Generated from `#/components/schemas/OpeningExplorerJson`. + internal typealias OpeningExplorerJson = OpenAPIRuntime.OpenAPIValueContainer + /// - Remark: Generated from `#/components/schemas/OpeningExplorerPlayerJson`. + internal typealias OpeningExplorerPlayerJson = OpenAPIRuntime.OpenAPIValueContainer + /// - Remark: Generated from `#/components/schemas/MasterGamePgn`. + internal typealias MasterGamePgn = OpenAPIRuntime.OpenAPIValueContainer + /// - Remark: Generated from `#/components/schemas/Move`. + internal struct Move: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/Move/uci`. + internal var uci: Swift.String? + /// - Remark: Generated from `#/components/schemas/Move/san`. + internal var san: Swift.String? + /// - Remark: Generated from `#/components/schemas/Move/category`. + @frozen internal enum categoryPayload: String, Codable, Hashable, Sendable { + case loss = "loss" + case unknown = "unknown" + case maybe_hyphen_loss = "maybe-loss" + case blessed_hyphen_loss = "blessed-loss" + case draw = "draw" + case cursed_hyphen_win = "cursed-win" + case maybe_hyphen_win = "maybe-win" + case win = "win" + } + /// - Remark: Generated from `#/components/schemas/Move/category`. + internal var category: Components.Schemas.Move.categoryPayload? + /// DTZ50'' with rounding or null if unknown + /// + /// - Remark: Generated from `#/components/schemas/Move/dtz`. + internal var dtz: Swift.Int? + /// DTZ50'' (only if guaranteed to be not rounded) or null if unknown + /// + /// + /// - Remark: Generated from `#/components/schemas/Move/precise_dtz`. + internal var precise_dtz: Swift.Int? + /// Distance to mate (only for positions with not more than 5 pieces) + /// + /// - Remark: Generated from `#/components/schemas/Move/dtm`. + internal var dtm: Swift.Int? + /// - Remark: Generated from `#/components/schemas/Move/zeroing`. + internal var zeroing: Swift.Bool? + /// - Remark: Generated from `#/components/schemas/Move/checkmate`. + internal var checkmate: Swift.Bool? + /// - Remark: Generated from `#/components/schemas/Move/stalemate`. + internal var stalemate: Swift.Bool? + /// - Remark: Generated from `#/components/schemas/Move/variant_win`. + internal var variant_win: Swift.Bool? + /// - Remark: Generated from `#/components/schemas/Move/variant_loss`. + internal var variant_loss: Swift.Bool? + /// - Remark: Generated from `#/components/schemas/Move/insufficient_material`. + internal var insufficient_material: Swift.Bool? + /// Creates a new `Move`. + /// + /// - Parameters: + /// - uci: + /// - san: + /// - category: + /// - dtz: DTZ50'' with rounding or null if unknown + /// - precise_dtz: DTZ50'' (only if guaranteed to be not rounded) or null if unknown + /// - dtm: Distance to mate (only for positions with not more than 5 pieces) + /// - zeroing: + /// - checkmate: + /// - stalemate: + /// - variant_win: + /// - variant_loss: + /// - insufficient_material: + internal init( + uci: Swift.String? = nil, + san: Swift.String? = nil, + category: Components.Schemas.Move.categoryPayload? = nil, + dtz: Swift.Int? = nil, + precise_dtz: Swift.Int? = nil, + dtm: Swift.Int? = nil, + zeroing: Swift.Bool? = nil, + checkmate: Swift.Bool? = nil, + stalemate: Swift.Bool? = nil, + variant_win: Swift.Bool? = nil, + variant_loss: Swift.Bool? = nil, + insufficient_material: Swift.Bool? = nil + ) { + self.uci = uci + self.san = san + self.category = category + self.dtz = dtz + self.precise_dtz = precise_dtz + self.dtm = dtm + self.zeroing = zeroing + self.checkmate = checkmate + self.stalemate = stalemate + self.variant_win = variant_win + self.variant_loss = variant_loss + self.insufficient_material = insufficient_material + } + internal enum CodingKeys: String, CodingKey { + case uci + case san + case category + case dtz + case precise_dtz + case dtm + case zeroing + case checkmate + case stalemate + case variant_win + case variant_loss + case insufficient_material + } + } + /// - Remark: Generated from `#/components/schemas/TablebaseJson`. + internal struct TablebaseJson: Codable, Hashable, Sendable { + /// `cursed-win` and `blessed-loss` means the 50-move rule prevents + /// the decisive result. + /// + /// `maybe-win` and `maybe-loss` means exact result is unknown due to + /// [DTZ rounding](https://syzygy-tables.info/metrics#dtz), i.e., the + /// win or loss could also be prevented by the 50-move rule if + /// the user has deviated from the tablebase recommendation since the + /// last pawn move or capture. + /// + /// + /// - Remark: Generated from `#/components/schemas/TablebaseJson/category`. + @frozen internal enum categoryPayload: String, Codable, Hashable, Sendable { + case win = "win" + case unknown = "unknown" + case maybe_hyphen_win = "maybe-win" + case cursed_hyphen_win = "cursed-win" + case draw = "draw" + case blessed_hyphen_loss = "blessed-loss" + case maybe_hyphen_loss = "maybe-loss" + case loss = "loss" + } + /// `cursed-win` and `blessed-loss` means the 50-move rule prevents + /// the decisive result. + /// + /// `maybe-win` and `maybe-loss` means exact result is unknown due to + /// [DTZ rounding](https://syzygy-tables.info/metrics#dtz), i.e., the + /// win or loss could also be prevented by the 50-move rule if + /// the user has deviated from the tablebase recommendation since the + /// last pawn move or capture. + /// + /// + /// - Remark: Generated from `#/components/schemas/TablebaseJson/category`. + internal var category: Components.Schemas.TablebaseJson.categoryPayload? + /// [DTZ50'' with rounding](https://syzygy-tables.info/metrics#dtz) or null if unknown + /// + /// + /// - Remark: Generated from `#/components/schemas/TablebaseJson/dtz`. + internal var dtz: Swift.Int? + /// DTZ50'' (only if guaranteed to be not rounded) or null if unknown + /// + /// + /// - Remark: Generated from `#/components/schemas/TablebaseJson/precise_dtz`. + internal var precise_dtz: Swift.Int? + /// Distance to mate (only for positions with not more than 5 pieces) + /// + /// - Remark: Generated from `#/components/schemas/TablebaseJson/dtm`. + internal var dtm: Swift.Int? + /// - Remark: Generated from `#/components/schemas/TablebaseJson/checkmate`. + internal var checkmate: Swift.Bool? + /// - Remark: Generated from `#/components/schemas/TablebaseJson/stalemate`. + internal var stalemate: Swift.Bool? + /// Only in chess variants + /// + /// - Remark: Generated from `#/components/schemas/TablebaseJson/variant_win`. + internal var variant_win: Swift.Bool? + /// Only in chess variants + /// + /// - Remark: Generated from `#/components/schemas/TablebaseJson/variant_loss`. + internal var variant_loss: Swift.Bool? + /// - Remark: Generated from `#/components/schemas/TablebaseJson/insufficient_material`. + internal var insufficient_material: Swift.Bool? + /// Information about legal moves, best first + /// + /// - Remark: Generated from `#/components/schemas/TablebaseJson/moves`. + internal var moves: [Components.Schemas.Move]? + /// Creates a new `TablebaseJson`. + /// + /// - Parameters: + /// - category: `cursed-win` and `blessed-loss` means the 50-move rule prevents + /// - dtz: [DTZ50'' with rounding](https://syzygy-tables.info/metrics#dtz) or null if unknown + /// - precise_dtz: DTZ50'' (only if guaranteed to be not rounded) or null if unknown + /// - dtm: Distance to mate (only for positions with not more than 5 pieces) + /// - checkmate: + /// - stalemate: + /// - variant_win: Only in chess variants + /// - variant_loss: Only in chess variants + /// - insufficient_material: + /// - moves: Information about legal moves, best first + internal init( + category: Components.Schemas.TablebaseJson.categoryPayload? = nil, + dtz: Swift.Int? = nil, + precise_dtz: Swift.Int? = nil, + dtm: Swift.Int? = nil, + checkmate: Swift.Bool? = nil, + stalemate: Swift.Bool? = nil, + variant_win: Swift.Bool? = nil, + variant_loss: Swift.Bool? = nil, + insufficient_material: Swift.Bool? = nil, + moves: [Components.Schemas.Move]? = nil + ) { + self.category = category + self.dtz = dtz + self.precise_dtz = precise_dtz + self.dtm = dtm + self.checkmate = checkmate + self.stalemate = stalemate + self.variant_win = variant_win + self.variant_loss = variant_loss + self.insufficient_material = insufficient_material + self.moves = moves + } + internal enum CodingKeys: String, CodingKey { + case category + case dtz + case precise_dtz + case dtm + case checkmate + case stalemate + case variant_win + case variant_loss + case insufficient_material + case moves + } + } + } + /// Types generated from the `#/components/parameters` section of the OpenAPI document. + internal enum Parameters {} + /// Types generated from the `#/components/requestBodies` section of the OpenAPI document. + internal enum RequestBodies {} + /// Types generated from the `#/components/responses` section of the OpenAPI document. + internal enum Responses {} + /// Types generated from the `#/components/headers` section of the OpenAPI document. + internal enum Headers {} +} + +/// API operations, with input and output types, generated from `#/paths` in the OpenAPI document. +internal enum Operations { + /// 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 enum apiUsersStatus { + internal static let id: Swift.String = "apiUsersStatus" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/users/status/GET/query`. + internal struct Query: Sendable, Hashable { + /// User IDs separated by commas. Up to 100 IDs. + /// + /// - Remark: Generated from `#/paths/api/users/status/GET/query/ids`. + internal var ids: Swift.String + /// Also return the ID of the game being played, if any, for each player, in a `playingId` field. + /// Defaults to `false` to preserve server resources. + /// + /// + /// - Remark: Generated from `#/paths/api/users/status/GET/query/withGameIds`. + internal var withGameIds: Swift.Bool? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - ids: User IDs separated by commas. Up to 100 IDs. + /// - withGameIds: Also return the ID of the game being played, if any, for each player, in a `playingId` field. + internal init( + ids: Swift.String, + withGameIds: Swift.Bool? = nil + ) { + self.ids = ids + self.withGameIds = withGameIds + } + } + internal var query: Operations.apiUsersStatus.Input.Query + /// - Remark: Generated from `#/paths/api/users/status/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiUsersStatus.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiUsersStatus.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiUsersStatus.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - query: + /// - headers: + internal init( + query: Operations.apiUsersStatus.Input.Query, + headers: Operations.apiUsersStatus.Input.Headers = .init() + ) { + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/users/status/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/users/status/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiUsersStatus.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/users/status/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/users/status/GET/responses/200/content/jsonPayload`. + internal struct jsonPayloadPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/users/status/GET/responses/200/content/jsonPayload/id`. + internal var id: Swift.String + /// - Remark: Generated from `#/paths/api/users/status/GET/responses/200/content/jsonPayload/name`. + internal var name: Swift.String + /// - Remark: Generated from `#/paths/api/users/status/GET/responses/200/content/jsonPayload/title`. + internal var title: Swift.String? + /// - Remark: Generated from `#/paths/api/users/status/GET/responses/200/content/jsonPayload/online`. + internal var online: Swift.Bool? + /// - Remark: Generated from `#/paths/api/users/status/GET/responses/200/content/jsonPayload/playing`. + internal var playing: Swift.Bool? + /// - Remark: Generated from `#/paths/api/users/status/GET/responses/200/content/jsonPayload/streaming`. + internal var streaming: Swift.Bool? + /// - Remark: Generated from `#/paths/api/users/status/GET/responses/200/content/jsonPayload/patron`. + internal var patron: Swift.Bool? + /// Creates a new `jsonPayloadPayload`. + /// + /// - Parameters: + /// - id: + /// - name: + /// - title: + /// - online: + /// - playing: + /// - streaming: + /// - patron: + internal init( + id: Swift.String, + name: Swift.String, + title: Swift.String? = nil, + online: Swift.Bool? = nil, + playing: Swift.Bool? = nil, + streaming: Swift.Bool? = nil, + patron: Swift.Bool? = nil + ) { + self.id = id + self.name = name + self.title = title + self.online = online + self.playing = playing + self.streaming = streaming + self.patron = patron + } + internal enum CodingKeys: String, CodingKey { + case id + case name + case title + case online + case playing + case streaming + case patron + } + } + /// - Remark: Generated from `#/paths/api/users/status/GET/responses/200/content/json`. + internal typealias jsonPayload = [Operations.apiUsersStatus.Output.Ok.Body.jsonPayloadPayload] + /// - Remark: Generated from `#/paths/api/users/status/GET/responses/200/content/application\/json`. + case json(Operations.apiUsersStatus.Output.Ok.Body.jsonPayload) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Operations.apiUsersStatus.Output.Ok.Body.jsonPayload { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiUsersStatus.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiUsersStatus.Output.Ok.Headers = .init(), + body: Operations.apiUsersStatus.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The list of users and their respective statuses. + /// + /// - Remark: Generated from `#/paths//api/users/status/get(apiUsersStatus)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiUsersStatus.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiUsersStatus.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum player { + internal static let id: Swift.String = "player" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/player/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.player.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.player.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.player.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + internal init(headers: Operations.player.Input.Headers = .init()) { + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/player/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/player/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.player.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/player/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/player/GET/responses/200/content/application\/json`. + case json(Components.Schemas.Top10s) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Top10s { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.player.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.player.Output.Ok.Headers = .init(), + body: Operations.player.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The list of variants with their respective top players. + /// + /// - Remark: Generated from `#/paths//api/player/get(player)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.player.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.player.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum playerTopNbPerfType { + internal static let id: Swift.String = "playerTopNbPerfType" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/player/top/{nb}/{perfType}/GET/path`. + internal struct Path: Sendable, Hashable { + /// How many users to fetch + /// + /// - Remark: Generated from `#/paths/api/player/top/{nb}/{perfType}/GET/path/nb`. + internal var nb: Swift.Int + /// - Remark: Generated from `#/paths/api/player/top/{nb}/{perfType}/GET/path/perfType`. + @frozen internal enum perfTypePayload: String, Codable, Hashable, Sendable { + case ultraBullet = "ultraBullet" + case bullet = "bullet" + case blitz = "blitz" + case rapid = "rapid" + case classical = "classical" + case chess960 = "chess960" + case crazyhouse = "crazyhouse" + case antichess = "antichess" + case atomic = "atomic" + case horde = "horde" + case kingOfTheHill = "kingOfTheHill" + case racingKings = "racingKings" + case threeCheck = "threeCheck" + } + /// The speed or variant + /// + /// - Remark: Generated from `#/paths/api/player/top/{nb}/{perfType}/GET/path/perfType`. + internal var perfType: Operations.playerTopNbPerfType.Input.Path.perfTypePayload + /// Creates a new `Path`. + /// + /// - Parameters: + /// - nb: How many users to fetch + /// - perfType: The speed or variant + internal init( + nb: Swift.Int, + perfType: Operations.playerTopNbPerfType.Input.Path.perfTypePayload + ) { + self.nb = nb + self.perfType = perfType + } + } + internal var path: Operations.playerTopNbPerfType.Input.Path + /// - Remark: Generated from `#/paths/api/player/top/{nb}/{perfType}/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.playerTopNbPerfType.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.playerTopNbPerfType.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.playerTopNbPerfType.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.playerTopNbPerfType.Input.Path, + headers: Operations.playerTopNbPerfType.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/player/top/{nb}/{perfType}/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/player/top/{nb}/{perfType}/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.playerTopNbPerfType.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/player/top/{nb}/{perfType}/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/player/top/{nb}/{perfType}/GET/responses/200/content/application\/vnd.lichess.v3+json`. + case application_vnd_period_lichess_period_v3_plus_json(Components.Schemas.Leaderboard) + /// The associated value of the enum case if `self` is `.application_vnd_period_lichess_period_v3_plus_json`. + /// + /// - Throws: An error if `self` is not `.application_vnd_period_lichess_period_v3_plus_json`. + /// - SeeAlso: `.application_vnd_period_lichess_period_v3_plus_json`. + internal var application_vnd_period_lichess_period_v3_plus_json: Components.Schemas.Leaderboard { + get throws { + switch self { + case let .application_vnd_period_lichess_period_v3_plus_json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.playerTopNbPerfType.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.playerTopNbPerfType.Output.Ok.Headers = .init(), + body: Operations.playerTopNbPerfType.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The list of top players for the variant. + /// + /// - Remark: Generated from `#/paths//api/player/top/{nb}/{perfType}/get(playerTopNbPerfType)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.playerTopNbPerfType.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.playerTopNbPerfType.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_vnd_period_lichess_period_v3_plus_json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/vnd.lichess.v3+json": + self = .application_vnd_period_lichess_period_v3_plus_json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_vnd_period_lichess_period_v3_plus_json: + return "application/vnd.lichess.v3+json" + } + } + internal static var allCases: [Self] { + [ + .application_vnd_period_lichess_period_v3_plus_json + ] + } + } + } + /// 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 enum apiUser { + internal static let id: Swift.String = "apiUser" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/GET/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/GET/path/username`. + internal var username: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - username: + internal init(username: Swift.String) { + self.username = username + } + } + internal var path: Operations.apiUser.Input.Path + /// - Remark: Generated from `#/paths/api/user/{username}/GET/query`. + internal struct Query: Sendable, Hashable { + /// Include user trophies + /// + /// - Remark: Generated from `#/paths/api/user/{username}/GET/query/trophies`. + internal var trophies: Swift.Bool? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - trophies: Include user trophies + internal init(trophies: Swift.Bool? = nil) { + self.trophies = trophies + } + } + internal var query: Operations.apiUser.Input.Query + /// - Remark: Generated from `#/paths/api/user/{username}/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiUser.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiUser.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiUser.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + internal init( + path: Operations.apiUser.Input.Path, + query: Operations.apiUser.Input.Query = .init(), + headers: Operations.apiUser.Input.Headers = .init() + ) { + self.path = path + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiUser.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/user/{username}/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/GET/responses/200/content/application\/json`. + case json(Components.Schemas.UserExtended) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.UserExtended { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiUser.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiUser.Output.Ok.Headers = .init(), + body: Operations.apiUser.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The information of the user. + /// + /// - Remark: Generated from `#/paths//api/user/{username}/get(apiUser)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiUser.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiUser.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiUserRatingHistory { + internal static let id: Swift.String = "apiUserRatingHistory" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/rating-history/GET/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/rating-history/GET/path/username`. + internal var username: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - username: + internal init(username: Swift.String) { + self.username = username + } + } + internal var path: Operations.apiUserRatingHistory.Input.Path + /// - Remark: Generated from `#/paths/api/user/{username}/rating-history/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiUserRatingHistory.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiUserRatingHistory.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiUserRatingHistory.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.apiUserRatingHistory.Input.Path, + headers: Operations.apiUserRatingHistory.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/rating-history/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/rating-history/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiUserRatingHistory.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/user/{username}/rating-history/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/rating-history/GET/responses/200/content/application\/json`. + case json(Components.Schemas.RatingHistory) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.RatingHistory { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiUserRatingHistory.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiUserRatingHistory.Output.Ok.Headers = .init(), + body: Operations.apiUserRatingHistory.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The rating history of the user. + /// + /// - Remark: Generated from `#/paths//api/user/{username}/rating-history/get(apiUserRatingHistory)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiUserRatingHistory.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiUserRatingHistory.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiUserPerf { + internal static let id: Swift.String = "apiUserPerf" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/perf/{perf}/GET/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/perf/{perf}/GET/path/username`. + internal var username: Swift.String + /// - Remark: Generated from `#/paths/api/user/{username}/perf/{perf}/GET/path/perf`. + internal var perf: Components.Schemas.PerfType + /// Creates a new `Path`. + /// + /// - Parameters: + /// - username: + /// - perf: + internal init( + username: Swift.String, + perf: Components.Schemas.PerfType + ) { + self.username = username + self.perf = perf + } + } + internal var path: Operations.apiUserPerf.Input.Path + /// - Remark: Generated from `#/paths/api/user/{username}/perf/{perf}/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiUserPerf.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiUserPerf.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiUserPerf.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.apiUserPerf.Input.Path, + headers: Operations.apiUserPerf.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/perf/{perf}/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/perf/{perf}/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiUserPerf.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/user/{username}/perf/{perf}/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/perf/{perf}/GET/responses/200/content/application\/json`. + case json(Components.Schemas.PerfStat) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.PerfStat { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiUserPerf.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiUserPerf.Output.Ok.Headers = .init(), + body: Operations.apiUserPerf.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The performance statistics of the user + /// + /// - Remark: Generated from `#/paths//api/user/{username}/perf/{perf}/get(apiUserPerf)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiUserPerf.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiUserPerf.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiUserActivity { + internal static let id: Swift.String = "apiUserActivity" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/activity/GET/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/activity/GET/path/username`. + internal var username: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - username: + internal init(username: Swift.String) { + self.username = username + } + } + internal var path: Operations.apiUserActivity.Input.Path + /// - Remark: Generated from `#/paths/api/user/{username}/activity/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiUserActivity.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiUserActivity.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiUserActivity.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.apiUserActivity.Input.Path, + headers: Operations.apiUserActivity.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/activity/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/activity/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiUserActivity.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/user/{username}/activity/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/activity/GET/responses/200/content/application\/json`. + case json(OpenAPIRuntime.OpenAPIValueContainer) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: OpenAPIRuntime.OpenAPIValueContainer { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiUserActivity.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiUserActivity.Output.Ok.Headers = .init(), + body: Operations.apiUserActivity.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The activity feed of the user. + /// + /// - Remark: Generated from `#/paths//api/user/{username}/activity/get(apiUserActivity)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiUserActivity.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiUserActivity.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiPuzzleDaily { + internal static let id: Swift.String = "apiPuzzleDaily" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/puzzle/daily/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiPuzzleDaily.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiPuzzleDaily.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiPuzzleDaily.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + internal init(headers: Operations.apiPuzzleDaily.Input.Headers = .init()) { + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/puzzle/daily/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/puzzle/daily/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiPuzzleDaily.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/puzzle/daily/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/puzzle/daily/GET/responses/200/content/application\/json`. + case json(Components.Schemas.PuzzleAndGame) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.PuzzleAndGame { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiPuzzleDaily.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiPuzzleDaily.Output.Ok.Headers = .init(), + body: Operations.apiPuzzleDaily.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The daily puzzle. + /// + /// - Remark: Generated from `#/paths//api/puzzle/daily/get(apiPuzzleDaily)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiPuzzleDaily.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiPuzzleDaily.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiPuzzleId { + internal static let id: Swift.String = "apiPuzzleId" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/puzzle/{id}/GET/path`. + internal struct Path: Sendable, Hashable { + /// The puzzle ID + /// + /// - Remark: Generated from `#/paths/api/puzzle/{id}/GET/path/id`. + internal var id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - id: The puzzle ID + internal init(id: Swift.String) { + self.id = id + } + } + internal var path: Operations.apiPuzzleId.Input.Path + /// - Remark: Generated from `#/paths/api/puzzle/{id}/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiPuzzleId.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiPuzzleId.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiPuzzleId.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.apiPuzzleId.Input.Path, + headers: Operations.apiPuzzleId.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/puzzle/{id}/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/puzzle/{id}/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiPuzzleId.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/puzzle/{id}/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/puzzle/{id}/GET/responses/200/content/application\/json`. + case json(Components.Schemas.PuzzleAndGame) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.PuzzleAndGame { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiPuzzleId.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiPuzzleId.Output.Ok.Headers = .init(), + body: Operations.apiPuzzleId.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The requested puzzle. + /// + /// - Remark: Generated from `#/paths//api/puzzle/{id}/get(apiPuzzleId)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiPuzzleId.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiPuzzleId.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiPuzzleActivity { + internal static let id: Swift.String = "apiPuzzleActivity" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/puzzle/activity/GET/query`. + internal struct Query: Sendable, Hashable { + /// How many entries to download. Leave empty to download all activity. + /// + /// - Remark: Generated from `#/paths/api/puzzle/activity/GET/query/max`. + internal var max: Swift.Int? + /// Download entries before this timestamp. Defaults to now. Use `before` and `max` for pagination. + /// + /// - Remark: Generated from `#/paths/api/puzzle/activity/GET/query/before`. + internal var before: Swift.Int? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - max: How many entries to download. Leave empty to download all activity. + /// - before: Download entries before this timestamp. Defaults to now. Use `before` and `max` for pagination. + internal init( + max: Swift.Int? = nil, + before: Swift.Int? = nil + ) { + self.max = max + self.before = before + } + } + internal var query: Operations.apiPuzzleActivity.Input.Query + /// - Remark: Generated from `#/paths/api/puzzle/activity/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiPuzzleActivity.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiPuzzleActivity.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiPuzzleActivity.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - query: + /// - headers: + internal init( + query: Operations.apiPuzzleActivity.Input.Query = .init(), + headers: Operations.apiPuzzleActivity.Input.Headers = .init() + ) { + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/puzzle/activity/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/puzzle/activity/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiPuzzleActivity.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/puzzle/activity/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/puzzle/activity/GET/responses/200/content/application\/x-ndjson`. + case application_x_hyphen_ndjson(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_ndjson`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_ndjson`. + /// - SeeAlso: `.application_x_hyphen_ndjson`. + internal var application_x_hyphen_ndjson: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_ndjson(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiPuzzleActivity.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiPuzzleActivity.Output.Ok.Headers = .init(), + body: Operations.apiPuzzleActivity.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The puzzle activity of the logged in user. + /// + /// - Remark: Generated from `#/paths//api/puzzle/activity/get(apiPuzzleActivity)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiPuzzleActivity.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiPuzzleActivity.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_ndjson + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-ndjson": + self = .application_x_hyphen_ndjson + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_ndjson: + return "application/x-ndjson" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_ndjson + ] + } + } + } + /// 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 enum apiPuzzleDashboard { + internal static let id: Swift.String = "apiPuzzleDashboard" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/puzzle/dashboard/{days}/GET/path`. + internal struct Path: Sendable, Hashable { + /// How many days to look back when aggregating puzzle results. 30 is sensible. + /// + /// - Remark: Generated from `#/paths/api/puzzle/dashboard/{days}/GET/path/days`. + internal var days: Swift.Int + /// Creates a new `Path`. + /// + /// - Parameters: + /// - days: How many days to look back when aggregating puzzle results. 30 is sensible. + internal init(days: Swift.Int) { + self.days = days + } + } + internal var path: Operations.apiPuzzleDashboard.Input.Path + /// - Remark: Generated from `#/paths/api/puzzle/dashboard/{days}/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiPuzzleDashboard.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiPuzzleDashboard.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiPuzzleDashboard.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.apiPuzzleDashboard.Input.Path, + headers: Operations.apiPuzzleDashboard.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/puzzle/dashboard/{days}/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/puzzle/dashboard/{days}/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiPuzzleDashboard.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/puzzle/dashboard/{days}/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/puzzle/dashboard/{days}/GET/responses/200/content/application\/json`. + case json(Components.Schemas.PuzzleDashboardJson) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.PuzzleDashboardJson { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiPuzzleDashboard.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiPuzzleDashboard.Output.Ok.Headers = .init(), + body: Operations.apiPuzzleDashboard.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The puzzle dashboard of the logged in user. + /// + /// - Remark: Generated from `#/paths//api/puzzle/dashboard/{days}/get(apiPuzzleDashboard)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiPuzzleDashboard.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiPuzzleDashboard.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiStormDashboard { + internal static let id: Swift.String = "apiStormDashboard" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/storm/dashboard/{username}/GET/path`. + internal struct Path: Sendable, Hashable { + /// Username of the player + /// + /// - Remark: Generated from `#/paths/api/storm/dashboard/{username}/GET/path/username`. + internal var username: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - username: Username of the player + internal init(username: Swift.String) { + self.username = username + } + } + internal var path: Operations.apiStormDashboard.Input.Path + /// - Remark: Generated from `#/paths/api/storm/dashboard/{username}/GET/query`. + internal struct Query: Sendable, Hashable { + /// How many days of history to return + /// + /// - Remark: Generated from `#/paths/api/storm/dashboard/{username}/GET/query/days`. + internal var days: Swift.Int? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - days: How many days of history to return + internal init(days: Swift.Int? = nil) { + self.days = days + } + } + internal var query: Operations.apiStormDashboard.Input.Query + /// - Remark: Generated from `#/paths/api/storm/dashboard/{username}/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiStormDashboard.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiStormDashboard.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiStormDashboard.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + internal init( + path: Operations.apiStormDashboard.Input.Path, + query: Operations.apiStormDashboard.Input.Query = .init(), + headers: Operations.apiStormDashboard.Input.Headers = .init() + ) { + self.path = path + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/storm/dashboard/{username}/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/storm/dashboard/{username}/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiStormDashboard.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/storm/dashboard/{username}/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/storm/dashboard/{username}/GET/responses/200/content/application\/json`. + case json(Components.Schemas.StormDashboardJson) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.StormDashboardJson { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiStormDashboard.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiStormDashboard.Output.Ok.Headers = .init(), + body: Operations.apiStormDashboard.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The storm dashboard of a player. + /// + /// - Remark: Generated from `#/paths//api/storm/dashboard/{username}/get(apiStormDashboard)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiStormDashboard.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiStormDashboard.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum racerPost { + internal static let id: Swift.String = "racerPost" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/racer/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.racerPost.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.racerPost.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.racerPost.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + internal init(headers: Operations.racerPost.Input.Headers = .init()) { + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/racer/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/racer/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.racerPost.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/racer/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/racer/POST/responses/200/content/application\/json`. + case json(Components.Schemas.PuzzleRaceJson) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.PuzzleRaceJson { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.racerPost.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.racerPost.Output.Ok.Headers = .init(), + body: Operations.racerPost.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The new puzzle race. + /// + /// - Remark: Generated from `#/paths//api/racer/post(racerPost)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.racerPost.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.racerPost.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiUsers { + internal static let id: Swift.String = "apiUsers" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/users/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiUsers.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiUsers.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiUsers.Input.Headers + /// - Remark: Generated from `#/paths/api/users/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/users/POST/requestBody/content/text\/plain`. + case plainText(OpenAPIRuntime.HTTPBody) + } + internal var body: Operations.apiUsers.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + /// - body: + internal init( + headers: Operations.apiUsers.Input.Headers = .init(), + body: Operations.apiUsers.Input.Body + ) { + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/users/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/users/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiUsers.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/users/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/users/POST/responses/200/content/application\/json`. + case json([Components.Schemas.User]) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: [Components.Schemas.User] { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiUsers.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiUsers.Output.Ok.Headers = .init(), + body: Operations.apiUsers.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The list of users. + /// + /// - Remark: Generated from `#/paths//api/users/post(apiUsers)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiUsers.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiUsers.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// Get my profile + /// + /// Public information about the logged in user. + /// + /// + /// - Remark: HTTP `GET /api/account`. + /// - Remark: Generated from `#/paths//api/account/get(accountMe)`. + internal enum accountMe { + internal static let id: Swift.String = "accountMe" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/account/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.accountMe.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.accountMe.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.accountMe.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + internal init(headers: Operations.accountMe.Input.Headers = .init()) { + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/account/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/account/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.accountMe.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/account/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/account/GET/responses/200/content/application\/json`. + case json(Components.Schemas.UserExtended) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.UserExtended { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.accountMe.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.accountMe.Output.Ok.Headers = .init(), + body: Operations.accountMe.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The public information about the logged in user. + /// + /// - Remark: Generated from `#/paths//api/account/get(accountMe)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.accountMe.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.accountMe.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum accountEmail { + internal static let id: Swift.String = "accountEmail" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/account/email/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.accountEmail.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.accountEmail.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.accountEmail.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + internal init(headers: Operations.accountEmail.Input.Headers = .init()) { + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/account/email/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/account/email/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.accountEmail.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/account/email/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/account/email/GET/responses/200/content/json`. + internal struct jsonPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/account/email/GET/responses/200/content/json/email`. + internal var email: Swift.String? + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - email: + internal init(email: Swift.String? = nil) { + self.email = email + } + internal enum CodingKeys: String, CodingKey { + case email + } + } + /// - Remark: Generated from `#/paths/api/account/email/GET/responses/200/content/application\/json`. + case json(Operations.accountEmail.Output.Ok.Body.jsonPayload) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Operations.accountEmail.Output.Ok.Body.jsonPayload { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.accountEmail.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.accountEmail.Output.Ok.Headers = .init(), + body: Operations.accountEmail.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The email address of the logged in user. + /// + /// - Remark: Generated from `#/paths//api/account/email/get(accountEmail)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.accountEmail.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.accountEmail.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum account { + internal static let id: Swift.String = "account" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/account/preferences/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.account.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.account.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.account.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + internal init(headers: Operations.account.Input.Headers = .init()) { + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/account/preferences/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/account/preferences/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.account.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/account/preferences/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/account/preferences/GET/responses/200/content/json`. + internal struct jsonPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/account/preferences/GET/responses/200/content/json/prefs`. + internal var prefs: Components.Schemas.UserPreferences? + /// - Remark: Generated from `#/paths/api/account/preferences/GET/responses/200/content/json/language`. + internal var language: Swift.String? + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - prefs: + /// - language: + internal init( + prefs: Components.Schemas.UserPreferences? = nil, + language: Swift.String? = nil + ) { + self.prefs = prefs + self.language = language + } + internal enum CodingKeys: String, CodingKey { + case prefs + case language + } + } + /// - Remark: Generated from `#/paths/api/account/preferences/GET/responses/200/content/application\/json`. + case json(Operations.account.Output.Ok.Body.jsonPayload) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Operations.account.Output.Ok.Body.jsonPayload { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.account.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.account.Output.Ok.Headers = .init(), + body: Operations.account.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The preferences of the logged in user. + /// + /// - Remark: Generated from `#/paths//api/account/preferences/get(account)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.account.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.account.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum accountKid { + internal static let id: Swift.String = "accountKid" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/account/kid/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.accountKid.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.accountKid.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.accountKid.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + internal init(headers: Operations.accountKid.Input.Headers = .init()) { + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/account/kid/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/account/kid/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.accountKid.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/account/kid/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/account/kid/GET/responses/200/content/json`. + internal struct jsonPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/account/kid/GET/responses/200/content/json/kid`. + internal var kid: Swift.Bool? + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - kid: + internal init(kid: Swift.Bool? = nil) { + self.kid = kid + } + internal enum CodingKeys: String, CodingKey { + case kid + } + } + /// - Remark: Generated from `#/paths/api/account/kid/GET/responses/200/content/application\/json`. + case json(Operations.accountKid.Output.Ok.Body.jsonPayload) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Operations.accountKid.Output.Ok.Body.jsonPayload { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.accountKid.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.accountKid.Output.Ok.Headers = .init(), + body: Operations.accountKid.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The kid mode status of the logged in user. + /// + /// - Remark: Generated from `#/paths//api/account/kid/get(accountKid)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.accountKid.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.accountKid.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum accountKidPost { + internal static let id: Swift.String = "accountKidPost" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/account/kid/POST/query`. + internal struct Query: Sendable, Hashable { + /// Kid mode status + /// + /// - Remark: Generated from `#/paths/api/account/kid/POST/query/v`. + internal var v: Swift.Bool + /// Creates a new `Query`. + /// + /// - Parameters: + /// - v: Kid mode status + internal init(v: Swift.Bool) { + self.v = v + } + } + internal var query: Operations.accountKidPost.Input.Query + /// - Remark: Generated from `#/paths/api/account/kid/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.accountKidPost.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.accountKidPost.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.accountKidPost.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - query: + /// - headers: + internal init( + query: Operations.accountKidPost.Input.Query, + headers: Operations.accountKidPost.Input.Headers = .init() + ) { + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/account/kid/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/account/kid/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.accountKidPost.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/account/kid/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/account/kid/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.accountKidPost.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.accountKidPost.Output.Ok.Headers = .init(), + body: Operations.accountKidPost.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The kid mode status was set successfully for the logged in user. + /// + /// - Remark: Generated from `#/paths//api/account/kid/post(accountKidPost)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.accountKidPost.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.accountKidPost.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum timeline { + internal static let id: Swift.String = "timeline" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/timeline/GET/query`. + internal struct Query: Sendable, Hashable { + /// Show events since this timestamp. + /// + /// - Remark: Generated from `#/paths/api/timeline/GET/query/since`. + internal var since: Swift.Int? + /// Max number of events to fetch. + /// + /// - Remark: Generated from `#/paths/api/timeline/GET/query/nb`. + internal var nb: Swift.Int? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - since: Show events since this timestamp. + /// - nb: Max number of events to fetch. + internal init( + since: Swift.Int? = nil, + nb: Swift.Int? = nil + ) { + self.since = since + self.nb = nb + } + } + internal var query: Operations.timeline.Input.Query + /// - Remark: Generated from `#/paths/api/timeline/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.timeline.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.timeline.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.timeline.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - query: + /// - headers: + internal init( + query: Operations.timeline.Input.Query = .init(), + headers: Operations.timeline.Input.Headers = .init() + ) { + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/timeline/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/timeline/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.timeline.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/timeline/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/timeline/GET/responses/200/content/application\/json`. + case json(Components.Schemas.Timeline) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Timeline { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.timeline.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.timeline.Output.Ok.Headers = .init(), + body: Operations.timeline.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The events in the timeline of the logged in user. + /// + /// - Remark: Generated from `#/paths//api/timeline/get(timeline)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.timeline.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.timeline.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum gamePgn { + internal static let id: Swift.String = "gamePgn" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/game/export/{gameId}/GET/path`. + internal struct Path: Sendable, Hashable { + /// The game ID (8 characters). + /// + /// - Remark: Generated from `#/paths/game/export/{gameId}/GET/path/gameId`. + internal var gameId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - gameId: The game ID (8 characters). + internal init(gameId: Swift.String) { + self.gameId = gameId + } + } + internal var path: Operations.gamePgn.Input.Path + /// - Remark: Generated from `#/paths/game/export/{gameId}/GET/query`. + internal struct Query: Sendable, Hashable { + /// Include the PGN moves. + /// + /// - Remark: Generated from `#/paths/game/export/{gameId}/GET/query/moves`. + internal var moves: Swift.Bool? + /// Include the full PGN within the JSON response, in a `pgn` field. + /// + /// - Remark: Generated from `#/paths/game/export/{gameId}/GET/query/pgnInJson`. + internal var pgnInJson: Swift.Bool? + /// Include the PGN tags. + /// + /// - Remark: Generated from `#/paths/game/export/{gameId}/GET/query/tags`. + internal var tags: Swift.Bool? + /// Include clock status when available. + /// Either as PGN comments: `2. exd5 { [%clk 1:01:27] } e5 { [%clk 1:01:28] }` + /// Or in a `clocks` JSON field, as centisecond integers, depending on the response type. + /// + /// + /// - Remark: Generated from `#/paths/game/export/{gameId}/GET/query/clocks`. + internal var clocks: Swift.Bool? + /// Include analysis evaluations and comments, when available. + /// Either as PGN comments: `12. Bxf6 { [%eval 0.23] } a3 { [%eval -1.09] }` + /// Or in an `analysis` JSON field, depending on the response type. + /// + /// + /// - Remark: Generated from `#/paths/game/export/{gameId}/GET/query/evals`. + internal var evals: Swift.Bool? + /// Include [accuracy percent](https://lichess.org/page/accuracy) of each player, when available. + /// + /// + /// - Remark: Generated from `#/paths/game/export/{gameId}/GET/query/accuracy`. + internal var accuracy: Swift.Bool? + /// Include the opening name. + /// Example: `[Opening "King's Gambit Accepted, King's Knight Gambit"]` + /// + /// + /// - Remark: Generated from `#/paths/game/export/{gameId}/GET/query/opening`. + internal var opening: Swift.Bool? + /// Plies which mark the beginning of the middlegame and endgame. + /// Only available in JSON + /// + /// + /// - Remark: Generated from `#/paths/game/export/{gameId}/GET/query/division`. + internal var division: Swift.Bool? + /// Insert textual annotations in the PGN about the opening, analysis variations, mistakes, and game termination. + /// Example: `5... g4? { (-0.98 → 0.60) Mistake. Best move was h6. } (5... h6 6. d4 Ne7 7. g3 d5 8. exd5 fxg3 9. hxg3 c6 10. dxc6)` + /// + /// + /// - Remark: Generated from `#/paths/game/export/{gameId}/GET/query/literate`. + internal var literate: Swift.Bool? + /// URL of a text file containing real names and ratings, to replace Lichess usernames and ratings in the PGN. + /// Example: <https://gist.githubusercontent.com/ornicar/6bfa91eb61a2dcae7bcd14cce1b2a4eb/raw/768b9f6cc8a8471d2555e47ba40fb0095e5fba37/gistfile1.txt> + /// + /// + /// - Remark: Generated from `#/paths/game/export/{gameId}/GET/query/players`. + internal var players: Swift.String? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - moves: Include the PGN moves. + /// - pgnInJson: Include the full PGN within the JSON response, in a `pgn` field. + /// - tags: Include the PGN tags. + /// - clocks: Include clock status when available. + /// - evals: Include analysis evaluations and comments, when available. + /// - accuracy: Include [accuracy percent](https://lichess.org/page/accuracy) of each player, when available. + /// - opening: Include the opening name. + /// - division: Plies which mark the beginning of the middlegame and endgame. + /// - literate: Insert textual annotations in the PGN about the opening, analysis variations, mistakes, and game termination. + /// - players: URL of a text file containing real names and ratings, to replace Lichess usernames and ratings in the PGN. + internal init( + moves: Swift.Bool? = nil, + pgnInJson: Swift.Bool? = nil, + tags: Swift.Bool? = nil, + clocks: Swift.Bool? = nil, + evals: Swift.Bool? = nil, + accuracy: Swift.Bool? = nil, + opening: Swift.Bool? = nil, + division: Swift.Bool? = nil, + literate: Swift.Bool? = nil, + players: Swift.String? = nil + ) { + self.moves = moves + self.pgnInJson = pgnInJson + self.tags = tags + self.clocks = clocks + self.evals = evals + self.accuracy = accuracy + self.opening = opening + self.division = division + self.literate = literate + self.players = players + } + } + internal var query: Operations.gamePgn.Input.Query + /// - Remark: Generated from `#/paths/game/export/{gameId}/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.gamePgn.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.gamePgn.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.gamePgn.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + internal init( + path: Operations.gamePgn.Input.Path, + query: Operations.gamePgn.Input.Query = .init(), + headers: Operations.gamePgn.Input.Headers = .init() + ) { + self.path = path + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/game/export/{gameId}/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/game/export/{gameId}/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.gamePgn.Output.Ok.Headers + /// - Remark: Generated from `#/paths/game/export/{gameId}/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/game/export/{gameId}/GET/responses/200/content/application\/x-chess-pgn`. + case application_x_hyphen_chess_hyphen_pgn(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_chess_hyphen_pgn`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_chess_hyphen_pgn`. + /// - SeeAlso: `.application_x_hyphen_chess_hyphen_pgn`. + internal var application_x_hyphen_chess_hyphen_pgn: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_chess_hyphen_pgn(body): + return body + default: + try throwUnexpectedResponseBody( + expectedContent: "application/x-chess-pgn", + body: self + ) + } + } + } + /// - Remark: Generated from `#/paths/game/export/{gameId}/GET/responses/200/content/application\/json`. + case json(Components.Schemas.GameJson) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.GameJson { + get throws { + switch self { + case let .json(body): + return body + default: + try throwUnexpectedResponseBody( + expectedContent: "application/json", + body: self + ) + } + } + } + } + /// Received HTTP response body + internal var body: Operations.gamePgn.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.gamePgn.Output.Ok.Headers = .init(), + body: Operations.gamePgn.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The game representation. + /// + /// - Remark: Generated from `#/paths//game/export/{gameId}/get(gamePgn)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.gamePgn.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.gamePgn.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_chess_hyphen_pgn + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-chess-pgn": + self = .application_x_hyphen_chess_hyphen_pgn + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_chess_hyphen_pgn: + return "application/x-chess-pgn" + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_chess_hyphen_pgn, + .json + ] + } + } + } + /// 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 enum apiUserCurrentGame { + internal static let id: Swift.String = "apiUserCurrentGame" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/current-game/GET/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/current-game/GET/path/username`. + internal var username: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - username: + internal init(username: Swift.String) { + self.username = username + } + } + internal var path: Operations.apiUserCurrentGame.Input.Path + /// - Remark: Generated from `#/paths/api/user/{username}/current-game/GET/query`. + internal struct Query: Sendable, Hashable { + /// Include the PGN moves. + /// + /// - Remark: Generated from `#/paths/api/user/{username}/current-game/GET/query/moves`. + internal var moves: Swift.Bool? + /// Include the full PGN within the JSON response, in a `pgn` field. + /// + /// - Remark: Generated from `#/paths/api/user/{username}/current-game/GET/query/pgnInJson`. + internal var pgnInJson: Swift.Bool? + /// Include the PGN tags. + /// + /// - Remark: Generated from `#/paths/api/user/{username}/current-game/GET/query/tags`. + internal var tags: Swift.Bool? + /// Include clock status when available. + /// Either as PGN comments: `2. exd5 { [%clk 1:01:27] } e5 { [%clk 1:01:28] }` + /// Or in a `clocks` JSON field, as centisecond integers, depending on the response type. + /// + /// + /// - Remark: Generated from `#/paths/api/user/{username}/current-game/GET/query/clocks`. + internal var clocks: Swift.Bool? + /// Include analysis evaluations and comments, when available. + /// Either as PGN comments: `12. Bxf6 { [%eval 0.23] } a3 { [%eval -1.09] }` + /// Or in an `analysis` JSON field, depending on the response type. + /// + /// + /// - Remark: Generated from `#/paths/api/user/{username}/current-game/GET/query/evals`. + internal var evals: Swift.Bool? + /// Include [accuracy percent](https://lichess.org/page/accuracy) of each player, when available. + /// + /// + /// - Remark: Generated from `#/paths/api/user/{username}/current-game/GET/query/accuracy`. + internal var accuracy: Swift.Bool? + /// Include the opening name. + /// Example: `[Opening "King's Gambit Accepted, King's Knight Gambit"]` + /// + /// + /// - Remark: Generated from `#/paths/api/user/{username}/current-game/GET/query/opening`. + internal var opening: Swift.Bool? + /// Plies which mark the beginning of the middlegame and endgame. + /// Only available in JSON + /// + /// + /// - Remark: Generated from `#/paths/api/user/{username}/current-game/GET/query/division`. + internal var division: Swift.Bool? + /// Insert textual annotations in the PGN about the opening, analysis variations, mistakes, and game termination. + /// Example: `5... g4? { (-0.98 → 0.60) Mistake. Best move was h6. } (5... h6 6. d4 Ne7 7. g3 d5 8. exd5 fxg3 9. hxg3 c6 10. dxc6)` + /// + /// + /// - Remark: Generated from `#/paths/api/user/{username}/current-game/GET/query/literate`. + internal var literate: Swift.Bool? + /// URL of a text file containing real names and ratings, to replace Lichess usernames and ratings in the PGN. + /// Example: <https://gist.githubusercontent.com/ornicar/6bfa91eb61a2dcae7bcd14cce1b2a4eb/raw/768b9f6cc8a8471d2555e47ba40fb0095e5fba37/gistfile1.txt> + /// + /// + /// - Remark: Generated from `#/paths/api/user/{username}/current-game/GET/query/players`. + internal var players: Swift.String? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - moves: Include the PGN moves. + /// - pgnInJson: Include the full PGN within the JSON response, in a `pgn` field. + /// - tags: Include the PGN tags. + /// - clocks: Include clock status when available. + /// - evals: Include analysis evaluations and comments, when available. + /// - accuracy: Include [accuracy percent](https://lichess.org/page/accuracy) of each player, when available. + /// - opening: Include the opening name. + /// - division: Plies which mark the beginning of the middlegame and endgame. + /// - literate: Insert textual annotations in the PGN about the opening, analysis variations, mistakes, and game termination. + /// - players: URL of a text file containing real names and ratings, to replace Lichess usernames and ratings in the PGN. + internal init( + moves: Swift.Bool? = nil, + pgnInJson: Swift.Bool? = nil, + tags: Swift.Bool? = nil, + clocks: Swift.Bool? = nil, + evals: Swift.Bool? = nil, + accuracy: Swift.Bool? = nil, + opening: Swift.Bool? = nil, + division: Swift.Bool? = nil, + literate: Swift.Bool? = nil, + players: Swift.String? = nil + ) { + self.moves = moves + self.pgnInJson = pgnInJson + self.tags = tags + self.clocks = clocks + self.evals = evals + self.accuracy = accuracy + self.opening = opening + self.division = division + self.literate = literate + self.players = players + } + } + internal var query: Operations.apiUserCurrentGame.Input.Query + /// - Remark: Generated from `#/paths/api/user/{username}/current-game/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiUserCurrentGame.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiUserCurrentGame.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiUserCurrentGame.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + internal init( + path: Operations.apiUserCurrentGame.Input.Path, + query: Operations.apiUserCurrentGame.Input.Query = .init(), + headers: Operations.apiUserCurrentGame.Input.Headers = .init() + ) { + self.path = path + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/current-game/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/current-game/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiUserCurrentGame.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/user/{username}/current-game/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/current-game/GET/responses/200/content/application\/x-chess-pgn`. + case application_x_hyphen_chess_hyphen_pgn(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_chess_hyphen_pgn`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_chess_hyphen_pgn`. + /// - SeeAlso: `.application_x_hyphen_chess_hyphen_pgn`. + internal var application_x_hyphen_chess_hyphen_pgn: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_chess_hyphen_pgn(body): + return body + default: + try throwUnexpectedResponseBody( + expectedContent: "application/x-chess-pgn", + body: self + ) + } + } + } + /// - Remark: Generated from `#/paths/api/user/{username}/current-game/GET/responses/200/content/application\/json`. + case json(Components.Schemas.GameJson) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.GameJson { + get throws { + switch self { + case let .json(body): + return body + default: + try throwUnexpectedResponseBody( + expectedContent: "application/json", + body: self + ) + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiUserCurrentGame.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiUserCurrentGame.Output.Ok.Headers = .init(), + body: Operations.apiUserCurrentGame.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The ongoing (or last) game of a user. + /// + /// - Remark: Generated from `#/paths//api/user/{username}/current-game/get(apiUserCurrentGame)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiUserCurrentGame.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiUserCurrentGame.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_chess_hyphen_pgn + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-chess-pgn": + self = .application_x_hyphen_chess_hyphen_pgn + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_chess_hyphen_pgn: + return "application/x-chess-pgn" + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_chess_hyphen_pgn, + .json + ] + } + } + } + /// 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 enum apiGamesUser { + internal static let id: Swift.String = "apiGamesUser" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/path`. + internal struct Path: Sendable, Hashable { + /// The user name. + /// + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/path/username`. + internal var username: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - username: The user name. + internal init(username: Swift.String) { + self.username = username + } + } + internal var path: Operations.apiGamesUser.Input.Path + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/query`. + internal struct Query: Sendable, Hashable { + /// Download games played since this timestamp. Defaults to account creation date. + /// + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/query/since`. + internal var since: Swift.Int? + /// Download games played until this timestamp. Defaults to now. + /// + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/query/until`. + internal var until: Swift.Int? + /// How many games to download. Leave empty to download all games. + /// + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/query/max`. + internal var max: Swift.Int? + /// [Filter] Only games played against this opponent + /// + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/query/vs`. + internal var vs: Swift.String? + /// [Filter] Only rated (`true`) or casual (`false`) games + /// + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/query/rated`. + internal var rated: Swift.Bool? + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/query/perfType`. + internal struct perfTypePayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/query/perfType/value1`. + internal var value1: Components.Schemas.PerfType + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/query/perfType/value2`. + internal var value2: OpenAPIRuntime.OpenAPIValueContainer + /// Creates a new `perfTypePayload`. + /// + /// - Parameters: + /// - value1: + /// - value2: + internal init( + value1: Components.Schemas.PerfType, + value2: OpenAPIRuntime.OpenAPIValueContainer + ) { + self.value1 = value1 + self.value2 = value2 + } + internal init(from decoder: any Decoder) throws { + value1 = try decoder.decodeFromSingleValueContainer() + value2 = try .init(from: decoder) + } + internal func encode(to encoder: any Encoder) throws { + try encoder.encodeToSingleValueContainer(value1) + } + } + /// [Filter] Only games in these speeds or variants. + /// + /// Multiple perf types can be specified, separated by a comma. + /// + /// Example: blitz,rapid,classical + /// + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/query/perfType`. + internal var perfType: Operations.apiGamesUser.Input.Query.perfTypePayload? + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/query/color`. + @frozen internal enum colorPayload: String, Codable, Hashable, Sendable { + case white = "white" + case black = "black" + } + /// [Filter] Only games played as this color. + /// + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/query/color`. + internal var color: Operations.apiGamesUser.Input.Query.colorPayload? + /// [Filter] Only games with or without a computer analysis available + /// + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/query/analysed`. + internal var analysed: Swift.Bool? + /// Include the PGN moves. + /// + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/query/moves`. + internal var moves: Swift.Bool? + /// Include the full PGN within the JSON response, in a `pgn` field. The response type must be set to `application/x-ndjson` by the request `Accept` header. + /// + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/query/pgnInJson`. + internal var pgnInJson: Swift.Bool? + /// Include the PGN tags. + /// + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/query/tags`. + internal var tags: Swift.Bool? + /// Include clock status when available. + /// Either as PGN comments: `2. exd5 { [%clk 1:01:27] } e5 { [%clk 1:01:28] }` + /// Or in a `clocks` JSON field, as centisecond integers, depending on the response type. + /// + /// + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/query/clocks`. + internal var clocks: Swift.Bool? + /// Include analysis evaluations and comments, when available. + /// Either as PGN comments: `12. Bxf6 { [%eval 0.23] } a3 { [%eval -1.09] }` + /// Or in an `analysis` JSON field, depending on the response type. + /// + /// + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/query/evals`. + internal var evals: Swift.Bool? + /// Include [accuracy percent](https://lichess.org/page/accuracy) of each player, when available. + /// + /// + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/query/accuracy`. + internal var accuracy: Swift.Bool? + /// Include the opening name. + /// Example: `[Opening "King's Gambit Accepted, King's Knight Gambit"]` + /// + /// + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/query/opening`. + internal var opening: Swift.Bool? + /// Plies which mark the beginning of the middlegame and endgame. + /// Only available in JSON + /// + /// + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/query/division`. + internal var division: Swift.Bool? + /// 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: Generated from `#/paths/api/games/user/{username}/GET/query/ongoing`. + internal var ongoing: Swift.Bool? + /// Include finished games. Set to `false` to only get ongoing games. + /// + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/query/finished`. + internal var finished: Swift.Bool? + /// Insert textual annotations in the PGN about the opening, analysis variations, mistakes, and game termination. + /// Example: `5... g4? { (-0.98 → 0.60) Mistake. Best move was h6. } (5... h6 6. d4 Ne7 7. g3 d5 8. exd5 fxg3 9. hxg3 c6 10. dxc6)` + /// + /// + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/query/literate`. + internal var literate: Swift.Bool? + /// Include the FEN notation of the last position of the game. + /// The response type must be set to `application/x-ndjson` by the request `Accept` header. + /// + /// + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/query/lastFen`. + internal var lastFen: Swift.Bool? + /// URL of a text file containing real names and ratings, to replace Lichess usernames and ratings in the PGN. + /// Example: <https://gist.githubusercontent.com/ornicar/6bfa91eb61a2dcae7bcd14cce1b2a4eb/raw/768b9f6cc8a8471d2555e47ba40fb0095e5fba37/gistfile1.txt> + /// + /// + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/query/players`. + internal var players: Swift.String? + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/query/sort`. + @frozen internal enum sortPayload: String, Codable, Hashable, Sendable { + case dateAsc = "dateAsc" + case dateDesc = "dateDesc" + } + /// Sort order of the games. + /// + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/query/sort`. + internal var sort: Operations.apiGamesUser.Input.Query.sortPayload? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - since: Download games played since this timestamp. Defaults to account creation date. + /// - until: Download games played until this timestamp. Defaults to now. + /// - max: How many games to download. Leave empty to download all games. + /// - vs: [Filter] Only games played against this opponent + /// - rated: [Filter] Only rated (`true`) or casual (`false`) games + /// - perfType: [Filter] Only games in these speeds or variants. + /// - color: [Filter] Only games played as this color. + /// - analysed: [Filter] Only games with or without a computer analysis available + /// - moves: Include the PGN moves. + /// - pgnInJson: Include the full PGN within the JSON response, in a `pgn` field. The response type must be set to `application/x-ndjson` by the request `Accept` header. + /// - tags: Include the PGN tags. + /// - clocks: Include clock status when available. + /// - evals: Include analysis evaluations and comments, when available. + /// - accuracy: Include [accuracy percent](https://lichess.org/page/accuracy) of each player, when available. + /// - opening: Include the opening name. + /// - division: Plies which mark the beginning of the middlegame and endgame. + /// - ongoing: 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. + /// - finished: Include finished games. Set to `false` to only get ongoing games. + /// - literate: Insert textual annotations in the PGN about the opening, analysis variations, mistakes, and game termination. + /// - lastFen: Include the FEN notation of the last position of the game. + /// - players: URL of a text file containing real names and ratings, to replace Lichess usernames and ratings in the PGN. + /// - sort: Sort order of the games. + internal init( + since: Swift.Int? = nil, + until: Swift.Int? = nil, + max: Swift.Int? = nil, + vs: Swift.String? = nil, + rated: Swift.Bool? = nil, + perfType: Operations.apiGamesUser.Input.Query.perfTypePayload? = nil, + color: Operations.apiGamesUser.Input.Query.colorPayload? = nil, + analysed: Swift.Bool? = nil, + moves: Swift.Bool? = nil, + pgnInJson: Swift.Bool? = nil, + tags: Swift.Bool? = nil, + clocks: Swift.Bool? = nil, + evals: Swift.Bool? = nil, + accuracy: Swift.Bool? = nil, + opening: Swift.Bool? = nil, + division: Swift.Bool? = nil, + ongoing: Swift.Bool? = nil, + finished: Swift.Bool? = nil, + literate: Swift.Bool? = nil, + lastFen: Swift.Bool? = nil, + players: Swift.String? = nil, + sort: Operations.apiGamesUser.Input.Query.sortPayload? = nil + ) { + self.since = since + self.until = until + self.max = max + self.vs = vs + self.rated = rated + self.perfType = perfType + self.color = color + self.analysed = analysed + self.moves = moves + self.pgnInJson = pgnInJson + self.tags = tags + self.clocks = clocks + self.evals = evals + self.accuracy = accuracy + self.opening = opening + self.division = division + self.ongoing = ongoing + self.finished = finished + self.literate = literate + self.lastFen = lastFen + self.players = players + self.sort = sort + } + } + internal var query: Operations.apiGamesUser.Input.Query + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiGamesUser.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiGamesUser.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiGamesUser.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + internal init( + path: Operations.apiGamesUser.Input.Path, + query: Operations.apiGamesUser.Input.Query = .init(), + headers: Operations.apiGamesUser.Input.Headers = .init() + ) { + self.path = path + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiGamesUser.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/responses/200/content/application\/x-chess-pgn`. + case application_x_hyphen_chess_hyphen_pgn(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_chess_hyphen_pgn`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_chess_hyphen_pgn`. + /// - SeeAlso: `.application_x_hyphen_chess_hyphen_pgn`. + internal var application_x_hyphen_chess_hyphen_pgn: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_chess_hyphen_pgn(body): + return body + default: + try throwUnexpectedResponseBody( + expectedContent: "application/x-chess-pgn", + body: self + ) + } + } + } + /// - Remark: Generated from `#/paths/api/games/user/{username}/GET/responses/200/content/application\/x-ndjson`. + case application_x_hyphen_ndjson(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_ndjson`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_ndjson`. + /// - SeeAlso: `.application_x_hyphen_ndjson`. + internal var application_x_hyphen_ndjson: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_ndjson(body): + return body + default: + try throwUnexpectedResponseBody( + expectedContent: "application/x-ndjson", + body: self + ) + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiGamesUser.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiGamesUser.Output.Ok.Headers = .init(), + body: Operations.apiGamesUser.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The games of the user. + /// + /// - Remark: Generated from `#/paths//api/games/user/{username}/get(apiGamesUser)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiGamesUser.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiGamesUser.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_chess_hyphen_pgn + case application_x_hyphen_ndjson + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-chess-pgn": + self = .application_x_hyphen_chess_hyphen_pgn + case "application/x-ndjson": + self = .application_x_hyphen_ndjson + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_chess_hyphen_pgn: + return "application/x-chess-pgn" + case .application_x_hyphen_ndjson: + return "application/x-ndjson" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_chess_hyphen_pgn, + .application_x_hyphen_ndjson + ] + } + } + } + /// 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 enum gamesExportIds { + internal static let id: Swift.String = "gamesExportIds" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/games/export/_ids/POST/query`. + internal struct Query: Sendable, Hashable { + /// Include the PGN moves. + /// + /// - Remark: Generated from `#/paths/api/games/export/_ids/POST/query/moves`. + internal var moves: Swift.Bool? + /// Include the full PGN within the JSON response, in a `pgn` field. + /// + /// - Remark: Generated from `#/paths/api/games/export/_ids/POST/query/pgnInJson`. + internal var pgnInJson: Swift.Bool? + /// Include the PGN tags. + /// + /// - Remark: Generated from `#/paths/api/games/export/_ids/POST/query/tags`. + internal var tags: Swift.Bool? + /// Include clock status when available. + /// Either as PGN comments: `2. exd5 { [%clk 1:01:27] } e5 { [%clk 1:01:28] }` + /// Or in a `clocks` JSON field, as centisecond integers, depending on the response type. + /// + /// + /// - Remark: Generated from `#/paths/api/games/export/_ids/POST/query/clocks`. + internal var clocks: Swift.Bool? + /// Include analysis evaluations and comments, when available. + /// Either as PGN comments: `12. Bxf6 { [%eval 0.23] } a3 { [%eval -1.09] }` + /// Or in an `analysis` JSON field, depending on the response type. + /// + /// + /// - Remark: Generated from `#/paths/api/games/export/_ids/POST/query/evals`. + internal var evals: Swift.Bool? + /// Include [accuracy percent](https://lichess.org/page/accuracy) of each player, when available. + /// + /// + /// - Remark: Generated from `#/paths/api/games/export/_ids/POST/query/accuracy`. + internal var accuracy: Swift.Bool? + /// Include the opening name. + /// Example: `[Opening "King's Gambit Accepted, King's Knight Gambit"]` + /// + /// + /// - Remark: Generated from `#/paths/api/games/export/_ids/POST/query/opening`. + internal var opening: Swift.Bool? + /// Plies which mark the beginning of the middlegame and endgame. + /// Only available in JSON + /// + /// + /// - Remark: Generated from `#/paths/api/games/export/_ids/POST/query/division`. + internal var division: Swift.Bool? + /// Insert textual annotations in the PGN about the opening, analysis variations, mistakes, and game termination. + /// Example: `5... g4? { (-0.98 → 0.60) Mistake. Best move was h6. } (5... h6 6. d4 Ne7 7. g3 d5 8. exd5 fxg3 9. hxg3 c6 10. dxc6)` + /// + /// + /// - Remark: Generated from `#/paths/api/games/export/_ids/POST/query/literate`. + internal var literate: Swift.Bool? + /// URL of a text file containing real names and ratings, to replace Lichess usernames and ratings in the PGN. + /// Example: <https://gist.githubusercontent.com/ornicar/6bfa91eb61a2dcae7bcd14cce1b2a4eb/raw/768b9f6cc8a8471d2555e47ba40fb0095e5fba37/gistfile1.txt> + /// + /// + /// - Remark: Generated from `#/paths/api/games/export/_ids/POST/query/players`. + internal var players: Swift.String? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - moves: Include the PGN moves. + /// - pgnInJson: Include the full PGN within the JSON response, in a `pgn` field. + /// - tags: Include the PGN tags. + /// - clocks: Include clock status when available. + /// - evals: Include analysis evaluations and comments, when available. + /// - accuracy: Include [accuracy percent](https://lichess.org/page/accuracy) of each player, when available. + /// - opening: Include the opening name. + /// - division: Plies which mark the beginning of the middlegame and endgame. + /// - literate: Insert textual annotations in the PGN about the opening, analysis variations, mistakes, and game termination. + /// - players: URL of a text file containing real names and ratings, to replace Lichess usernames and ratings in the PGN. + internal init( + moves: Swift.Bool? = nil, + pgnInJson: Swift.Bool? = nil, + tags: Swift.Bool? = nil, + clocks: Swift.Bool? = nil, + evals: Swift.Bool? = nil, + accuracy: Swift.Bool? = nil, + opening: Swift.Bool? = nil, + division: Swift.Bool? = nil, + literate: Swift.Bool? = nil, + players: Swift.String? = nil + ) { + self.moves = moves + self.pgnInJson = pgnInJson + self.tags = tags + self.clocks = clocks + self.evals = evals + self.accuracy = accuracy + self.opening = opening + self.division = division + self.literate = literate + self.players = players + } + } + internal var query: Operations.gamesExportIds.Input.Query + /// - Remark: Generated from `#/paths/api/games/export/_ids/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.gamesExportIds.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.gamesExportIds.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.gamesExportIds.Input.Headers + /// - Remark: Generated from `#/paths/api/games/export/_ids/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/games/export/_ids/POST/requestBody/content/text\/plain`. + case plainText(OpenAPIRuntime.HTTPBody) + } + internal var body: Operations.gamesExportIds.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - query: + /// - headers: + /// - body: + internal init( + query: Operations.gamesExportIds.Input.Query = .init(), + headers: Operations.gamesExportIds.Input.Headers = .init(), + body: Operations.gamesExportIds.Input.Body + ) { + self.query = query + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/games/export/_ids/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/games/export/_ids/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.gamesExportIds.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/games/export/_ids/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/games/export/_ids/POST/responses/200/content/application\/x-chess-pgn`. + case application_x_hyphen_chess_hyphen_pgn(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_chess_hyphen_pgn`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_chess_hyphen_pgn`. + /// - SeeAlso: `.application_x_hyphen_chess_hyphen_pgn`. + internal var application_x_hyphen_chess_hyphen_pgn: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_chess_hyphen_pgn(body): + return body + default: + try throwUnexpectedResponseBody( + expectedContent: "application/x-chess-pgn", + body: self + ) + } + } + } + /// - Remark: Generated from `#/paths/api/games/export/_ids/POST/responses/200/content/application\/x-ndjson`. + case application_x_hyphen_ndjson(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_ndjson`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_ndjson`. + /// - SeeAlso: `.application_x_hyphen_ndjson`. + internal var application_x_hyphen_ndjson: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_ndjson(body): + return body + default: + try throwUnexpectedResponseBody( + expectedContent: "application/x-ndjson", + body: self + ) + } + } + } + } + /// Received HTTP response body + internal var body: Operations.gamesExportIds.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.gamesExportIds.Output.Ok.Headers = .init(), + body: Operations.gamesExportIds.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The representation of the games. + /// + /// - Remark: Generated from `#/paths//api/games/export/_ids/post(gamesExportIds)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.gamesExportIds.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.gamesExportIds.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_chess_hyphen_pgn + case application_x_hyphen_ndjson + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-chess-pgn": + self = .application_x_hyphen_chess_hyphen_pgn + case "application/x-ndjson": + self = .application_x_hyphen_ndjson + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_chess_hyphen_pgn: + return "application/x-chess-pgn" + case .application_x_hyphen_ndjson: + return "application/x-ndjson" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_chess_hyphen_pgn, + .application_x_hyphen_ndjson + ] + } + } + } + /// 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 enum gamesByUsers { + internal static let id: Swift.String = "gamesByUsers" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/stream/games-by-users/POST/query`. + internal struct Query: Sendable, Hashable { + /// Include the already started games at the beginning of the stream. + /// + /// - Remark: Generated from `#/paths/api/stream/games-by-users/POST/query/withCurrentGames`. + internal var withCurrentGames: Swift.Bool? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - withCurrentGames: Include the already started games at the beginning of the stream. + internal init(withCurrentGames: Swift.Bool? = nil) { + self.withCurrentGames = withCurrentGames + } + } + internal var query: Operations.gamesByUsers.Input.Query + /// - Remark: Generated from `#/paths/api/stream/games-by-users/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.gamesByUsers.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.gamesByUsers.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.gamesByUsers.Input.Headers + /// - Remark: Generated from `#/paths/api/stream/games-by-users/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/stream/games-by-users/POST/requestBody/content/text\/plain`. + case plainText(OpenAPIRuntime.HTTPBody) + } + internal var body: Operations.gamesByUsers.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - query: + /// - headers: + /// - body: + internal init( + query: Operations.gamesByUsers.Input.Query = .init(), + headers: Operations.gamesByUsers.Input.Headers = .init(), + body: Operations.gamesByUsers.Input.Body + ) { + self.query = query + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/stream/games-by-users/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/stream/games-by-users/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.gamesByUsers.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/stream/games-by-users/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/stream/games-by-users/POST/responses/200/content/application\/x-ndjson`. + case application_x_hyphen_ndjson(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_ndjson`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_ndjson`. + /// - SeeAlso: `.application_x_hyphen_ndjson`. + internal var application_x_hyphen_ndjson: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_ndjson(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.gamesByUsers.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.gamesByUsers.Output.Ok.Headers = .init(), + body: Operations.gamesByUsers.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The stream of the games played between the users. + /// + /// - Remark: Generated from `#/paths//api/stream/games-by-users/post(gamesByUsers)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.gamesByUsers.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.gamesByUsers.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_ndjson + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-ndjson": + self = .application_x_hyphen_ndjson + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_ndjson: + return "application/x-ndjson" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_ndjson + ] + } + } + } + /// 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 enum gamesByIds { + internal static let id: Swift.String = "gamesByIds" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/stream/games/{streamId}/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/stream/games/{streamId}/POST/path/streamId`. + internal var streamId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - streamId: + internal init(streamId: Swift.String) { + self.streamId = streamId + } + } + internal var path: Operations.gamesByIds.Input.Path + /// - Remark: Generated from `#/paths/api/stream/games/{streamId}/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.gamesByIds.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.gamesByIds.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.gamesByIds.Input.Headers + /// - Remark: Generated from `#/paths/api/stream/games/{streamId}/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/stream/games/{streamId}/POST/requestBody/content/text\/plain`. + case plainText(OpenAPIRuntime.HTTPBody) + } + internal var body: Operations.gamesByIds.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + /// - body: + internal init( + path: Operations.gamesByIds.Input.Path, + headers: Operations.gamesByIds.Input.Headers = .init(), + body: Operations.gamesByIds.Input.Body + ) { + self.path = path + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/stream/games/{streamId}/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/stream/games/{streamId}/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.gamesByIds.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/stream/games/{streamId}/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/stream/games/{streamId}/POST/responses/200/content/application\/x-ndjson`. + case application_x_hyphen_ndjson(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_ndjson`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_ndjson`. + /// - SeeAlso: `.application_x_hyphen_ndjson`. + internal var application_x_hyphen_ndjson: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_ndjson(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.gamesByIds.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.gamesByIds.Output.Ok.Headers = .init(), + body: Operations.gamesByIds.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The stream of the games matching the requested IDs. + /// + /// - Remark: Generated from `#/paths//api/stream/games/{streamId}/post(gamesByIds)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.gamesByIds.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.gamesByIds.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_ndjson + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-ndjson": + self = .application_x_hyphen_ndjson + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_ndjson: + return "application/x-ndjson" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_ndjson + ] + } + } + } + /// 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 enum gamesByIdsAdd { + internal static let id: Swift.String = "gamesByIdsAdd" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/stream/games/{streamId}/add/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/stream/games/{streamId}/add/POST/path/streamId`. + internal var streamId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - streamId: + internal init(streamId: Swift.String) { + self.streamId = streamId + } + } + internal var path: Operations.gamesByIdsAdd.Input.Path + /// - Remark: Generated from `#/paths/api/stream/games/{streamId}/add/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.gamesByIdsAdd.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.gamesByIdsAdd.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.gamesByIdsAdd.Input.Headers + /// - Remark: Generated from `#/paths/api/stream/games/{streamId}/add/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/stream/games/{streamId}/add/POST/requestBody/content/text\/plain`. + case plainText(OpenAPIRuntime.HTTPBody) + } + internal var body: Operations.gamesByIdsAdd.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + /// - body: + internal init( + path: Operations.gamesByIdsAdd.Input.Path, + headers: Operations.gamesByIdsAdd.Input.Headers = .init(), + body: Operations.gamesByIdsAdd.Input.Body + ) { + self.path = path + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/stream/games/{streamId}/add/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/stream/games/{streamId}/add/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.gamesByIdsAdd.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/stream/games/{streamId}/add/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/stream/games/{streamId}/add/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.gamesByIdsAdd.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.gamesByIdsAdd.Output.Ok.Headers = .init(), + body: Operations.gamesByIdsAdd.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The game IDs have been added to the stream. + /// + /// - Remark: Generated from `#/paths//api/stream/games/{streamId}/add/post(gamesByIdsAdd)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.gamesByIdsAdd.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.gamesByIdsAdd.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiAccountPlaying { + internal static let id: Swift.String = "apiAccountPlaying" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/account/playing/GET/query`. + internal struct Query: Sendable, Hashable { + /// Max number of games to fetch + /// + /// - Remark: Generated from `#/paths/api/account/playing/GET/query/nb`. + internal var nb: Swift.Int? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - nb: Max number of games to fetch + internal init(nb: Swift.Int? = nil) { + self.nb = nb + } + } + internal var query: Operations.apiAccountPlaying.Input.Query + /// - Remark: Generated from `#/paths/api/account/playing/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiAccountPlaying.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiAccountPlaying.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiAccountPlaying.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - query: + /// - headers: + internal init( + query: Operations.apiAccountPlaying.Input.Query = .init(), + headers: Operations.apiAccountPlaying.Input.Headers = .init() + ) { + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/account/playing/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/account/playing/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiAccountPlaying.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/account/playing/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/account/playing/GET/responses/200/content/application\/json`. + case json(OpenAPIRuntime.OpenAPIValueContainer) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: OpenAPIRuntime.OpenAPIValueContainer { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiAccountPlaying.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiAccountPlaying.Output.Ok.Headers = .init(), + body: Operations.apiAccountPlaying.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The ongoing games of the logged in user. + /// + /// - Remark: Generated from `#/paths//api/account/playing/get(apiAccountPlaying)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiAccountPlaying.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiAccountPlaying.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum streamGame { + internal static let id: Swift.String = "streamGame" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/stream/game/{id}/GET/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/stream/game/{id}/GET/path/id`. + internal var id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - id: + internal init(id: Swift.String) { + self.id = id + } + } + internal var path: Operations.streamGame.Input.Path + /// - Remark: Generated from `#/paths/api/stream/game/{id}/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.streamGame.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.streamGame.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.streamGame.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.streamGame.Input.Path, + headers: Operations.streamGame.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/stream/game/{id}/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/stream/game/{id}/GET/responses/200/content/application\/x-ndjson`. + case application_x_hyphen_ndjson(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_ndjson`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_ndjson`. + /// - SeeAlso: `.application_x_hyphen_ndjson`. + internal var application_x_hyphen_ndjson: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_ndjson(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.streamGame.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.streamGame.Output.Ok.Body) { + self.body = body + } + } + /// The stream of the game moves. + /// + /// - Remark: Generated from `#/paths//api/stream/game/{id}/get(streamGame)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.streamGame.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.streamGame.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_ndjson + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-ndjson": + self = .application_x_hyphen_ndjson + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_ndjson: + return "application/x-ndjson" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_ndjson + ] + } + } + } + /// 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 enum gameImport { + internal static let id: Swift.String = "gameImport" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/import/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.gameImport.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.gameImport.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.gameImport.Input.Headers + /// - Remark: Generated from `#/paths/api/import/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/import/POST/requestBody/urlEncodedForm`. + internal struct urlEncodedFormPayload: Codable, Hashable, Sendable { + /// The PGN. It can contain only one game. Most standard tags are supported. + /// + /// - Remark: Generated from `#/paths/api/import/POST/requestBody/urlEncodedForm/pgn`. + internal var pgn: Swift.String? + /// Creates a new `urlEncodedFormPayload`. + /// + /// - Parameters: + /// - pgn: The PGN. It can contain only one game. Most standard tags are supported. + internal init(pgn: Swift.String? = nil) { + self.pgn = pgn + } + internal enum CodingKeys: String, CodingKey { + case pgn + } + } + /// - Remark: Generated from `#/paths/api/import/POST/requestBody/content/application\/x-www-form-urlencoded`. + case urlEncodedForm(Operations.gameImport.Input.Body.urlEncodedFormPayload) + } + internal var body: Operations.gameImport.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + /// - body: + internal init( + headers: Operations.gameImport.Input.Headers = .init(), + body: Operations.gameImport.Input.Body + ) { + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/import/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/import/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.gameImport.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/import/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/import/POST/responses/200/content/application\/json`. + case json(OpenAPIRuntime.OpenAPIValueContainer) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: OpenAPIRuntime.OpenAPIValueContainer { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.gameImport.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.gameImport.Output.Ok.Headers = .init(), + body: Operations.gameImport.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The game was successfully imported. + /// + /// - Remark: Generated from `#/paths//api/import/post(gameImport)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.gameImport.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.gameImport.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiImportedGamesUser { + internal static let id: Swift.String = "apiImportedGamesUser" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/games/export/imports/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiImportedGamesUser.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiImportedGamesUser.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiImportedGamesUser.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + internal init(headers: Operations.apiImportedGamesUser.Input.Headers = .init()) { + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/games/export/imports/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/games/export/imports/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiImportedGamesUser.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/games/export/imports/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/games/export/imports/GET/responses/200/content/application\/x-chess-pgn`. + case application_x_hyphen_chess_hyphen_pgn(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_chess_hyphen_pgn`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_chess_hyphen_pgn`. + /// - SeeAlso: `.application_x_hyphen_chess_hyphen_pgn`. + internal var application_x_hyphen_chess_hyphen_pgn: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_chess_hyphen_pgn(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiImportedGamesUser.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiImportedGamesUser.Output.Ok.Headers = .init(), + body: Operations.apiImportedGamesUser.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// Imported games in PGN format + /// + /// - Remark: Generated from `#/paths//api/games/export/imports/get(apiImportedGamesUser)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiImportedGamesUser.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiImportedGamesUser.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_chess_hyphen_pgn + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-chess-pgn": + self = .application_x_hyphen_chess_hyphen_pgn + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_chess_hyphen_pgn: + return "application/x-chess-pgn" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_chess_hyphen_pgn + ] + } + } + } + /// 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 enum tvChannels { + internal static let id: Swift.String = "tvChannels" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tv/channels/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.tvChannels.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.tvChannels.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.tvChannels.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + internal init(headers: Operations.tvChannels.Input.Headers = .init()) { + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tv/channels/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tv/channels/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.tvChannels.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/tv/channels/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tv/channels/GET/responses/200/content/application\/json`. + case json(OpenAPIRuntime.OpenAPIValueContainer) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: OpenAPIRuntime.OpenAPIValueContainer { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.tvChannels.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.tvChannels.Output.Ok.Headers = .init(), + body: Operations.tvChannels.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The list of games being played for each speed and variant. + /// + /// - Remark: Generated from `#/paths//api/tv/channels/get(tvChannels)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.tvChannels.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.tvChannels.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum tvFeed { + internal static let id: Swift.String = "tvFeed" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tv/feed/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.tvFeed.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.tvFeed.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.tvFeed.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + internal init(headers: Operations.tvFeed.Input.Headers = .init()) { + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tv/feed/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tv/feed/GET/responses/200/content/application\/x-ndjson`. + case application_x_hyphen_ndjson(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_ndjson`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_ndjson`. + /// - SeeAlso: `.application_x_hyphen_ndjson`. + internal var application_x_hyphen_ndjson: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_ndjson(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.tvFeed.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.tvFeed.Output.Ok.Body) { + self.body = body + } + } + /// The stream of the current TV game. + /// + /// - Remark: Generated from `#/paths//api/tv/feed/get(tvFeed)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.tvFeed.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.tvFeed.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_ndjson + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-ndjson": + self = .application_x_hyphen_ndjson + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_ndjson: + return "application/x-ndjson" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_ndjson + ] + } + } + } + /// 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 enum tvChannelFeed { + internal static let id: Swift.String = "tvChannelFeed" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tv/{channel}/feed/GET/path`. + internal struct Path: Sendable, Hashable { + /// The name of the channel in camel case. + /// + /// - Remark: Generated from `#/paths/api/tv/{channel}/feed/GET/path/channel`. + internal var channel: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - channel: The name of the channel in camel case. + internal init(channel: Swift.String) { + self.channel = channel + } + } + internal var path: Operations.tvChannelFeed.Input.Path + /// - Remark: Generated from `#/paths/api/tv/{channel}/feed/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.tvChannelFeed.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.tvChannelFeed.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.tvChannelFeed.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.tvChannelFeed.Input.Path, + headers: Operations.tvChannelFeed.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tv/{channel}/feed/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tv/{channel}/feed/GET/responses/200/content/application\/x-ndjson`. + case application_x_hyphen_ndjson(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_ndjson`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_ndjson`. + /// - SeeAlso: `.application_x_hyphen_ndjson`. + internal var application_x_hyphen_ndjson: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_ndjson(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.tvChannelFeed.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.tvChannelFeed.Output.Ok.Body) { + self.body = body + } + } + /// The stream of the current TV game of a TV channel. + /// + /// - Remark: Generated from `#/paths//api/tv/{channel}/feed/get(tvChannelFeed)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.tvChannelFeed.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.tvChannelFeed.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_ndjson + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-ndjson": + self = .application_x_hyphen_ndjson + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_ndjson: + return "application/x-ndjson" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_ndjson + ] + } + } + } + /// 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 enum tvChannelGames { + internal static let id: Swift.String = "tvChannelGames" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tv/{channel}/GET/path`. + internal struct Path: Sendable, Hashable { + /// The name of the channel in camel case. + /// + /// - Remark: Generated from `#/paths/api/tv/{channel}/GET/path/channel`. + internal var channel: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - channel: The name of the channel in camel case. + internal init(channel: Swift.String) { + self.channel = channel + } + } + internal var path: Operations.tvChannelGames.Input.Path + /// - Remark: Generated from `#/paths/api/tv/{channel}/GET/query`. + internal struct Query: Sendable, Hashable { + /// Number of games to fetch. + /// + /// - Remark: Generated from `#/paths/api/tv/{channel}/GET/query/nb`. + internal var nb: Swift.Double? + /// Include the PGN moves. + /// + /// - Remark: Generated from `#/paths/api/tv/{channel}/GET/query/moves`. + internal var moves: Swift.Bool? + /// Include the full PGN within the JSON response, in a `pgn` field. + /// + /// - Remark: Generated from `#/paths/api/tv/{channel}/GET/query/pgnInJson`. + internal var pgnInJson: Swift.Bool? + /// Include the PGN tags. + /// + /// - Remark: Generated from `#/paths/api/tv/{channel}/GET/query/tags`. + internal var tags: Swift.Bool? + /// Include clock status when available. + /// Either as PGN comments: `2. exd5 { [%clk 1:01:27] } e5 { [%clk 1:01:28] }` + /// Or in a `clocks` JSON field, as centisecond integers, depending on the response type. + /// + /// + /// - Remark: Generated from `#/paths/api/tv/{channel}/GET/query/clocks`. + internal var clocks: Swift.Bool? + /// Include the opening name. + /// Example: `[Opening "King's Gambit Accepted, King's Knight Gambit"]` + /// + /// + /// - Remark: Generated from `#/paths/api/tv/{channel}/GET/query/opening`. + internal var opening: Swift.Bool? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - nb: Number of games to fetch. + /// - moves: Include the PGN moves. + /// - pgnInJson: Include the full PGN within the JSON response, in a `pgn` field. + /// - tags: Include the PGN tags. + /// - clocks: Include clock status when available. + /// - opening: Include the opening name. + internal init( + nb: Swift.Double? = nil, + moves: Swift.Bool? = nil, + pgnInJson: Swift.Bool? = nil, + tags: Swift.Bool? = nil, + clocks: Swift.Bool? = nil, + opening: Swift.Bool? = nil + ) { + self.nb = nb + self.moves = moves + self.pgnInJson = pgnInJson + self.tags = tags + self.clocks = clocks + self.opening = opening + } + } + internal var query: Operations.tvChannelGames.Input.Query + /// - Remark: Generated from `#/paths/api/tv/{channel}/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.tvChannelGames.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.tvChannelGames.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.tvChannelGames.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + internal init( + path: Operations.tvChannelGames.Input.Path, + query: Operations.tvChannelGames.Input.Query = .init(), + headers: Operations.tvChannelGames.Input.Headers = .init() + ) { + self.path = path + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tv/{channel}/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tv/{channel}/GET/responses/200/content/application\/x-chess-pgn`. + case application_x_hyphen_chess_hyphen_pgn(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_chess_hyphen_pgn`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_chess_hyphen_pgn`. + /// - SeeAlso: `.application_x_hyphen_chess_hyphen_pgn`. + internal var application_x_hyphen_chess_hyphen_pgn: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_chess_hyphen_pgn(body): + return body + default: + try throwUnexpectedResponseBody( + expectedContent: "application/x-chess-pgn", + body: self + ) + } + } + } + /// - Remark: Generated from `#/paths/api/tv/{channel}/GET/responses/200/content/application\/x-ndjson`. + case application_x_hyphen_ndjson(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_ndjson`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_ndjson`. + /// - SeeAlso: `.application_x_hyphen_ndjson`. + internal var application_x_hyphen_ndjson: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_ndjson(body): + return body + default: + try throwUnexpectedResponseBody( + expectedContent: "application/x-ndjson", + body: self + ) + } + } + } + } + /// Received HTTP response body + internal var body: Operations.tvChannelGames.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.tvChannelGames.Output.Ok.Body) { + self.body = body + } + } + /// The representation of the games. + /// + /// - Remark: Generated from `#/paths//api/tv/{channel}/get(tvChannelGames)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.tvChannelGames.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.tvChannelGames.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_chess_hyphen_pgn + case application_x_hyphen_ndjson + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-chess-pgn": + self = .application_x_hyphen_chess_hyphen_pgn + case "application/x-ndjson": + self = .application_x_hyphen_ndjson + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_chess_hyphen_pgn: + return "application/x-chess-pgn" + case .application_x_hyphen_ndjson: + return "application/x-ndjson" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_chess_hyphen_pgn, + .application_x_hyphen_ndjson + ] + } + } + } + /// 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 enum apiTournament { + internal static let id: Swift.String = "apiTournament" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiTournament.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiTournament.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiTournament.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + internal init(headers: Operations.apiTournament.Input.Headers = .init()) { + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiTournament.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/tournament/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/GET/responses/200/content/application\/json`. + case json(Components.Schemas.ArenaTournaments) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.ArenaTournaments { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiTournament.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiTournament.Output.Ok.Headers = .init(), + body: Operations.apiTournament.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The list of current tournaments. + /// + /// - Remark: Generated from `#/paths//api/tournament/get(apiTournament)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiTournament.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiTournament.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiTournamentPost { + internal static let id: Swift.String = "apiTournamentPost" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiTournamentPost.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiTournamentPost.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiTournamentPost.Input.Headers + /// - Remark: Generated from `#/paths/api/tournament/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/POST/requestBody/urlEncodedForm`. + internal struct urlEncodedFormPayload: Codable, Hashable, Sendable { + /// The tournament name. Leave empty to get a random Grandmaster name + /// + /// - Remark: Generated from `#/paths/api/tournament/POST/requestBody/urlEncodedForm/name`. + internal var name: Swift.String? + /// Clock initial time in minutes + /// + /// - Remark: Generated from `#/paths/api/tournament/POST/requestBody/urlEncodedForm/clockTime`. + internal var clockTime: Swift.Double + /// Clock increment in seconds + /// + /// - Remark: Generated from `#/paths/api/tournament/POST/requestBody/urlEncodedForm/clockIncrement`. + @frozen internal enum clockIncrementPayload: Int, Codable, Hashable, Sendable { + case _0 = 0 + case _1 = 1 + case _2 = 2 + case _3 = 3 + case _4 = 4 + case _5 = 5 + case _6 = 6 + case _7 = 7 + case _10 = 10 + case _15 = 15 + case _20 = 20 + case _25 = 25 + case _30 = 30 + case _40 = 40 + case _50 = 50 + case _60 = 60 + } + /// Clock increment in seconds + /// + /// - Remark: Generated from `#/paths/api/tournament/POST/requestBody/urlEncodedForm/clockIncrement`. + internal var clockIncrement: Operations.apiTournamentPost.Input.Body.urlEncodedFormPayload.clockIncrementPayload + /// How long the tournament lasts, in minutes + /// + /// - Remark: Generated from `#/paths/api/tournament/POST/requestBody/urlEncodedForm/minutes`. + @frozen internal enum minutesPayload: Int, Codable, Hashable, Sendable { + case _20 = 20 + case _25 = 25 + case _30 = 30 + case _35 = 35 + case _40 = 40 + case _45 = 45 + case _50 = 50 + case _55 = 55 + case _60 = 60 + case _70 = 70 + case _80 = 80 + case _90 = 90 + case _100 = 100 + case _110 = 110 + case _120 = 120 + case _150 = 150 + case _180 = 180 + case _210 = 210 + case _240 = 240 + case _270 = 270 + case _300 = 300 + case _330 = 330 + case _360 = 360 + case _420 = 420 + case _480 = 480 + case _540 = 540 + case _600 = 600 + case _720 = 720 + } + /// How long the tournament lasts, in minutes + /// + /// - Remark: Generated from `#/paths/api/tournament/POST/requestBody/urlEncodedForm/minutes`. + internal var minutes: Operations.apiTournamentPost.Input.Body.urlEncodedFormPayload.minutesPayload + /// How long to wait before starting the tournament, from now, in minutes + /// + /// - Remark: Generated from `#/paths/api/tournament/POST/requestBody/urlEncodedForm/waitMinutes`. + @frozen internal enum waitMinutesPayload: Int, Codable, Hashable, Sendable { + case _1 = 1 + case _2 = 2 + case _3 = 3 + case _5 = 5 + case _10 = 10 + case _15 = 15 + case _20 = 20 + case _30 = 30 + case _45 = 45 + case _60 = 60 + } + /// How long to wait before starting the tournament, from now, in minutes + /// + /// - Remark: Generated from `#/paths/api/tournament/POST/requestBody/urlEncodedForm/waitMinutes`. + internal var waitMinutes: Operations.apiTournamentPost.Input.Body.urlEncodedFormPayload.waitMinutesPayload? + /// Timestamp (in milliseconds) to start the tournament at a given date and time. Overrides the `waitMinutes` setting + /// + /// - Remark: Generated from `#/paths/api/tournament/POST/requestBody/urlEncodedForm/startDate`. + internal var startDate: Swift.Int? + /// - Remark: Generated from `#/paths/api/tournament/POST/requestBody/urlEncodedForm/variant`. + internal var variant: Components.Schemas.VariantKey? + /// Games are rated and impact players ratings + /// + /// - Remark: Generated from `#/paths/api/tournament/POST/requestBody/urlEncodedForm/rated`. + internal var rated: Swift.Bool? + /// - Remark: Generated from `#/paths/api/tournament/POST/requestBody/urlEncodedForm/position`. + internal var position: Components.Schemas.FromPositionFEN? + /// Whether the players can use berserk. Only allowed if clockIncrement <= clockTime * 2 + /// + /// - Remark: Generated from `#/paths/api/tournament/POST/requestBody/urlEncodedForm/berserkable`. + internal var berserkable: Swift.Bool? + /// After 2 wins, consecutive wins grant 4 points instead of 2. + /// + /// - Remark: Generated from `#/paths/api/tournament/POST/requestBody/urlEncodedForm/streakable`. + internal var streakable: Swift.Bool? + /// Whether the players can discuss in a chat + /// + /// - Remark: Generated from `#/paths/api/tournament/POST/requestBody/urlEncodedForm/hasChat`. + internal var hasChat: Swift.Bool? + /// Anything you want to tell players about the tournament + /// + /// - Remark: Generated from `#/paths/api/tournament/POST/requestBody/urlEncodedForm/description`. + internal var description: Swift.String? + /// Make the tournament private, and restrict access with a password. + /// You can also [generate user-specific entry codes](https://github.com/lichess-org/api/tree/master/example/tournament-entry-code) + /// based on this password. + /// + /// + /// - Remark: Generated from `#/paths/api/tournament/POST/requestBody/urlEncodedForm/password`. + internal var password: Swift.String? + /// Set the ID of a team you lead to create a team battle. + /// The other teams can be added using the [team battle edit endpoint](#operation/apiTournamentTeamBattlePost). + /// + /// + /// - Remark: Generated from `#/paths/api/tournament/POST/requestBody/urlEncodedForm/teamBattleByTeam`. + internal var teamBattleByTeam: Swift.String? + /// Restrict entry to members of a team. + /// The teamId is the last part of a team URL, e.g. `https://lichess.org/team/coders` has teamId = `coders`. + /// Leave empty to let everyone join the tournament. + /// Do not use this to create team battles, use `teamBattleByTeam` instead. + /// + /// + /// - Remark: Generated from `#/paths/api/tournament/POST/requestBody/urlEncodedForm/conditions.teamMember.teamId`. + internal var conditions_period_teamMember_period_teamId: Swift.String? + /// Minimum rating to join. Leave empty to let everyone join the tournament. + /// + /// - Remark: Generated from `#/paths/api/tournament/POST/requestBody/urlEncodedForm/conditions.minRating.rating`. + @frozen internal enum conditions_period_minRating_period_ratingPayload: Int, Codable, Hashable, Sendable { + case _1000 = 1000 + case _1100 = 1100 + case _1200 = 1200 + case _1300 = 1300 + case _1400 = 1400 + case _1500 = 1500 + case _1600 = 1600 + case _1700 = 1700 + case _1800 = 1800 + case _1900 = 1900 + case _2000 = 2000 + case _2100 = 2100 + case _2200 = 2200 + case _2300 = 2300 + case _2400 = 2400 + case _2500 = 2500 + case _2600 = 2600 + } + /// Minimum rating to join. Leave empty to let everyone join the tournament. + /// + /// - Remark: Generated from `#/paths/api/tournament/POST/requestBody/urlEncodedForm/conditions.minRating.rating`. + internal var conditions_period_minRating_period_rating: Operations.apiTournamentPost.Input.Body.urlEncodedFormPayload.conditions_period_minRating_period_ratingPayload? + /// Maximum rating to join. Based on best rating reached in the last 7 days. Leave empty to let everyone join the tournament. + /// + /// - Remark: Generated from `#/paths/api/tournament/POST/requestBody/urlEncodedForm/conditions.maxRating.rating`. + @frozen internal enum conditions_period_maxRating_period_ratingPayload: Int, Codable, Hashable, Sendable { + case _2200 = 2200 + case _2100 = 2100 + case _2000 = 2000 + case _1900 = 1900 + case _1800 = 1800 + case _1700 = 1700 + case _1600 = 1600 + case _1500 = 1500 + case _1400 = 1400 + case _1300 = 1300 + case _1200 = 1200 + case _1100 = 1100 + case _1000 = 1000 + case _900 = 900 + case _800 = 800 + } + /// Maximum rating to join. Based on best rating reached in the last 7 days. Leave empty to let everyone join the tournament. + /// + /// - Remark: Generated from `#/paths/api/tournament/POST/requestBody/urlEncodedForm/conditions.maxRating.rating`. + internal var conditions_period_maxRating_period_rating: Operations.apiTournamentPost.Input.Body.urlEncodedFormPayload.conditions_period_maxRating_period_ratingPayload? + /// Minimum number of rated games required to join. + /// + /// - Remark: Generated from `#/paths/api/tournament/POST/requestBody/urlEncodedForm/conditions.nbRatedGame.nb`. + @frozen internal enum conditions_period_nbRatedGame_period_nbPayload: Int, Codable, Hashable, Sendable { + case _0 = 0 + case _5 = 5 + case _10 = 10 + case _15 = 15 + case _20 = 20 + case _30 = 30 + case _40 = 40 + case _50 = 50 + case _75 = 75 + case _100 = 100 + case _150 = 150 + case _200 = 200 + } + /// Minimum number of rated games required to join. + /// + /// - Remark: Generated from `#/paths/api/tournament/POST/requestBody/urlEncodedForm/conditions.nbRatedGame.nb`. + internal var conditions_period_nbRatedGame_period_nb: Operations.apiTournamentPost.Input.Body.urlEncodedFormPayload.conditions_period_nbRatedGame_period_nbPayload? + /// Predefined list of usernames that are allowed to join, separated by commas. + /// If this list is non-empty, then usernames absent from this list will be forbidden to join. + /// Adding `%titled` to the list additionally allows any titled player to join. + /// Example: `thibault,german11,%titled` + /// + /// + /// - Remark: Generated from `#/paths/api/tournament/POST/requestBody/urlEncodedForm/conditions.allowList`. + internal var conditions_period_allowList: Swift.String? + /// Creates a new `urlEncodedFormPayload`. + /// + /// - Parameters: + /// - name: The tournament name. Leave empty to get a random Grandmaster name + /// - clockTime: Clock initial time in minutes + /// - clockIncrement: Clock increment in seconds + /// - minutes: How long the tournament lasts, in minutes + /// - waitMinutes: How long to wait before starting the tournament, from now, in minutes + /// - startDate: Timestamp (in milliseconds) to start the tournament at a given date and time. Overrides the `waitMinutes` setting + /// - variant: + /// - rated: Games are rated and impact players ratings + /// - position: + /// - berserkable: Whether the players can use berserk. Only allowed if clockIncrement <= clockTime * 2 + /// - streakable: After 2 wins, consecutive wins grant 4 points instead of 2. + /// - hasChat: Whether the players can discuss in a chat + /// - description: Anything you want to tell players about the tournament + /// - password: Make the tournament private, and restrict access with a password. + /// - teamBattleByTeam: Set the ID of a team you lead to create a team battle. + /// - conditions_period_teamMember_period_teamId: Restrict entry to members of a team. + /// - conditions_period_minRating_period_rating: Minimum rating to join. Leave empty to let everyone join the tournament. + /// - conditions_period_maxRating_period_rating: Maximum rating to join. Based on best rating reached in the last 7 days. Leave empty to let everyone join the tournament. + /// - conditions_period_nbRatedGame_period_nb: Minimum number of rated games required to join. + /// - conditions_period_allowList: Predefined list of usernames that are allowed to join, separated by commas. + internal init( + name: Swift.String? = nil, + clockTime: Swift.Double, + clockIncrement: Operations.apiTournamentPost.Input.Body.urlEncodedFormPayload.clockIncrementPayload, + minutes: Operations.apiTournamentPost.Input.Body.urlEncodedFormPayload.minutesPayload, + waitMinutes: Operations.apiTournamentPost.Input.Body.urlEncodedFormPayload.waitMinutesPayload? = nil, + startDate: Swift.Int? = nil, + variant: Components.Schemas.VariantKey? = nil, + rated: Swift.Bool? = nil, + position: Components.Schemas.FromPositionFEN? = nil, + berserkable: Swift.Bool? = nil, + streakable: Swift.Bool? = nil, + hasChat: Swift.Bool? = nil, + description: Swift.String? = nil, + password: Swift.String? = nil, + teamBattleByTeam: Swift.String? = nil, + conditions_period_teamMember_period_teamId: Swift.String? = nil, + conditions_period_minRating_period_rating: Operations.apiTournamentPost.Input.Body.urlEncodedFormPayload.conditions_period_minRating_period_ratingPayload? = nil, + conditions_period_maxRating_period_rating: Operations.apiTournamentPost.Input.Body.urlEncodedFormPayload.conditions_period_maxRating_period_ratingPayload? = nil, + conditions_period_nbRatedGame_period_nb: Operations.apiTournamentPost.Input.Body.urlEncodedFormPayload.conditions_period_nbRatedGame_period_nbPayload? = nil, + conditions_period_allowList: Swift.String? = nil + ) { + self.name = name + self.clockTime = clockTime + self.clockIncrement = clockIncrement + self.minutes = minutes + self.waitMinutes = waitMinutes + self.startDate = startDate + self.variant = variant + self.rated = rated + self.position = position + self.berserkable = berserkable + self.streakable = streakable + self.hasChat = hasChat + self.description = description + self.password = password + self.teamBattleByTeam = teamBattleByTeam + self.conditions_period_teamMember_period_teamId = conditions_period_teamMember_period_teamId + self.conditions_period_minRating_period_rating = conditions_period_minRating_period_rating + self.conditions_period_maxRating_period_rating = conditions_period_maxRating_period_rating + self.conditions_period_nbRatedGame_period_nb = conditions_period_nbRatedGame_period_nb + self.conditions_period_allowList = conditions_period_allowList + } + internal enum CodingKeys: String, CodingKey { + case name + case clockTime + case clockIncrement + case minutes + case waitMinutes + case startDate + case variant + case rated + case position + case berserkable + case streakable + case hasChat + case description + case password + case teamBattleByTeam + case conditions_period_teamMember_period_teamId = "conditions.teamMember.teamId" + case conditions_period_minRating_period_rating = "conditions.minRating.rating" + case conditions_period_maxRating_period_rating = "conditions.maxRating.rating" + case conditions_period_nbRatedGame_period_nb = "conditions.nbRatedGame.nb" + case conditions_period_allowList = "conditions.allowList" + } + } + /// - Remark: Generated from `#/paths/api/tournament/POST/requestBody/content/application\/x-www-form-urlencoded`. + case urlEncodedForm(Operations.apiTournamentPost.Input.Body.urlEncodedFormPayload) + } + internal var body: Operations.apiTournamentPost.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + /// - body: + internal init( + headers: Operations.apiTournamentPost.Input.Headers = .init(), + body: Operations.apiTournamentPost.Input.Body + ) { + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiTournamentPost.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/tournament/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/POST/responses/200/content/application\/json`. + case json(Components.Schemas.ArenaTournamentVariantIsKey) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.ArenaTournamentVariantIsKey { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiTournamentPost.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiTournamentPost.Output.Ok.Headers = .init(), + body: Operations.apiTournamentPost.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The Arena tournament has been successfully created. + /// + /// - Remark: Generated from `#/paths//api/tournament/post(apiTournamentPost)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiTournamentPost.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiTournamentPost.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiTournamentPost.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.apiTournamentPost.Output.BadRequest.Body) { + self.body = body + } + } + /// The creation of the Arena tournament failed. + /// + /// - Remark: Generated from `#/paths//api/tournament/post(apiTournamentPost)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.apiTournamentPost.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.apiTournamentPost.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum tournament { + internal static let id: Swift.String = "tournament" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/GET/path`. + internal struct Path: Sendable, Hashable { + /// The tournament ID. + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/GET/path/id`. + internal var id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - id: The tournament ID. + internal init(id: Swift.String) { + self.id = id + } + } + internal var path: Operations.tournament.Input.Path + /// - Remark: Generated from `#/paths/api/tournament/{id}/GET/query`. + internal struct Query: Sendable, Hashable { + /// Specify which page of player standings to view. + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/GET/query/page`. + internal var page: Swift.Double? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - page: Specify which page of player standings to view. + internal init(page: Swift.Double? = nil) { + self.page = page + } + } + internal var query: Operations.tournament.Input.Query + /// - Remark: Generated from `#/paths/api/tournament/{id}/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.tournament.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.tournament.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.tournament.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + internal init( + path: Operations.tournament.Input.Path, + query: Operations.tournament.Input.Query = .init(), + headers: Operations.tournament.Input.Headers = .init() + ) { + self.path = path + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.tournament.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/tournament/{id}/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/GET/responses/200/content/application\/json`. + case json(Components.Schemas.ArenaTournamentVariantIsKey) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.ArenaTournamentVariantIsKey { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.tournament.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.tournament.Output.Ok.Headers = .init(), + body: Operations.tournament.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The information of the Arena tournament. + /// + /// - Remark: Generated from `#/paths//api/tournament/{id}/get(tournament)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.tournament.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.tournament.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiTournamentUpdate { + internal static let id: Swift.String = "apiTournamentUpdate" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/path`. + internal struct Path: Sendable, Hashable { + /// The tournament ID. + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/path/id`. + internal var id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - id: The tournament ID. + internal init(id: Swift.String) { + self.id = id + } + } + internal var path: Operations.apiTournamentUpdate.Input.Path + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiTournamentUpdate.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiTournamentUpdate.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiTournamentUpdate.Input.Headers + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/requestBody/urlEncodedForm`. + internal struct urlEncodedFormPayload: Codable, Hashable, Sendable { + /// The tournament name. Leave empty to get a random Grandmaster name + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/requestBody/urlEncodedForm/name`. + internal var name: Swift.String? + /// Clock initial time in minutes + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/requestBody/urlEncodedForm/clockTime`. + internal var clockTime: Swift.Double + /// Clock increment in seconds + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/requestBody/urlEncodedForm/clockIncrement`. + @frozen internal enum clockIncrementPayload: Int, Codable, Hashable, Sendable { + case _0 = 0 + case _1 = 1 + case _2 = 2 + case _3 = 3 + case _4 = 4 + case _5 = 5 + case _6 = 6 + case _7 = 7 + case _10 = 10 + case _15 = 15 + case _20 = 20 + case _25 = 25 + case _30 = 30 + case _40 = 40 + case _50 = 50 + case _60 = 60 + } + /// Clock increment in seconds + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/requestBody/urlEncodedForm/clockIncrement`. + internal var clockIncrement: Operations.apiTournamentUpdate.Input.Body.urlEncodedFormPayload.clockIncrementPayload + /// How long the tournament lasts, in minutes + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/requestBody/urlEncodedForm/minutes`. + @frozen internal enum minutesPayload: Int, Codable, Hashable, Sendable { + case _20 = 20 + case _25 = 25 + case _30 = 30 + case _35 = 35 + case _40 = 40 + case _45 = 45 + case _50 = 50 + case _55 = 55 + case _60 = 60 + case _70 = 70 + case _80 = 80 + case _90 = 90 + case _100 = 100 + case _110 = 110 + case _120 = 120 + case _150 = 150 + case _180 = 180 + case _210 = 210 + case _240 = 240 + case _270 = 270 + case _300 = 300 + case _330 = 330 + case _360 = 360 + case _420 = 420 + case _480 = 480 + case _540 = 540 + case _600 = 600 + case _720 = 720 + } + /// How long the tournament lasts, in minutes + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/requestBody/urlEncodedForm/minutes`. + internal var minutes: Operations.apiTournamentUpdate.Input.Body.urlEncodedFormPayload.minutesPayload + /// How long to wait before starting the tournament, from now, in minutes + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/requestBody/urlEncodedForm/waitMinutes`. + @frozen internal enum waitMinutesPayload: Int, Codable, Hashable, Sendable { + case _1 = 1 + case _2 = 2 + case _3 = 3 + case _5 = 5 + case _10 = 10 + case _15 = 15 + case _20 = 20 + case _30 = 30 + case _45 = 45 + case _60 = 60 + } + /// How long to wait before starting the tournament, from now, in minutes + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/requestBody/urlEncodedForm/waitMinutes`. + internal var waitMinutes: Operations.apiTournamentUpdate.Input.Body.urlEncodedFormPayload.waitMinutesPayload? + /// Timestamp (in milliseconds) to start the tournament at a given date and time. Overrides the `waitMinutes` setting + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/requestBody/urlEncodedForm/startDate`. + internal var startDate: Swift.Int? + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/requestBody/urlEncodedForm/variant`. + internal var variant: Components.Schemas.VariantKey? + /// Games are rated and impact players ratings + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/requestBody/urlEncodedForm/rated`. + internal var rated: Swift.Bool? + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/requestBody/urlEncodedForm/position`. + internal var position: Components.Schemas.FromPositionFEN? + /// Whether the players can use berserk. Only allowed if clockIncrement <= clockTime * 2 + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/requestBody/urlEncodedForm/berserkable`. + internal var berserkable: Swift.Bool? + /// After 2 wins, consecutive wins grant 4 points instead of 2. + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/requestBody/urlEncodedForm/streakable`. + internal var streakable: Swift.Bool? + /// Whether the players can discuss in a chat + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/requestBody/urlEncodedForm/hasChat`. + internal var hasChat: Swift.Bool? + /// Anything you want to tell players about the tournament + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/requestBody/urlEncodedForm/description`. + internal var description: Swift.String? + /// Make the tournament private, and restrict access with a password + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/requestBody/urlEncodedForm/password`. + internal var password: Swift.String? + /// Minimum rating to join. Leave empty to let everyone join the tournament. + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/requestBody/urlEncodedForm/conditions.minRating.rating`. + @frozen internal enum conditions_period_minRating_period_ratingPayload: Int, Codable, Hashable, Sendable { + case _1000 = 1000 + case _1100 = 1100 + case _1200 = 1200 + case _1300 = 1300 + case _1400 = 1400 + case _1500 = 1500 + case _1600 = 1600 + case _1700 = 1700 + case _1800 = 1800 + case _1900 = 1900 + case _2000 = 2000 + case _2100 = 2100 + case _2200 = 2200 + case _2300 = 2300 + case _2400 = 2400 + case _2500 = 2500 + case _2600 = 2600 + } + /// Minimum rating to join. Leave empty to let everyone join the tournament. + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/requestBody/urlEncodedForm/conditions.minRating.rating`. + internal var conditions_period_minRating_period_rating: Operations.apiTournamentUpdate.Input.Body.urlEncodedFormPayload.conditions_period_minRating_period_ratingPayload? + /// Maximum rating to join. Based on best rating reached in the last 7 days. Leave empty to let everyone join the tournament. + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/requestBody/urlEncodedForm/conditions.maxRating.rating`. + @frozen internal enum conditions_period_maxRating_period_ratingPayload: Int, Codable, Hashable, Sendable { + case _2200 = 2200 + case _2100 = 2100 + case _2000 = 2000 + case _1900 = 1900 + case _1800 = 1800 + case _1700 = 1700 + case _1600 = 1600 + case _1500 = 1500 + case _1400 = 1400 + case _1300 = 1300 + case _1200 = 1200 + case _1100 = 1100 + case _1000 = 1000 + case _900 = 900 + case _800 = 800 + } + /// Maximum rating to join. Based on best rating reached in the last 7 days. Leave empty to let everyone join the tournament. + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/requestBody/urlEncodedForm/conditions.maxRating.rating`. + internal var conditions_period_maxRating_period_rating: Operations.apiTournamentUpdate.Input.Body.urlEncodedFormPayload.conditions_period_maxRating_period_ratingPayload? + /// Minimum number of rated games required to join. + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/requestBody/urlEncodedForm/conditions.nbRatedGame.nb`. + @frozen internal enum conditions_period_nbRatedGame_period_nbPayload: Int, Codable, Hashable, Sendable { + case _0 = 0 + case _5 = 5 + case _10 = 10 + case _15 = 15 + case _20 = 20 + case _30 = 30 + case _40 = 40 + case _50 = 50 + case _75 = 75 + case _100 = 100 + case _150 = 150 + case _200 = 200 + } + /// Minimum number of rated games required to join. + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/requestBody/urlEncodedForm/conditions.nbRatedGame.nb`. + internal var conditions_period_nbRatedGame_period_nb: Operations.apiTournamentUpdate.Input.Body.urlEncodedFormPayload.conditions_period_nbRatedGame_period_nbPayload? + /// Predefined list of usernames that are allowed to join, separated by commas. + /// If this list is non-empty, then usernames absent from this list will be forbidden to join. + /// Adding `%titled` to the list additionally allows any titled player to join. + /// Example: `thibault,german11,%titled` + /// + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/requestBody/urlEncodedForm/conditions.allowList`. + internal var conditions_period_allowList: Swift.String? + /// Creates a new `urlEncodedFormPayload`. + /// + /// - Parameters: + /// - name: The tournament name. Leave empty to get a random Grandmaster name + /// - clockTime: Clock initial time in minutes + /// - clockIncrement: Clock increment in seconds + /// - minutes: How long the tournament lasts, in minutes + /// - waitMinutes: How long to wait before starting the tournament, from now, in minutes + /// - startDate: Timestamp (in milliseconds) to start the tournament at a given date and time. Overrides the `waitMinutes` setting + /// - variant: + /// - rated: Games are rated and impact players ratings + /// - position: + /// - berserkable: Whether the players can use berserk. Only allowed if clockIncrement <= clockTime * 2 + /// - streakable: After 2 wins, consecutive wins grant 4 points instead of 2. + /// - hasChat: Whether the players can discuss in a chat + /// - description: Anything you want to tell players about the tournament + /// - password: Make the tournament private, and restrict access with a password + /// - conditions_period_minRating_period_rating: Minimum rating to join. Leave empty to let everyone join the tournament. + /// - conditions_period_maxRating_period_rating: Maximum rating to join. Based on best rating reached in the last 7 days. Leave empty to let everyone join the tournament. + /// - conditions_period_nbRatedGame_period_nb: Minimum number of rated games required to join. + /// - conditions_period_allowList: Predefined list of usernames that are allowed to join, separated by commas. + internal init( + name: Swift.String? = nil, + clockTime: Swift.Double, + clockIncrement: Operations.apiTournamentUpdate.Input.Body.urlEncodedFormPayload.clockIncrementPayload, + minutes: Operations.apiTournamentUpdate.Input.Body.urlEncodedFormPayload.minutesPayload, + waitMinutes: Operations.apiTournamentUpdate.Input.Body.urlEncodedFormPayload.waitMinutesPayload? = nil, + startDate: Swift.Int? = nil, + variant: Components.Schemas.VariantKey? = nil, + rated: Swift.Bool? = nil, + position: Components.Schemas.FromPositionFEN? = nil, + berserkable: Swift.Bool? = nil, + streakable: Swift.Bool? = nil, + hasChat: Swift.Bool? = nil, + description: Swift.String? = nil, + password: Swift.String? = nil, + conditions_period_minRating_period_rating: Operations.apiTournamentUpdate.Input.Body.urlEncodedFormPayload.conditions_period_minRating_period_ratingPayload? = nil, + conditions_period_maxRating_period_rating: Operations.apiTournamentUpdate.Input.Body.urlEncodedFormPayload.conditions_period_maxRating_period_ratingPayload? = nil, + conditions_period_nbRatedGame_period_nb: Operations.apiTournamentUpdate.Input.Body.urlEncodedFormPayload.conditions_period_nbRatedGame_period_nbPayload? = nil, + conditions_period_allowList: Swift.String? = nil + ) { + self.name = name + self.clockTime = clockTime + self.clockIncrement = clockIncrement + self.minutes = minutes + self.waitMinutes = waitMinutes + self.startDate = startDate + self.variant = variant + self.rated = rated + self.position = position + self.berserkable = berserkable + self.streakable = streakable + self.hasChat = hasChat + self.description = description + self.password = password + self.conditions_period_minRating_period_rating = conditions_period_minRating_period_rating + self.conditions_period_maxRating_period_rating = conditions_period_maxRating_period_rating + self.conditions_period_nbRatedGame_period_nb = conditions_period_nbRatedGame_period_nb + self.conditions_period_allowList = conditions_period_allowList + } + internal enum CodingKeys: String, CodingKey { + case name + case clockTime + case clockIncrement + case minutes + case waitMinutes + case startDate + case variant + case rated + case position + case berserkable + case streakable + case hasChat + case description + case password + case conditions_period_minRating_period_rating = "conditions.minRating.rating" + case conditions_period_maxRating_period_rating = "conditions.maxRating.rating" + case conditions_period_nbRatedGame_period_nb = "conditions.nbRatedGame.nb" + case conditions_period_allowList = "conditions.allowList" + } + } + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/requestBody/content/application\/x-www-form-urlencoded`. + case urlEncodedForm(Operations.apiTournamentUpdate.Input.Body.urlEncodedFormPayload) + } + internal var body: Operations.apiTournamentUpdate.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + /// - body: + internal init( + path: Operations.apiTournamentUpdate.Input.Path, + headers: Operations.apiTournamentUpdate.Input.Headers = .init(), + body: Operations.apiTournamentUpdate.Input.Body + ) { + self.path = path + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiTournamentUpdate.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/responses/200/content/application\/json`. + case json(Components.Schemas.ArenaTournamentVariantIsKey) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.ArenaTournamentVariantIsKey { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiTournamentUpdate.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiTournamentUpdate.Output.Ok.Headers = .init(), + body: Operations.apiTournamentUpdate.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The Arena tournament was successfully updated. + /// + /// - Remark: Generated from `#/paths//api/tournament/{id}/post(apiTournamentUpdate)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiTournamentUpdate.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiTournamentUpdate.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiTournamentUpdate.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.apiTournamentUpdate.Output.BadRequest.Body) { + self.body = body + } + } + /// The update of the Arena tournament failed. + /// + /// - Remark: Generated from `#/paths//api/tournament/{id}/post(apiTournamentUpdate)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.apiTournamentUpdate.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.apiTournamentUpdate.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiTournamentJoin { + internal static let id: Swift.String = "apiTournamentJoin" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/join/POST/path`. + internal struct Path: Sendable, Hashable { + /// The tournament ID. + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/join/POST/path/id`. + internal var id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - id: The tournament ID. + internal init(id: Swift.String) { + self.id = id + } + } + internal var path: Operations.apiTournamentJoin.Input.Path + /// - Remark: Generated from `#/paths/api/tournament/{id}/join/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiTournamentJoin.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiTournamentJoin.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiTournamentJoin.Input.Headers + /// - Remark: Generated from `#/paths/api/tournament/{id}/join/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/join/POST/requestBody/urlEncodedForm`. + internal struct urlEncodedFormPayload: Codable, Hashable, Sendable { + /// The tournament password, if one is required. + /// Can also be a [user-specific entry code](https://github.com/lichess-org/api/tree/master/example/tournament-entry-code) + /// generated and shared by the organizer. + /// + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/join/POST/requestBody/urlEncodedForm/password`. + internal var password: Swift.String? + /// The team to join the tournament with, for team battle tournaments + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/join/POST/requestBody/urlEncodedForm/team`. + internal var team: Swift.String? + /// If the tournament is started, attempt to pair the user, + /// even if they are not connected to the tournament page. + /// This expires after one minute, to avoid pairing a user who is long gone. + /// You may call "join" again to extend the waiting. + /// + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/join/POST/requestBody/urlEncodedForm/pairMeAsap`. + internal var pairMeAsap: Swift.Bool? + /// Creates a new `urlEncodedFormPayload`. + /// + /// - Parameters: + /// - password: The tournament password, if one is required. + /// - team: The team to join the tournament with, for team battle tournaments + /// - pairMeAsap: If the tournament is started, attempt to pair the user, + internal init( + password: Swift.String? = nil, + team: Swift.String? = nil, + pairMeAsap: Swift.Bool? = nil + ) { + self.password = password + self.team = team + self.pairMeAsap = pairMeAsap + } + internal enum CodingKeys: String, CodingKey { + case password + case team + case pairMeAsap + } + } + /// - Remark: Generated from `#/paths/api/tournament/{id}/join/POST/requestBody/content/application\/x-www-form-urlencoded`. + case urlEncodedForm(Operations.apiTournamentJoin.Input.Body.urlEncodedFormPayload) + } + internal var body: Operations.apiTournamentJoin.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + /// - body: + internal init( + path: Operations.apiTournamentJoin.Input.Path, + headers: Operations.apiTournamentJoin.Input.Headers = .init(), + body: Operations.apiTournamentJoin.Input.Body + ) { + self.path = path + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/join/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/join/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiTournamentJoin.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/tournament/{id}/join/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/join/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiTournamentJoin.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiTournamentJoin.Output.Ok.Headers = .init(), + body: Operations.apiTournamentJoin.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The tournament was successfully joined. + /// + /// - Remark: Generated from `#/paths//api/tournament/{id}/join/post(apiTournamentJoin)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiTournamentJoin.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiTournamentJoin.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/join/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/join/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiTournamentJoin.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.apiTournamentJoin.Output.BadRequest.Body) { + self.body = body + } + } + /// Joining the tournament failed. + /// + /// - Remark: Generated from `#/paths//api/tournament/{id}/join/post(apiTournamentJoin)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.apiTournamentJoin.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.apiTournamentJoin.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiTournamentWithdraw { + internal static let id: Swift.String = "apiTournamentWithdraw" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/withdraw/POST/path`. + internal struct Path: Sendable, Hashable { + /// The tournament ID. + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/withdraw/POST/path/id`. + internal var id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - id: The tournament ID. + internal init(id: Swift.String) { + self.id = id + } + } + internal var path: Operations.apiTournamentWithdraw.Input.Path + /// - Remark: Generated from `#/paths/api/tournament/{id}/withdraw/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiTournamentWithdraw.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiTournamentWithdraw.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiTournamentWithdraw.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.apiTournamentWithdraw.Input.Path, + headers: Operations.apiTournamentWithdraw.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/withdraw/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/withdraw/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiTournamentWithdraw.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/tournament/{id}/withdraw/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/withdraw/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiTournamentWithdraw.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiTournamentWithdraw.Output.Ok.Headers = .init(), + body: Operations.apiTournamentWithdraw.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The tournament was successfully paused or left. + /// + /// - Remark: Generated from `#/paths//api/tournament/{id}/withdraw/post(apiTournamentWithdraw)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiTournamentWithdraw.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiTournamentWithdraw.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/withdraw/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/withdraw/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiTournamentWithdraw.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.apiTournamentWithdraw.Output.BadRequest.Body) { + self.body = body + } + } + /// Pausing/leaving the tournament failed. + /// + /// - Remark: Generated from `#/paths//api/tournament/{id}/withdraw/post(apiTournamentWithdraw)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.apiTournamentWithdraw.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.apiTournamentWithdraw.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiTournamentTerminate { + internal static let id: Swift.String = "apiTournamentTerminate" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/terminate/POST/path`. + internal struct Path: Sendable, Hashable { + /// The tournament ID. + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/terminate/POST/path/id`. + internal var id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - id: The tournament ID. + internal init(id: Swift.String) { + self.id = id + } + } + internal var path: Operations.apiTournamentTerminate.Input.Path + /// - Remark: Generated from `#/paths/api/tournament/{id}/terminate/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiTournamentTerminate.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiTournamentTerminate.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiTournamentTerminate.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.apiTournamentTerminate.Input.Path, + headers: Operations.apiTournamentTerminate.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/terminate/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/terminate/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiTournamentTerminate.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/tournament/{id}/terminate/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/terminate/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiTournamentTerminate.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiTournamentTerminate.Output.Ok.Headers = .init(), + body: Operations.apiTournamentTerminate.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The tournament was successfully terminated. + /// + /// - Remark: Generated from `#/paths//api/tournament/{id}/terminate/post(apiTournamentTerminate)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiTournamentTerminate.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiTournamentTerminate.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/terminate/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/terminate/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiTournamentTerminate.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.apiTournamentTerminate.Output.BadRequest.Body) { + self.body = body + } + } + /// Terminating the tournament failed. + /// + /// - Remark: Generated from `#/paths//api/tournament/{id}/terminate/post(apiTournamentTerminate)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.apiTournamentTerminate.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.apiTournamentTerminate.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiTournamentTeamBattlePost { + internal static let id: Swift.String = "apiTournamentTeamBattlePost" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/team-battle/{id}/POST/path`. + internal struct Path: Sendable, Hashable { + /// The tournament ID (8 characters).. + /// + /// - Remark: Generated from `#/paths/api/tournament/team-battle/{id}/POST/path/id`. + internal var id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - id: The tournament ID (8 characters).. + internal init(id: Swift.String) { + self.id = id + } + } + internal var path: Operations.apiTournamentTeamBattlePost.Input.Path + /// - Remark: Generated from `#/paths/api/tournament/team-battle/{id}/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiTournamentTeamBattlePost.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiTournamentTeamBattlePost.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiTournamentTeamBattlePost.Input.Headers + /// - Remark: Generated from `#/paths/api/tournament/team-battle/{id}/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/team-battle/{id}/POST/requestBody/urlEncodedForm`. + internal struct urlEncodedFormPayload: Codable, Hashable, Sendable { + /// All team IDs of the team battle, separated by commas. + /// Make sure to always send the full list. + /// Teams that are not in the list will be removed from the team battle. + /// Example: `coders,zhigalko_sergei-fan-club,hhSwTKZv` + /// + /// + /// - Remark: Generated from `#/paths/api/tournament/team-battle/{id}/POST/requestBody/urlEncodedForm/teams`. + internal var teams: Swift.String + /// Number team leaders per team. + /// + /// - Remark: Generated from `#/paths/api/tournament/team-battle/{id}/POST/requestBody/urlEncodedForm/nbLeaders`. + internal var nbLeaders: Swift.Int + /// Creates a new `urlEncodedFormPayload`. + /// + /// - Parameters: + /// - teams: All team IDs of the team battle, separated by commas. + /// - nbLeaders: Number team leaders per team. + internal init( + teams: Swift.String, + nbLeaders: Swift.Int + ) { + self.teams = teams + self.nbLeaders = nbLeaders + } + internal enum CodingKeys: String, CodingKey { + case teams + case nbLeaders + } + } + /// - Remark: Generated from `#/paths/api/tournament/team-battle/{id}/POST/requestBody/content/application\/x-www-form-urlencoded`. + case urlEncodedForm(Operations.apiTournamentTeamBattlePost.Input.Body.urlEncodedFormPayload) + } + internal var body: Operations.apiTournamentTeamBattlePost.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + /// - body: + internal init( + path: Operations.apiTournamentTeamBattlePost.Input.Path, + headers: Operations.apiTournamentTeamBattlePost.Input.Headers = .init(), + body: Operations.apiTournamentTeamBattlePost.Input.Body + ) { + self.path = path + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/team-battle/{id}/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/team-battle/{id}/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiTournamentTeamBattlePost.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/tournament/team-battle/{id}/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/team-battle/{id}/POST/responses/200/content/application\/json`. + case json(Components.Schemas.ArenaTournamentVariantIsKey) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.ArenaTournamentVariantIsKey { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiTournamentTeamBattlePost.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiTournamentTeamBattlePost.Output.Ok.Headers = .init(), + body: Operations.apiTournamentTeamBattlePost.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The team battle tournament was successfully updated. + /// + /// - Remark: Generated from `#/paths//api/tournament/team-battle/{id}/post(apiTournamentTeamBattlePost)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiTournamentTeamBattlePost.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiTournamentTeamBattlePost.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/team-battle/{id}/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/team-battle/{id}/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiTournamentTeamBattlePost.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.apiTournamentTeamBattlePost.Output.BadRequest.Body) { + self.body = body + } + } + /// The update of the team battle tournament failed. + /// + /// - Remark: Generated from `#/paths//api/tournament/team-battle/{id}/post(apiTournamentTeamBattlePost)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.apiTournamentTeamBattlePost.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.apiTournamentTeamBattlePost.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum gamesByTournament { + internal static let id: Swift.String = "gamesByTournament" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/games/GET/path`. + internal struct Path: Sendable, Hashable { + /// The tournament ID. + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/games/GET/path/id`. + internal var id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - id: The tournament ID. + internal init(id: Swift.String) { + self.id = id + } + } + internal var path: Operations.gamesByTournament.Input.Path + /// - Remark: Generated from `#/paths/api/tournament/{id}/games/GET/query`. + internal struct Query: Sendable, Hashable { + /// Only games of a particular player. Leave empty to fetch games of all players. + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/games/GET/query/player`. + internal var player: Swift.String? + /// Include the PGN moves. + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/games/GET/query/moves`. + internal var moves: Swift.Bool? + /// Include the full PGN within the JSON response, in a `pgn` field. + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/games/GET/query/pgnInJson`. + internal var pgnInJson: Swift.Bool? + /// Include the PGN tags. + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/games/GET/query/tags`. + internal var tags: Swift.Bool? + /// Include clock status when available. + /// Either as PGN comments: `2. exd5 { [%clk 1:01:27] } e5 { [%clk 1:01:28] }` + /// Or in a `clocks` JSON field, as centisecond integers, depending on the response type. + /// + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/games/GET/query/clocks`. + internal var clocks: Swift.Bool? + /// Include analysis evaluations and comments, when available. + /// Either as PGN comments: `12. Bxf6 { [%eval 0.23] } a3 { [%eval -1.09] }` + /// Or in an `analysis` JSON field, depending on the response type. + /// + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/games/GET/query/evals`. + internal var evals: Swift.Bool? + /// Include [accuracy percent](https://lichess.org/page/accuracy) of each player, when available. + /// + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/games/GET/query/accuracy`. + internal var accuracy: Swift.Bool? + /// Include the opening name. + /// Example: `[Opening "King's Gambit Accepted, King's Knight Gambit"]` + /// + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/games/GET/query/opening`. + internal var opening: Swift.Bool? + /// Plies which mark the beginning of the middlegame and endgame. + /// Only available in JSON + /// + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/games/GET/query/division`. + internal var division: Swift.Bool? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - player: Only games of a particular player. Leave empty to fetch games of all players. + /// - moves: Include the PGN moves. + /// - pgnInJson: Include the full PGN within the JSON response, in a `pgn` field. + /// - tags: Include the PGN tags. + /// - clocks: Include clock status when available. + /// - evals: Include analysis evaluations and comments, when available. + /// - accuracy: Include [accuracy percent](https://lichess.org/page/accuracy) of each player, when available. + /// - opening: Include the opening name. + /// - division: Plies which mark the beginning of the middlegame and endgame. + internal init( + player: Swift.String? = nil, + moves: Swift.Bool? = nil, + pgnInJson: Swift.Bool? = nil, + tags: Swift.Bool? = nil, + clocks: Swift.Bool? = nil, + evals: Swift.Bool? = nil, + accuracy: Swift.Bool? = nil, + opening: Swift.Bool? = nil, + division: Swift.Bool? = nil + ) { + self.player = player + self.moves = moves + self.pgnInJson = pgnInJson + self.tags = tags + self.clocks = clocks + self.evals = evals + self.accuracy = accuracy + self.opening = opening + self.division = division + } + } + internal var query: Operations.gamesByTournament.Input.Query + /// - Remark: Generated from `#/paths/api/tournament/{id}/games/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.gamesByTournament.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.gamesByTournament.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.gamesByTournament.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + internal init( + path: Operations.gamesByTournament.Input.Path, + query: Operations.gamesByTournament.Input.Query = .init(), + headers: Operations.gamesByTournament.Input.Headers = .init() + ) { + self.path = path + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/games/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/games/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.gamesByTournament.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/tournament/{id}/games/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/games/GET/responses/200/content/application\/x-chess-pgn`. + case application_x_hyphen_chess_hyphen_pgn(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_chess_hyphen_pgn`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_chess_hyphen_pgn`. + /// - SeeAlso: `.application_x_hyphen_chess_hyphen_pgn`. + internal var application_x_hyphen_chess_hyphen_pgn: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_chess_hyphen_pgn(body): + return body + default: + try throwUnexpectedResponseBody( + expectedContent: "application/x-chess-pgn", + body: self + ) + } + } + } + /// - Remark: Generated from `#/paths/api/tournament/{id}/games/GET/responses/200/content/application\/x-ndjson`. + case application_x_hyphen_ndjson(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_ndjson`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_ndjson`. + /// - SeeAlso: `.application_x_hyphen_ndjson`. + internal var application_x_hyphen_ndjson: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_ndjson(body): + return body + default: + try throwUnexpectedResponseBody( + expectedContent: "application/x-ndjson", + body: self + ) + } + } + } + } + /// Received HTTP response body + internal var body: Operations.gamesByTournament.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.gamesByTournament.Output.Ok.Headers = .init(), + body: Operations.gamesByTournament.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The list of games of an Arena tournament. + /// + /// - Remark: Generated from `#/paths//api/tournament/{id}/games/get(gamesByTournament)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.gamesByTournament.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.gamesByTournament.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_chess_hyphen_pgn + case application_x_hyphen_ndjson + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-chess-pgn": + self = .application_x_hyphen_chess_hyphen_pgn + case "application/x-ndjson": + self = .application_x_hyphen_ndjson + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_chess_hyphen_pgn: + return "application/x-chess-pgn" + case .application_x_hyphen_ndjson: + return "application/x-ndjson" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_chess_hyphen_pgn, + .application_x_hyphen_ndjson + ] + } + } + } + /// 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 enum resultsByTournament { + internal static let id: Swift.String = "resultsByTournament" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/results/GET/path`. + internal struct Path: Sendable, Hashable { + /// The tournament ID. + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/results/GET/path/id`. + internal var id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - id: The tournament ID. + internal init(id: Swift.String) { + self.id = id + } + } + internal var path: Operations.resultsByTournament.Input.Path + /// - Remark: Generated from `#/paths/api/tournament/{id}/results/GET/query`. + internal struct Query: Sendable, Hashable { + /// Max number of players to fetch + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/results/GET/query/nb`. + internal var nb: Swift.Int? + /// Add a `sheet` field to the player document. + /// It's an expensive server computation that slows down the stream. + /// + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/results/GET/query/sheet`. + internal var sheet: Swift.Bool? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - nb: Max number of players to fetch + /// - sheet: Add a `sheet` field to the player document. + internal init( + nb: Swift.Int? = nil, + sheet: Swift.Bool? = nil + ) { + self.nb = nb + self.sheet = sheet + } + } + internal var query: Operations.resultsByTournament.Input.Query + /// - Remark: Generated from `#/paths/api/tournament/{id}/results/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.resultsByTournament.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.resultsByTournament.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.resultsByTournament.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + internal init( + path: Operations.resultsByTournament.Input.Path, + query: Operations.resultsByTournament.Input.Query = .init(), + headers: Operations.resultsByTournament.Input.Headers = .init() + ) { + self.path = path + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/results/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/results/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.resultsByTournament.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/tournament/{id}/results/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/results/GET/responses/200/content/application\/x-ndjson`. + case application_x_hyphen_ndjson(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_ndjson`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_ndjson`. + /// - SeeAlso: `.application_x_hyphen_ndjson`. + internal var application_x_hyphen_ndjson: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_ndjson(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.resultsByTournament.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.resultsByTournament.Output.Ok.Headers = .init(), + body: Operations.resultsByTournament.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The results of the Arena tournament. + /// + /// - Remark: Generated from `#/paths//api/tournament/{id}/results/get(resultsByTournament)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.resultsByTournament.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.resultsByTournament.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_ndjson + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-ndjson": + self = .application_x_hyphen_ndjson + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_ndjson: + return "application/x-ndjson" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_ndjson + ] + } + } + } + /// 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 enum teamsByTournament { + internal static let id: Swift.String = "teamsByTournament" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/teams/GET/path`. + internal struct Path: Sendable, Hashable { + /// The tournament ID. + /// + /// - Remark: Generated from `#/paths/api/tournament/{id}/teams/GET/path/id`. + internal var id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - id: The tournament ID. + internal init(id: Swift.String) { + self.id = id + } + } + internal var path: Operations.teamsByTournament.Input.Path + /// - Remark: Generated from `#/paths/api/tournament/{id}/teams/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.teamsByTournament.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.teamsByTournament.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.teamsByTournament.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.teamsByTournament.Input.Path, + headers: Operations.teamsByTournament.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/teams/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/teams/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.teamsByTournament.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/tournament/{id}/teams/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/tournament/{id}/teams/GET/responses/200/content/application\/json`. + case json(OpenAPIRuntime.OpenAPIValueContainer) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: OpenAPIRuntime.OpenAPIValueContainer { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.teamsByTournament.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.teamsByTournament.Output.Ok.Headers = .init(), + body: Operations.teamsByTournament.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The list of teams of a team battle tournament, with their respective top players. + /// + /// - Remark: Generated from `#/paths//api/tournament/{id}/teams/get(teamsByTournament)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.teamsByTournament.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.teamsByTournament.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiUserNameTournamentCreated { + internal static let id: Swift.String = "apiUserNameTournamentCreated" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/tournament/created/GET/path`. + internal struct Path: Sendable, Hashable { + /// The user whose created tournaments to fetch + /// + /// - Remark: Generated from `#/paths/api/user/{username}/tournament/created/GET/path/username`. + internal var username: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - username: The user whose created tournaments to fetch + internal init(username: Swift.String) { + self.username = username + } + } + internal var path: Operations.apiUserNameTournamentCreated.Input.Path + /// - Remark: Generated from `#/paths/api/user/{username}/tournament/created/GET/query`. + internal struct Query: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/tournament/created/GET/query/status`. + @frozen internal enum statusPayload: Int, Codable, Hashable, Sendable { + case _10 = 10 + case _20 = 20 + case _30 = 30 + } + /// Include tournaments in the given status: "Created" (10), "Started" (20), "Finished" (30) + /// You can add this parameter more than once to include tournaments in different statuses. + /// Example: `?status=10&status=20` + /// + /// + /// - Remark: Generated from `#/paths/api/user/{username}/tournament/created/GET/query/status`. + internal var status: Operations.apiUserNameTournamentCreated.Input.Query.statusPayload? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - status: Include tournaments in the given status: "Created" (10), "Started" (20), "Finished" (30) + internal init(status: Operations.apiUserNameTournamentCreated.Input.Query.statusPayload? = nil) { + self.status = status + } + } + internal var query: Operations.apiUserNameTournamentCreated.Input.Query + /// - Remark: Generated from `#/paths/api/user/{username}/tournament/created/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiUserNameTournamentCreated.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiUserNameTournamentCreated.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiUserNameTournamentCreated.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + internal init( + path: Operations.apiUserNameTournamentCreated.Input.Path, + query: Operations.apiUserNameTournamentCreated.Input.Query = .init(), + headers: Operations.apiUserNameTournamentCreated.Input.Headers = .init() + ) { + self.path = path + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/tournament/created/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/tournament/created/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiUserNameTournamentCreated.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/user/{username}/tournament/created/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/tournament/created/GET/responses/200/content/application\/x-ndjson`. + case application_x_hyphen_ndjson(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_ndjson`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_ndjson`. + /// - SeeAlso: `.application_x_hyphen_ndjson`. + internal var application_x_hyphen_ndjson: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_ndjson(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiUserNameTournamentCreated.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiUserNameTournamentCreated.Output.Ok.Headers = .init(), + body: Operations.apiUserNameTournamentCreated.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The list of tournaments created by the user. + /// + /// - Remark: Generated from `#/paths//api/user/{username}/tournament/created/get(apiUserNameTournamentCreated)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiUserNameTournamentCreated.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiUserNameTournamentCreated.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_ndjson + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-ndjson": + self = .application_x_hyphen_ndjson + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_ndjson: + return "application/x-ndjson" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_ndjson + ] + } + } + } + /// 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 enum apiSwissNew { + internal static let id: Swift.String = "apiSwissNew" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/path`. + internal struct Path: Sendable, Hashable { + /// ID of the team + /// + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/path/teamId`. + internal var teamId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - teamId: ID of the team + internal init(teamId: Swift.String) { + self.teamId = teamId + } + } + internal var path: Operations.apiSwissNew.Input.Path + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiSwissNew.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiSwissNew.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiSwissNew.Input.Headers + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/requestBody/urlEncodedForm`. + internal struct urlEncodedFormPayload: Codable, Hashable, Sendable { + /// The tournament name. Leave empty to get a random Grandmaster name + /// + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/requestBody/urlEncodedForm/name`. + internal var name: Swift.String? + /// Clock initial time in seconds + /// + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/requestBody/urlEncodedForm/clock.limit`. + internal var clock_period_limit: Swift.Double + /// Clock increment in seconds + /// + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/requestBody/urlEncodedForm/clock.increment`. + internal var clock_period_increment: Swift.Int + /// Maximum number of rounds to play + /// + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/requestBody/urlEncodedForm/nbRounds`. + internal var nbRounds: Swift.Int + /// Timestamp in milliseconds to start the tournament at a given date and time. By default, it starts 10 minutes after creation. + /// + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/requestBody/urlEncodedForm/startsAt`. + internal var startsAt: Swift.Int? + /// How long to wait between each round, in seconds. + /// Set to 99999999 to manually schedule each round from the tournament UI. + /// If empty or -1, a sensible value is picked automatically. + /// + /// + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/requestBody/urlEncodedForm/roundInterval`. + @frozen internal enum roundIntervalPayload: Int, Codable, Hashable, Sendable { + case _n1 = -1 + case _5 = 5 + case _10 = 10 + case _20 = 20 + case _30 = 30 + case _45 = 45 + case _60 = 60 + case _120 = 120 + case _180 = 180 + case _300 = 300 + case _600 = 600 + case _900 = 900 + case _1200 = 1200 + case _1800 = 1800 + case _2700 = 2700 + case _3600 = 3600 + case _86400 = 86400 + case _172800 = 172800 + case _604800 = 604800 + case _99999999 = 99999999 + } + /// How long to wait between each round, in seconds. + /// Set to 99999999 to manually schedule each round from the tournament UI. + /// If empty or -1, a sensible value is picked automatically. + /// + /// + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/requestBody/urlEncodedForm/roundInterval`. + internal var roundInterval: Operations.apiSwissNew.Input.Body.urlEncodedFormPayload.roundIntervalPayload? + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/requestBody/urlEncodedForm/variant`. + internal var variant: Components.Schemas.VariantKey? + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/requestBody/urlEncodedForm/position`. + internal var position: Components.Schemas.FromPositionFEN? + /// Anything you want to tell players about the tournament + /// + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/requestBody/urlEncodedForm/description`. + internal var description: Swift.String? + /// Games are rated and impact players ratings + /// + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/requestBody/urlEncodedForm/rated`. + internal var rated: Swift.Bool? + /// Make the tournament private and restrict access with a password. + /// + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/requestBody/urlEncodedForm/password`. + internal var password: Swift.String? + /// Usernames of players that must not play together. + /// Two usernames per line, separated by a space. + /// + /// + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/requestBody/urlEncodedForm/forbiddenPairings`. + internal var forbiddenPairings: Swift.String? + /// Manual pairings for the next round. + /// Two usernames per line, separated by a space. Example: + /// ``` + /// PlayerA PlayerB + /// PlayerC PlayerD + /// ``` + /// To give a bye (1 point) to a player instead of a pairing, add a line like so: + /// ``` + /// PlayerE 1 + /// ``` + /// Missing players will be considered absent and get zero points. + /// + /// + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/requestBody/urlEncodedForm/manualPairings`. + internal var manualPairings: Swift.String? + /// Who can read and write in the chat. + /// - 0 = No-one + /// - 10 = Only team leaders + /// - 20 = Only team members + /// - 30 = All Lichess players + /// + /// + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/requestBody/urlEncodedForm/chatFor`. + internal var chatFor: Swift.Double? + /// Minimum rating to join. Leave empty to let everyone join the tournament. + /// + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/requestBody/urlEncodedForm/conditions.minRating.rating`. + @frozen internal enum conditions_period_minRating_period_ratingPayload: Int, Codable, Hashable, Sendable { + case _1000 = 1000 + case _1100 = 1100 + case _1200 = 1200 + case _1300 = 1300 + case _1400 = 1400 + case _1500 = 1500 + case _1600 = 1600 + case _1700 = 1700 + case _1800 = 1800 + case _1900 = 1900 + case _2000 = 2000 + case _2100 = 2100 + case _2200 = 2200 + case _2300 = 2300 + case _2400 = 2400 + case _2500 = 2500 + case _2600 = 2600 + } + /// Minimum rating to join. Leave empty to let everyone join the tournament. + /// + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/requestBody/urlEncodedForm/conditions.minRating.rating`. + internal var conditions_period_minRating_period_rating: Operations.apiSwissNew.Input.Body.urlEncodedFormPayload.conditions_period_minRating_period_ratingPayload? + /// Maximum rating to join. Based on best rating reached in the last 7 days. Leave empty to let everyone join the tournament. + /// + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/requestBody/urlEncodedForm/conditions.maxRating.rating`. + @frozen internal enum conditions_period_maxRating_period_ratingPayload: Int, Codable, Hashable, Sendable { + case _2200 = 2200 + case _2100 = 2100 + case _2000 = 2000 + case _1900 = 1900 + case _1800 = 1800 + case _1700 = 1700 + case _1600 = 1600 + case _1500 = 1500 + case _1400 = 1400 + case _1300 = 1300 + case _1200 = 1200 + case _1100 = 1100 + case _1000 = 1000 + case _900 = 900 + case _800 = 800 + } + /// Maximum rating to join. Based on best rating reached in the last 7 days. Leave empty to let everyone join the tournament. + /// + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/requestBody/urlEncodedForm/conditions.maxRating.rating`. + internal var conditions_period_maxRating_period_rating: Operations.apiSwissNew.Input.Body.urlEncodedFormPayload.conditions_period_maxRating_period_ratingPayload? + /// Minimum number of rated games required to join. + /// + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/requestBody/urlEncodedForm/conditions.nbRatedGame.nb`. + internal var conditions_period_nbRatedGame_period_nb: Swift.Int? + /// Only let players join if they have played their last swiss game. + /// If they failed to show up in a recent swiss event, they won't be able to enter yours. + /// This results in a better swiss experience for the players who actually show up. + /// + /// + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/requestBody/urlEncodedForm/conditions.playYourGames`. + internal var conditions_period_playYourGames: Swift.Bool? + /// Predefined list of usernames that are allowed to join, separated by commas. + /// If this list is non-empty, then usernames absent from this list will be forbidden to join. + /// Adding `%titled` to the list additionally allows any titled player to join. + /// Example: `thibault,german11,%titled` + /// + /// + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/requestBody/urlEncodedForm/conditions.allowList`. + internal var conditions_period_allowList: Swift.String? + /// Creates a new `urlEncodedFormPayload`. + /// + /// - Parameters: + /// - name: The tournament name. Leave empty to get a random Grandmaster name + /// - clock_period_limit: Clock initial time in seconds + /// - clock_period_increment: Clock increment in seconds + /// - nbRounds: Maximum number of rounds to play + /// - startsAt: Timestamp in milliseconds to start the tournament at a given date and time. By default, it starts 10 minutes after creation. + /// - roundInterval: How long to wait between each round, in seconds. + /// - variant: + /// - position: + /// - description: Anything you want to tell players about the tournament + /// - rated: Games are rated and impact players ratings + /// - password: Make the tournament private and restrict access with a password. + /// - forbiddenPairings: Usernames of players that must not play together. + /// - manualPairings: Manual pairings for the next round. + /// - chatFor: Who can read and write in the chat. + /// - conditions_period_minRating_period_rating: Minimum rating to join. Leave empty to let everyone join the tournament. + /// - conditions_period_maxRating_period_rating: Maximum rating to join. Based on best rating reached in the last 7 days. Leave empty to let everyone join the tournament. + /// - conditions_period_nbRatedGame_period_nb: Minimum number of rated games required to join. + /// - conditions_period_playYourGames: Only let players join if they have played their last swiss game. + /// - conditions_period_allowList: Predefined list of usernames that are allowed to join, separated by commas. + internal init( + name: Swift.String? = nil, + clock_period_limit: Swift.Double, + clock_period_increment: Swift.Int, + nbRounds: Swift.Int, + startsAt: Swift.Int? = nil, + roundInterval: Operations.apiSwissNew.Input.Body.urlEncodedFormPayload.roundIntervalPayload? = nil, + variant: Components.Schemas.VariantKey? = nil, + position: Components.Schemas.FromPositionFEN? = nil, + description: Swift.String? = nil, + rated: Swift.Bool? = nil, + password: Swift.String? = nil, + forbiddenPairings: Swift.String? = nil, + manualPairings: Swift.String? = nil, + chatFor: Swift.Double? = nil, + conditions_period_minRating_period_rating: Operations.apiSwissNew.Input.Body.urlEncodedFormPayload.conditions_period_minRating_period_ratingPayload? = nil, + conditions_period_maxRating_period_rating: Operations.apiSwissNew.Input.Body.urlEncodedFormPayload.conditions_period_maxRating_period_ratingPayload? = nil, + conditions_period_nbRatedGame_period_nb: Swift.Int? = nil, + conditions_period_playYourGames: Swift.Bool? = nil, + conditions_period_allowList: Swift.String? = nil + ) { + self.name = name + self.clock_period_limit = clock_period_limit + self.clock_period_increment = clock_period_increment + self.nbRounds = nbRounds + self.startsAt = startsAt + self.roundInterval = roundInterval + self.variant = variant + self.position = position + self.description = description + self.rated = rated + self.password = password + self.forbiddenPairings = forbiddenPairings + self.manualPairings = manualPairings + self.chatFor = chatFor + self.conditions_period_minRating_period_rating = conditions_period_minRating_period_rating + self.conditions_period_maxRating_period_rating = conditions_period_maxRating_period_rating + self.conditions_period_nbRatedGame_period_nb = conditions_period_nbRatedGame_period_nb + self.conditions_period_playYourGames = conditions_period_playYourGames + self.conditions_period_allowList = conditions_period_allowList + } + internal enum CodingKeys: String, CodingKey { + case name + case clock_period_limit = "clock.limit" + case clock_period_increment = "clock.increment" + case nbRounds + case startsAt + case roundInterval + case variant + case position + case description + case rated + case password + case forbiddenPairings + case manualPairings + case chatFor + case conditions_period_minRating_period_rating = "conditions.minRating.rating" + case conditions_period_maxRating_period_rating = "conditions.maxRating.rating" + case conditions_period_nbRatedGame_period_nb = "conditions.nbRatedGame.nb" + case conditions_period_playYourGames = "conditions.playYourGames" + case conditions_period_allowList = "conditions.allowList" + } + } + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/requestBody/content/application\/x-www-form-urlencoded`. + case urlEncodedForm(Operations.apiSwissNew.Input.Body.urlEncodedFormPayload) + } + internal var body: Operations.apiSwissNew.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + /// - body: + internal init( + path: Operations.apiSwissNew.Input.Path, + headers: Operations.apiSwissNew.Input.Headers = .init(), + body: Operations.apiSwissNew.Input.Body + ) { + self.path = path + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiSwissNew.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/responses/200/content/application\/json`. + case json(Components.Schemas.SwissTournament) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.SwissTournament { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiSwissNew.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiSwissNew.Output.Ok.Headers = .init(), + body: Operations.apiSwissNew.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The Swiss tournament was successfully created. + /// + /// - Remark: Generated from `#/paths//api/swiss/new/{teamId}/post(apiSwissNew)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiSwissNew.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiSwissNew.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/new/{teamId}/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiSwissNew.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.apiSwissNew.Output.BadRequest.Body) { + self.body = body + } + } + /// The creation of the Swiss tournament failed. + /// + /// - Remark: Generated from `#/paths//api/swiss/new/{teamId}/post(apiSwissNew)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.apiSwissNew.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.apiSwissNew.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum swiss { + internal static let id: Swift.String = "swiss" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/GET/path`. + internal struct Path: Sendable, Hashable { + /// The Swiss tournament ID. + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/GET/path/id`. + internal var id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - id: The Swiss tournament ID. + internal init(id: Swift.String) { + self.id = id + } + } + internal var path: Operations.swiss.Input.Path + /// - Remark: Generated from `#/paths/api/swiss/{id}/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.swiss.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.swiss.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.swiss.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.swiss.Input.Path, + headers: Operations.swiss.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.swiss.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/swiss/{id}/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/GET/responses/200/content/application\/json`. + case json(Components.Schemas.SwissTournament) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.SwissTournament { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.swiss.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.swiss.Output.Ok.Headers = .init(), + body: Operations.swiss.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The information of the Swiss tournament. + /// + /// - Remark: Generated from `#/paths//api/swiss/{id}/get(swiss)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.swiss.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.swiss.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiSwissUpdate { + internal static let id: Swift.String = "apiSwissUpdate" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/path`. + internal struct Path: Sendable, Hashable { + /// The tournament ID. + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/path/id`. + internal var id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - id: The tournament ID. + internal init(id: Swift.String) { + self.id = id + } + } + internal var path: Operations.apiSwissUpdate.Input.Path + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiSwissUpdate.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiSwissUpdate.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiSwissUpdate.Input.Headers + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/requestBody/urlEncodedForm`. + internal struct urlEncodedFormPayload: Codable, Hashable, Sendable { + /// The tournament name. Leave empty to get a random Grandmaster name + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/requestBody/urlEncodedForm/name`. + internal var name: Swift.String? + /// Clock initial time in seconds + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/requestBody/urlEncodedForm/clock.limit`. + internal var clock_period_limit: Swift.Double + /// Clock increment in seconds + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/requestBody/urlEncodedForm/clock.increment`. + internal var clock_period_increment: Swift.Int + /// Maximum number of rounds to play + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/requestBody/urlEncodedForm/nbRounds`. + internal var nbRounds: Swift.Int + /// Timestamp in milliseconds to start the tournament at a given date and time. By default, it starts 10 minutes after creation. + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/requestBody/urlEncodedForm/startsAt`. + internal var startsAt: Swift.Int? + /// How long to wait between each round, in seconds. + /// Set to 99999999 to manually schedule each round from the tournament UI, or [with the API](#tag/Swiss-tournaments/operation/apiSwissScheduleNextRound). + /// If empty or -1, a sensible value is picked automatically. + /// + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/requestBody/urlEncodedForm/roundInterval`. + @frozen internal enum roundIntervalPayload: Int, Codable, Hashable, Sendable { + case _n1 = -1 + case _5 = 5 + case _10 = 10 + case _20 = 20 + case _30 = 30 + case _45 = 45 + case _60 = 60 + case _120 = 120 + case _180 = 180 + case _300 = 300 + case _600 = 600 + case _900 = 900 + case _1200 = 1200 + case _1800 = 1800 + case _2700 = 2700 + case _3600 = 3600 + case _86400 = 86400 + case _172800 = 172800 + case _604800 = 604800 + case _99999999 = 99999999 + } + /// How long to wait between each round, in seconds. + /// Set to 99999999 to manually schedule each round from the tournament UI, or [with the API](#tag/Swiss-tournaments/operation/apiSwissScheduleNextRound). + /// If empty or -1, a sensible value is picked automatically. + /// + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/requestBody/urlEncodedForm/roundInterval`. + internal var roundInterval: Operations.apiSwissUpdate.Input.Body.urlEncodedFormPayload.roundIntervalPayload? + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/requestBody/urlEncodedForm/variant`. + internal var variant: Components.Schemas.VariantKey? + /// Anything you want to tell players about the tournament + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/requestBody/urlEncodedForm/description`. + internal var description: Swift.String? + /// Games are rated and impact players ratings + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/requestBody/urlEncodedForm/rated`. + internal var rated: Swift.Bool? + /// Make the tournament private and restrict access with a password. + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/requestBody/urlEncodedForm/password`. + internal var password: Swift.String? + /// Usernames of players that must not play together. + /// Two usernames per line, separated by a space. + /// + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/requestBody/urlEncodedForm/forbiddenPairings`. + internal var forbiddenPairings: Swift.String? + /// Manual pairings for the next round. + /// Two usernames per line, separated by a space. + /// Present players without a valid pairing will be given a bye, which is worth 1 point. + /// Forfeited players will get 0 points. + /// + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/requestBody/urlEncodedForm/manualPairings`. + internal var manualPairings: Swift.String? + /// Who can read and write in the chat. + /// - 0 = No-one + /// - 10 = Only team leaders + /// - 20 = Only team members + /// - 30 = All Lichess players + /// + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/requestBody/urlEncodedForm/chatFor`. + internal var chatFor: Swift.Double? + /// Minimum rating to join. Leave empty to let everyone join the tournament. + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/requestBody/urlEncodedForm/conditions.minRating.rating`. + @frozen internal enum conditions_period_minRating_period_ratingPayload: Int, Codable, Hashable, Sendable { + case _1000 = 1000 + case _1100 = 1100 + case _1200 = 1200 + case _1300 = 1300 + case _1400 = 1400 + case _1500 = 1500 + case _1600 = 1600 + case _1700 = 1700 + case _1800 = 1800 + case _1900 = 1900 + case _2000 = 2000 + case _2100 = 2100 + case _2200 = 2200 + case _2300 = 2300 + case _2400 = 2400 + case _2500 = 2500 + case _2600 = 2600 + } + /// Minimum rating to join. Leave empty to let everyone join the tournament. + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/requestBody/urlEncodedForm/conditions.minRating.rating`. + internal var conditions_period_minRating_period_rating: Operations.apiSwissUpdate.Input.Body.urlEncodedFormPayload.conditions_period_minRating_period_ratingPayload? + /// Maximum rating to join. Based on best rating reached in the last 7 days. Leave empty to let everyone join the tournament. + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/requestBody/urlEncodedForm/conditions.maxRating.rating`. + @frozen internal enum conditions_period_maxRating_period_ratingPayload: Int, Codable, Hashable, Sendable { + case _2200 = 2200 + case _2100 = 2100 + case _2000 = 2000 + case _1900 = 1900 + case _1800 = 1800 + case _1700 = 1700 + case _1600 = 1600 + case _1500 = 1500 + case _1400 = 1400 + case _1300 = 1300 + case _1200 = 1200 + case _1100 = 1100 + case _1000 = 1000 + case _900 = 900 + case _800 = 800 + } + /// Maximum rating to join. Based on best rating reached in the last 7 days. Leave empty to let everyone join the tournament. + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/requestBody/urlEncodedForm/conditions.maxRating.rating`. + internal var conditions_period_maxRating_period_rating: Operations.apiSwissUpdate.Input.Body.urlEncodedFormPayload.conditions_period_maxRating_period_ratingPayload? + /// Minimum number of rated games required to join. + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/requestBody/urlEncodedForm/conditions.nbRatedGame.nb`. + internal var conditions_period_nbRatedGame_period_nb: Swift.Int? + /// Only let players join if they have played their last swiss game. + /// If they failed to show up in a recent swiss event, they won't be able to enter yours. + /// This results in a better swiss experience for the players who actually show up. + /// + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/requestBody/urlEncodedForm/conditions.playYourGames`. + internal var conditions_period_playYourGames: Swift.Bool? + /// Predefined list of usernames that are allowed to join, separated by commas. + /// If this list is non-empty, then usernames absent from this list will be forbidden to join. + /// Adding `%titled` to the list additionally allows any titled player to join. + /// Example: `thibault,german11,%titled` + /// + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/requestBody/urlEncodedForm/conditions.allowList`. + internal var conditions_period_allowList: Swift.String? + /// Creates a new `urlEncodedFormPayload`. + /// + /// - Parameters: + /// - name: The tournament name. Leave empty to get a random Grandmaster name + /// - clock_period_limit: Clock initial time in seconds + /// - clock_period_increment: Clock increment in seconds + /// - nbRounds: Maximum number of rounds to play + /// - startsAt: Timestamp in milliseconds to start the tournament at a given date and time. By default, it starts 10 minutes after creation. + /// - roundInterval: How long to wait between each round, in seconds. + /// - variant: + /// - description: Anything you want to tell players about the tournament + /// - rated: Games are rated and impact players ratings + /// - password: Make the tournament private and restrict access with a password. + /// - forbiddenPairings: Usernames of players that must not play together. + /// - manualPairings: Manual pairings for the next round. + /// - chatFor: Who can read and write in the chat. + /// - conditions_period_minRating_period_rating: Minimum rating to join. Leave empty to let everyone join the tournament. + /// - conditions_period_maxRating_period_rating: Maximum rating to join. Based on best rating reached in the last 7 days. Leave empty to let everyone join the tournament. + /// - conditions_period_nbRatedGame_period_nb: Minimum number of rated games required to join. + /// - conditions_period_playYourGames: Only let players join if they have played their last swiss game. + /// - conditions_period_allowList: Predefined list of usernames that are allowed to join, separated by commas. + internal init( + name: Swift.String? = nil, + clock_period_limit: Swift.Double, + clock_period_increment: Swift.Int, + nbRounds: Swift.Int, + startsAt: Swift.Int? = nil, + roundInterval: Operations.apiSwissUpdate.Input.Body.urlEncodedFormPayload.roundIntervalPayload? = nil, + variant: Components.Schemas.VariantKey? = nil, + description: Swift.String? = nil, + rated: Swift.Bool? = nil, + password: Swift.String? = nil, + forbiddenPairings: Swift.String? = nil, + manualPairings: Swift.String? = nil, + chatFor: Swift.Double? = nil, + conditions_period_minRating_period_rating: Operations.apiSwissUpdate.Input.Body.urlEncodedFormPayload.conditions_period_minRating_period_ratingPayload? = nil, + conditions_period_maxRating_period_rating: Operations.apiSwissUpdate.Input.Body.urlEncodedFormPayload.conditions_period_maxRating_period_ratingPayload? = nil, + conditions_period_nbRatedGame_period_nb: Swift.Int? = nil, + conditions_period_playYourGames: Swift.Bool? = nil, + conditions_period_allowList: Swift.String? = nil + ) { + self.name = name + self.clock_period_limit = clock_period_limit + self.clock_period_increment = clock_period_increment + self.nbRounds = nbRounds + self.startsAt = startsAt + self.roundInterval = roundInterval + self.variant = variant + self.description = description + self.rated = rated + self.password = password + self.forbiddenPairings = forbiddenPairings + self.manualPairings = manualPairings + self.chatFor = chatFor + self.conditions_period_minRating_period_rating = conditions_period_minRating_period_rating + self.conditions_period_maxRating_period_rating = conditions_period_maxRating_period_rating + self.conditions_period_nbRatedGame_period_nb = conditions_period_nbRatedGame_period_nb + self.conditions_period_playYourGames = conditions_period_playYourGames + self.conditions_period_allowList = conditions_period_allowList + } + internal enum CodingKeys: String, CodingKey { + case name + case clock_period_limit = "clock.limit" + case clock_period_increment = "clock.increment" + case nbRounds + case startsAt + case roundInterval + case variant + case description + case rated + case password + case forbiddenPairings + case manualPairings + case chatFor + case conditions_period_minRating_period_rating = "conditions.minRating.rating" + case conditions_period_maxRating_period_rating = "conditions.maxRating.rating" + case conditions_period_nbRatedGame_period_nb = "conditions.nbRatedGame.nb" + case conditions_period_playYourGames = "conditions.playYourGames" + case conditions_period_allowList = "conditions.allowList" + } + } + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/requestBody/content/application\/x-www-form-urlencoded`. + case urlEncodedForm(Operations.apiSwissUpdate.Input.Body.urlEncodedFormPayload) + } + internal var body: Operations.apiSwissUpdate.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + /// - body: + internal init( + path: Operations.apiSwissUpdate.Input.Path, + headers: Operations.apiSwissUpdate.Input.Headers = .init(), + body: Operations.apiSwissUpdate.Input.Body + ) { + self.path = path + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiSwissUpdate.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/responses/200/content/application\/json`. + case json(Components.Schemas.SwissTournament) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.SwissTournament { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiSwissUpdate.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiSwissUpdate.Output.Ok.Headers = .init(), + body: Operations.apiSwissUpdate.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The Swiss tournament was successfully updated. + /// + /// - Remark: Generated from `#/paths//api/swiss/{id}/edit/post(apiSwissUpdate)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiSwissUpdate.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiSwissUpdate.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiSwissUpdate.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.apiSwissUpdate.Output.BadRequest.Body) { + self.body = body + } + } + /// Updating the swiss failed. + /// + /// - Remark: Generated from `#/paths//api/swiss/{id}/edit/post(apiSwissUpdate)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.apiSwissUpdate.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.apiSwissUpdate.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + internal struct Unauthorized: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/responses/401/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/edit/POST/responses/401/content/application\/json`. + case json(Components.Schemas.SwissUnauthorisedEdit) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.SwissUnauthorisedEdit { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiSwissUpdate.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.apiSwissUpdate.Output.Unauthorized.Body) { + self.body = body + } + } + /// This user cannot update this Swiss. + /// + /// - Remark: Generated from `#/paths//api/swiss/{id}/edit/post(apiSwissUpdate)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.apiSwissUpdate.Output.Unauthorized) + /// The associated value of the enum case if `self` is `.unauthorized`. + /// + /// - Throws: An error if `self` is not `.unauthorized`. + /// - SeeAlso: `.unauthorized`. + internal var unauthorized: Operations.apiSwissUpdate.Output.Unauthorized { + get throws { + switch self { + case let .unauthorized(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "unauthorized", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiSwissScheduleNextRound { + internal static let id: Swift.String = "apiSwissScheduleNextRound" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/schedule-next-round/POST/path`. + internal struct Path: Sendable, Hashable { + /// The tournament ID. + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/schedule-next-round/POST/path/id`. + internal var id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - id: The tournament ID. + internal init(id: Swift.String) { + self.id = id + } + } + internal var path: Operations.apiSwissScheduleNextRound.Input.Path + /// - Remark: Generated from `#/paths/api/swiss/{id}/schedule-next-round/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiSwissScheduleNextRound.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiSwissScheduleNextRound.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiSwissScheduleNextRound.Input.Headers + /// - Remark: Generated from `#/paths/api/swiss/{id}/schedule-next-round/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/schedule-next-round/POST/requestBody/urlEncodedForm`. + internal struct urlEncodedFormPayload: Codable, Hashable, Sendable { + /// Timestamp in milliseconds to start the next round at a given date and time. + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/schedule-next-round/POST/requestBody/urlEncodedForm/date`. + internal var date: Swift.Int? + /// Creates a new `urlEncodedFormPayload`. + /// + /// - Parameters: + /// - date: Timestamp in milliseconds to start the next round at a given date and time. + internal init(date: Swift.Int? = nil) { + self.date = date + } + internal enum CodingKeys: String, CodingKey { + case date + } + } + /// - Remark: Generated from `#/paths/api/swiss/{id}/schedule-next-round/POST/requestBody/content/application\/x-www-form-urlencoded`. + case urlEncodedForm(Operations.apiSwissScheduleNextRound.Input.Body.urlEncodedFormPayload) + } + internal var body: Operations.apiSwissScheduleNextRound.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + /// - body: + internal init( + path: Operations.apiSwissScheduleNextRound.Input.Path, + headers: Operations.apiSwissScheduleNextRound.Input.Headers = .init(), + body: Operations.apiSwissScheduleNextRound.Input.Body + ) { + self.path = path + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct NoContent: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/schedule-next-round/POST/responses/204/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/schedule-next-round/POST/responses/204/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiSwissScheduleNextRound.Output.NoContent.Headers + /// Creates a new `NoContent`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + internal init(headers: Operations.apiSwissScheduleNextRound.Output.NoContent.Headers = .init()) { + self.headers = headers + } + } + /// The Swiss tournament was successfully updated. + /// + /// - Remark: Generated from `#/paths//api/swiss/{id}/schedule-next-round/post(apiSwissScheduleNextRound)/responses/204`. + /// + /// HTTP response code: `204 noContent`. + case noContent(Operations.apiSwissScheduleNextRound.Output.NoContent) + /// The associated value of the enum case if `self` is `.noContent`. + /// + /// - Throws: An error if `self` is not `.noContent`. + /// - SeeAlso: `.noContent`. + internal var noContent: Operations.apiSwissScheduleNextRound.Output.NoContent { + get throws { + switch self { + case let .noContent(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "noContent", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/schedule-next-round/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/schedule-next-round/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiSwissScheduleNextRound.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.apiSwissScheduleNextRound.Output.BadRequest.Body) { + self.body = body + } + } + /// Updating the swiss failed. + /// + /// - Remark: Generated from `#/paths//api/swiss/{id}/schedule-next-round/post(apiSwissScheduleNextRound)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.apiSwissScheduleNextRound.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.apiSwissScheduleNextRound.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + internal struct Unauthorized: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/schedule-next-round/POST/responses/401/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/schedule-next-round/POST/responses/401/content/application\/json`. + case json(Components.Schemas.SwissUnauthorisedEdit) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.SwissUnauthorisedEdit { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiSwissScheduleNextRound.Output.Unauthorized.Body + /// Creates a new `Unauthorized`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.apiSwissScheduleNextRound.Output.Unauthorized.Body) { + self.body = body + } + } + /// This user cannot update this Swiss. + /// + /// - Remark: Generated from `#/paths//api/swiss/{id}/schedule-next-round/post(apiSwissScheduleNextRound)/responses/401`. + /// + /// HTTP response code: `401 unauthorized`. + case unauthorized(Operations.apiSwissScheduleNextRound.Output.Unauthorized) + /// The associated value of the enum case if `self` is `.unauthorized`. + /// + /// - Throws: An error if `self` is not `.unauthorized`. + /// - SeeAlso: `.unauthorized`. + internal var unauthorized: Operations.apiSwissScheduleNextRound.Output.Unauthorized { + get throws { + switch self { + case let .unauthorized(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "unauthorized", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiSwissJoin { + internal static let id: Swift.String = "apiSwissJoin" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/join/POST/path`. + internal struct Path: Sendable, Hashable { + /// The tournament ID. + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/join/POST/path/id`. + internal var id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - id: The tournament ID. + internal init(id: Swift.String) { + self.id = id + } + } + internal var path: Operations.apiSwissJoin.Input.Path + /// - Remark: Generated from `#/paths/api/swiss/{id}/join/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiSwissJoin.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiSwissJoin.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiSwissJoin.Input.Headers + /// - Remark: Generated from `#/paths/api/swiss/{id}/join/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/join/POST/requestBody/urlEncodedForm`. + internal struct urlEncodedFormPayload: Codable, Hashable, Sendable { + /// The tournament password, if one is required + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/join/POST/requestBody/urlEncodedForm/password`. + internal var password: Swift.String? + /// Creates a new `urlEncodedFormPayload`. + /// + /// - Parameters: + /// - password: The tournament password, if one is required + internal init(password: Swift.String? = nil) { + self.password = password + } + internal enum CodingKeys: String, CodingKey { + case password + } + } + /// - Remark: Generated from `#/paths/api/swiss/{id}/join/POST/requestBody/content/application\/x-www-form-urlencoded`. + case urlEncodedForm(Operations.apiSwissJoin.Input.Body.urlEncodedFormPayload) + } + internal var body: Operations.apiSwissJoin.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + /// - body: + internal init( + path: Operations.apiSwissJoin.Input.Path, + headers: Operations.apiSwissJoin.Input.Headers = .init(), + body: Operations.apiSwissJoin.Input.Body + ) { + self.path = path + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/join/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/join/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiSwissJoin.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/swiss/{id}/join/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/join/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiSwissJoin.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiSwissJoin.Output.Ok.Headers = .init(), + body: Operations.apiSwissJoin.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The tournament was successfully joined. + /// + /// - Remark: Generated from `#/paths//api/swiss/{id}/join/post(apiSwissJoin)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiSwissJoin.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiSwissJoin.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/join/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/join/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiSwissJoin.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.apiSwissJoin.Output.BadRequest.Body) { + self.body = body + } + } + /// Joining the tournament failed. + /// + /// - Remark: Generated from `#/paths//api/swiss/{id}/join/post(apiSwissJoin)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.apiSwissJoin.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.apiSwissJoin.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiSwissWithdraw { + internal static let id: Swift.String = "apiSwissWithdraw" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/withdraw/POST/path`. + internal struct Path: Sendable, Hashable { + /// The tournament ID. + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/withdraw/POST/path/id`. + internal var id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - id: The tournament ID. + internal init(id: Swift.String) { + self.id = id + } + } + internal var path: Operations.apiSwissWithdraw.Input.Path + /// - Remark: Generated from `#/paths/api/swiss/{id}/withdraw/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiSwissWithdraw.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiSwissWithdraw.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiSwissWithdraw.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.apiSwissWithdraw.Input.Path, + headers: Operations.apiSwissWithdraw.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/withdraw/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/withdraw/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiSwissWithdraw.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/swiss/{id}/withdraw/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/withdraw/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiSwissWithdraw.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiSwissWithdraw.Output.Ok.Headers = .init(), + body: Operations.apiSwissWithdraw.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The tournament was successfully paused or left. + /// + /// - Remark: Generated from `#/paths//api/swiss/{id}/withdraw/post(apiSwissWithdraw)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiSwissWithdraw.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiSwissWithdraw.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiSwissTerminate { + internal static let id: Swift.String = "apiSwissTerminate" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/terminate/POST/path`. + internal struct Path: Sendable, Hashable { + /// The Swiss tournament ID. + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/terminate/POST/path/id`. + internal var id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - id: The Swiss tournament ID. + internal init(id: Swift.String) { + self.id = id + } + } + internal var path: Operations.apiSwissTerminate.Input.Path + /// - Remark: Generated from `#/paths/api/swiss/{id}/terminate/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiSwissTerminate.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiSwissTerminate.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiSwissTerminate.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.apiSwissTerminate.Input.Path, + headers: Operations.apiSwissTerminate.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/terminate/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/terminate/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiSwissTerminate.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/swiss/{id}/terminate/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/terminate/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiSwissTerminate.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiSwissTerminate.Output.Ok.Headers = .init(), + body: Operations.apiSwissTerminate.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The Swiss tournament was successfully terminated. + /// + /// - Remark: Generated from `#/paths//api/swiss/{id}/terminate/post(apiSwissTerminate)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiSwissTerminate.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiSwissTerminate.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/terminate/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/terminate/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiSwissTerminate.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.apiSwissTerminate.Output.BadRequest.Body) { + self.body = body + } + } + /// Terminating the Swiss tournament failed. + /// + /// - Remark: Generated from `#/paths//api/swiss/{id}/terminate/post(apiSwissTerminate)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.apiSwissTerminate.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.apiSwissTerminate.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum swissTrf { + internal static let id: Swift.String = "swissTrf" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/swiss/{id}.trf/GET/path`. + internal struct Path: Sendable, Hashable { + /// The tournament ID. + /// + /// - Remark: Generated from `#/paths/swiss/{id}.trf/GET/path/id`. + internal var id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - id: The tournament ID. + internal init(id: Swift.String) { + self.id = id + } + } + internal var path: Operations.swissTrf.Input.Path + /// - Remark: Generated from `#/paths/swiss/{id}.trf/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.swissTrf.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.swissTrf.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.swissTrf.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.swissTrf.Input.Path, + headers: Operations.swissTrf.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/swiss/{id}.trf/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/swiss/{id}.trf/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.swissTrf.Output.Ok.Headers + /// - Remark: Generated from `#/paths/swiss/{id}.trf/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/swiss/{id}.trf/GET/responses/200/content/text\/plain`. + case plainText(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.plainText`. + /// + /// - Throws: An error if `self` is not `.plainText`. + /// - SeeAlso: `.plainText`. + internal var plainText: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .plainText(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.swissTrf.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.swissTrf.Output.Ok.Headers = .init(), + body: Operations.swissTrf.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The TRF representation of a Swiss tournament. + /// + /// - Remark: Generated from `#/paths//swiss/{id}.trf/get(swissTrf)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.swissTrf.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.swissTrf.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case plainText + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "text/plain": + self = .plainText + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .plainText: + return "text/plain" + } + } + internal static var allCases: [Self] { + [ + .plainText + ] + } + } + } + /// 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 enum gamesBySwiss { + internal static let id: Swift.String = "gamesBySwiss" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/games/GET/path`. + internal struct Path: Sendable, Hashable { + /// The tournament ID. + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/games/GET/path/id`. + internal var id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - id: The tournament ID. + internal init(id: Swift.String) { + self.id = id + } + } + internal var path: Operations.gamesBySwiss.Input.Path + /// - Remark: Generated from `#/paths/api/swiss/{id}/games/GET/query`. + internal struct Query: Sendable, Hashable { + /// Only the games played by a given player + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/games/GET/query/player`. + internal var player: Swift.String? + /// Include the PGN moves. + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/games/GET/query/moves`. + internal var moves: Swift.Bool? + /// Include the full PGN within the JSON response, in a `pgn` field. + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/games/GET/query/pgnInJson`. + internal var pgnInJson: Swift.Bool? + /// Include the PGN tags. + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/games/GET/query/tags`. + internal var tags: Swift.Bool? + /// Include clock status when available. + /// Either as PGN comments: `2. exd5 { [%clk 1:01:27] } e5 { [%clk 1:01:28] }` + /// Or in a `clocks` JSON field, as centisecond integers, depending on the response type. + /// + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/games/GET/query/clocks`. + internal var clocks: Swift.Bool? + /// Include analysis evaluations and comments, when available. + /// Either as PGN comments: `12. Bxf6 { [%eval 0.23] } a3 { [%eval -1.09] }` + /// Or in an `analysis` JSON field, depending on the response type. + /// + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/games/GET/query/evals`. + internal var evals: Swift.Bool? + /// Include [accuracy percent](https://lichess.org/page/accuracy) of each player, when available. + /// + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/games/GET/query/accuracy`. + internal var accuracy: Swift.Bool? + /// Include the opening name. + /// Example: `[Opening "King's Gambit Accepted, King's Knight Gambit"]` + /// + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/games/GET/query/opening`. + internal var opening: Swift.Bool? + /// Plies which mark the beginning of the middlegame and endgame. + /// Only available in JSON + /// + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/games/GET/query/division`. + internal var division: Swift.Bool? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - player: Only the games played by a given player + /// - moves: Include the PGN moves. + /// - pgnInJson: Include the full PGN within the JSON response, in a `pgn` field. + /// - tags: Include the PGN tags. + /// - clocks: Include clock status when available. + /// - evals: Include analysis evaluations and comments, when available. + /// - accuracy: Include [accuracy percent](https://lichess.org/page/accuracy) of each player, when available. + /// - opening: Include the opening name. + /// - division: Plies which mark the beginning of the middlegame and endgame. + internal init( + player: Swift.String? = nil, + moves: Swift.Bool? = nil, + pgnInJson: Swift.Bool? = nil, + tags: Swift.Bool? = nil, + clocks: Swift.Bool? = nil, + evals: Swift.Bool? = nil, + accuracy: Swift.Bool? = nil, + opening: Swift.Bool? = nil, + division: Swift.Bool? = nil + ) { + self.player = player + self.moves = moves + self.pgnInJson = pgnInJson + self.tags = tags + self.clocks = clocks + self.evals = evals + self.accuracy = accuracy + self.opening = opening + self.division = division + } + } + internal var query: Operations.gamesBySwiss.Input.Query + /// - Remark: Generated from `#/paths/api/swiss/{id}/games/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.gamesBySwiss.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.gamesBySwiss.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.gamesBySwiss.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + internal init( + path: Operations.gamesBySwiss.Input.Path, + query: Operations.gamesBySwiss.Input.Query = .init(), + headers: Operations.gamesBySwiss.Input.Headers = .init() + ) { + self.path = path + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/games/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/games/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.gamesBySwiss.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/swiss/{id}/games/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/games/GET/responses/200/content/application\/x-chess-pgn`. + case application_x_hyphen_chess_hyphen_pgn(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_chess_hyphen_pgn`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_chess_hyphen_pgn`. + /// - SeeAlso: `.application_x_hyphen_chess_hyphen_pgn`. + internal var application_x_hyphen_chess_hyphen_pgn: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_chess_hyphen_pgn(body): + return body + default: + try throwUnexpectedResponseBody( + expectedContent: "application/x-chess-pgn", + body: self + ) + } + } + } + /// - Remark: Generated from `#/paths/api/swiss/{id}/games/GET/responses/200/content/application\/x-ndjson`. + case application_x_hyphen_ndjson(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_ndjson`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_ndjson`. + /// - SeeAlso: `.application_x_hyphen_ndjson`. + internal var application_x_hyphen_ndjson: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_ndjson(body): + return body + default: + try throwUnexpectedResponseBody( + expectedContent: "application/x-ndjson", + body: self + ) + } + } + } + } + /// Received HTTP response body + internal var body: Operations.gamesBySwiss.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.gamesBySwiss.Output.Ok.Headers = .init(), + body: Operations.gamesBySwiss.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The list of games of a Swiss tournament. + /// + /// - Remark: Generated from `#/paths//api/swiss/{id}/games/get(gamesBySwiss)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.gamesBySwiss.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.gamesBySwiss.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_chess_hyphen_pgn + case application_x_hyphen_ndjson + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-chess-pgn": + self = .application_x_hyphen_chess_hyphen_pgn + case "application/x-ndjson": + self = .application_x_hyphen_ndjson + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_chess_hyphen_pgn: + return "application/x-chess-pgn" + case .application_x_hyphen_ndjson: + return "application/x-ndjson" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_chess_hyphen_pgn, + .application_x_hyphen_ndjson + ] + } + } + } + /// 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 enum resultsBySwiss { + internal static let id: Swift.String = "resultsBySwiss" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/results/GET/path`. + internal struct Path: Sendable, Hashable { + /// The tournament ID. + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/results/GET/path/id`. + internal var id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - id: The tournament ID. + internal init(id: Swift.String) { + self.id = id + } + } + internal var path: Operations.resultsBySwiss.Input.Path + /// - Remark: Generated from `#/paths/api/swiss/{id}/results/GET/query`. + internal struct Query: Sendable, Hashable { + /// Max number of players to fetch + /// + /// - Remark: Generated from `#/paths/api/swiss/{id}/results/GET/query/nb`. + internal var nb: Swift.Int? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - nb: Max number of players to fetch + internal init(nb: Swift.Int? = nil) { + self.nb = nb + } + } + internal var query: Operations.resultsBySwiss.Input.Query + /// - Remark: Generated from `#/paths/api/swiss/{id}/results/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.resultsBySwiss.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.resultsBySwiss.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.resultsBySwiss.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + internal init( + path: Operations.resultsBySwiss.Input.Path, + query: Operations.resultsBySwiss.Input.Query = .init(), + headers: Operations.resultsBySwiss.Input.Headers = .init() + ) { + self.path = path + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/results/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/results/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.resultsBySwiss.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/swiss/{id}/results/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/swiss/{id}/results/GET/responses/200/content/application\/x-ndjson`. + case application_x_hyphen_ndjson(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_ndjson`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_ndjson`. + /// - SeeAlso: `.application_x_hyphen_ndjson`. + internal var application_x_hyphen_ndjson: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_ndjson(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.resultsBySwiss.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.resultsBySwiss.Output.Ok.Headers = .init(), + body: Operations.resultsBySwiss.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The results of a Swiss tournament. + /// + /// - Remark: Generated from `#/paths//api/swiss/{id}/results/get(resultsBySwiss)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.resultsBySwiss.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.resultsBySwiss.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_ndjson + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-ndjson": + self = .application_x_hyphen_ndjson + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_ndjson: + return "application/x-ndjson" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_ndjson + ] + } + } + } + /// 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 enum apiTeamSwiss { + internal static let id: Swift.String = "apiTeamSwiss" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/swiss/GET/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/swiss/GET/path/teamId`. + internal var teamId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - teamId: + internal init(teamId: Swift.String) { + self.teamId = teamId + } + } + internal var path: Operations.apiTeamSwiss.Input.Path + /// - Remark: Generated from `#/paths/api/team/{teamId}/swiss/GET/query`. + internal struct Query: Sendable, Hashable { + /// How many tournaments to download. + /// + /// - Remark: Generated from `#/paths/api/team/{teamId}/swiss/GET/query/max`. + internal var max: Swift.Int? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - max: How many tournaments to download. + internal init(max: Swift.Int? = nil) { + self.max = max + } + } + internal var query: Operations.apiTeamSwiss.Input.Query + /// - Remark: Generated from `#/paths/api/team/{teamId}/swiss/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiTeamSwiss.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiTeamSwiss.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiTeamSwiss.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + internal init( + path: Operations.apiTeamSwiss.Input.Path, + query: Operations.apiTeamSwiss.Input.Query = .init(), + headers: Operations.apiTeamSwiss.Input.Headers = .init() + ) { + self.path = path + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/swiss/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/swiss/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiTeamSwiss.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/team/{teamId}/swiss/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/swiss/GET/responses/200/content/application\/nd-json`. + case application_nd_hyphen_json(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_nd_hyphen_json`. + /// + /// - Throws: An error if `self` is not `.application_nd_hyphen_json`. + /// - SeeAlso: `.application_nd_hyphen_json`. + internal var application_nd_hyphen_json: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_nd_hyphen_json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiTeamSwiss.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiTeamSwiss.Output.Ok.Headers = .init(), + body: Operations.apiTeamSwiss.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The list of Swiss tournaments of a team. + /// + /// - Remark: Generated from `#/paths//api/team/{teamId}/swiss/get(apiTeamSwiss)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiTeamSwiss.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiTeamSwiss.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_nd_hyphen_json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/nd-json": + self = .application_nd_hyphen_json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_nd_hyphen_json: + return "application/nd-json" + } + } + internal static var allCases: [Self] { + [ + .application_nd_hyphen_json + ] + } + } + } + /// 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 enum studyChapterPgn { + internal static let id: Swift.String = "studyChapterPgn" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/study/{studyId}/{chapterId}.pgn/GET/path`. + internal struct Path: Sendable, Hashable { + /// The study ID (8 characters). + /// + /// - Remark: Generated from `#/paths/api/study/{studyId}/{chapterId}.pgn/GET/path/studyId`. + internal var studyId: Swift.String + /// The chapter ID (8 characters). + /// + /// - Remark: Generated from `#/paths/api/study/{studyId}/{chapterId}.pgn/GET/path/chapterId`. + internal var chapterId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - studyId: The study ID (8 characters). + /// - chapterId: The chapter ID (8 characters). + internal init( + studyId: Swift.String, + chapterId: Swift.String + ) { + self.studyId = studyId + self.chapterId = chapterId + } + } + internal var path: Operations.studyChapterPgn.Input.Path + /// - Remark: Generated from `#/paths/api/study/{studyId}/{chapterId}.pgn/GET/query`. + internal struct Query: Sendable, Hashable { + /// Include clock comments in the PGN moves, when available. + /// Example: `2. exd5 { [%clk 1:01:27] } e5 { [%clk 1:01:28] }` + /// + /// + /// - Remark: Generated from `#/paths/api/study/{studyId}/{chapterId}.pgn/GET/query/clocks`. + internal var clocks: Swift.Bool? + /// Include analysis and annotator comments in the PGN moves, when available. + /// Example: `12. Bxf6 { [%eval 0.23] } a3 { White is in a pickle. }` + /// + /// + /// - Remark: Generated from `#/paths/api/study/{studyId}/{chapterId}.pgn/GET/query/comments`. + internal var comments: Swift.Bool? + /// Include non-mainline moves, when available. + /// Example: `4. d4 Bb4+ (4... Nc6 5. Nf3 Bb4+ 6. Bd2 (6. Nbd2 O-O 7. O-O) 6... Bd6) 5. Nd2` + /// + /// + /// - Remark: Generated from `#/paths/api/study/{studyId}/{chapterId}.pgn/GET/query/variations`. + internal var variations: Swift.Bool? + /// Add a `Source` PGN tag with the study chapter URL. + /// Example: `[Source "https://lichess.org/study/4NBHImfM/1Tk4IyTz"]` + /// + /// + /// - Remark: Generated from `#/paths/api/study/{studyId}/{chapterId}.pgn/GET/query/source`. + internal var source: Swift.Bool? + /// Add a `Orientation` PGN tag with the chapter predefined orientation. + /// Example: `[Orientation "white"]` + /// + /// + /// - Remark: Generated from `#/paths/api/study/{studyId}/{chapterId}.pgn/GET/query/orientation`. + internal var orientation: Swift.Bool? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - clocks: Include clock comments in the PGN moves, when available. + /// - comments: Include analysis and annotator comments in the PGN moves, when available. + /// - variations: Include non-mainline moves, when available. + /// - source: Add a `Source` PGN tag with the study chapter URL. + /// - orientation: Add a `Orientation` PGN tag with the chapter predefined orientation. + internal init( + clocks: Swift.Bool? = nil, + comments: Swift.Bool? = nil, + variations: Swift.Bool? = nil, + source: Swift.Bool? = nil, + orientation: Swift.Bool? = nil + ) { + self.clocks = clocks + self.comments = comments + self.variations = variations + self.source = source + self.orientation = orientation + } + } + internal var query: Operations.studyChapterPgn.Input.Query + /// - Remark: Generated from `#/paths/api/study/{studyId}/{chapterId}.pgn/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.studyChapterPgn.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.studyChapterPgn.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.studyChapterPgn.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + internal init( + path: Operations.studyChapterPgn.Input.Path, + query: Operations.studyChapterPgn.Input.Query = .init(), + headers: Operations.studyChapterPgn.Input.Headers = .init() + ) { + self.path = path + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/study/{studyId}/{chapterId}.pgn/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/study/{studyId}/{chapterId}.pgn/GET/responses/200/content/application\/x-chess-pgn`. + case application_x_hyphen_chess_hyphen_pgn(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_chess_hyphen_pgn`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_chess_hyphen_pgn`. + /// - SeeAlso: `.application_x_hyphen_chess_hyphen_pgn`. + internal var application_x_hyphen_chess_hyphen_pgn: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_chess_hyphen_pgn(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.studyChapterPgn.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.studyChapterPgn.Output.Ok.Body) { + self.body = body + } + } + /// The chapter of the study. + /// + /// - Remark: Generated from `#/paths//api/study/{studyId}/{chapterId}.pgn/get(studyChapterPgn)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.studyChapterPgn.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.studyChapterPgn.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_chess_hyphen_pgn + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-chess-pgn": + self = .application_x_hyphen_chess_hyphen_pgn + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_chess_hyphen_pgn: + return "application/x-chess-pgn" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_chess_hyphen_pgn + ] + } + } + } + /// 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 enum studyAllChaptersPgn { + internal static let id: Swift.String = "studyAllChaptersPgn" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/study/{studyId}.pgn/GET/path`. + internal struct Path: Sendable, Hashable { + /// The study ID (8 characters). + /// + /// - Remark: Generated from `#/paths/api/study/{studyId}.pgn/GET/path/studyId`. + internal var studyId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - studyId: The study ID (8 characters). + internal init(studyId: Swift.String) { + self.studyId = studyId + } + } + internal var path: Operations.studyAllChaptersPgn.Input.Path + /// - Remark: Generated from `#/paths/api/study/{studyId}.pgn/GET/query`. + internal struct Query: Sendable, Hashable { + /// Include clock comments in the PGN moves, when available. + /// Example: `2. exd5 { [%clk 1:01:27] } e5 { [%clk 1:01:28] }` + /// + /// + /// - Remark: Generated from `#/paths/api/study/{studyId}.pgn/GET/query/clocks`. + internal var clocks: Swift.Bool? + /// Include analysis and annotator comments in the PGN moves, when available. + /// Example: `12. Bxf6 { [%eval 0.23] } a3 { White is in a pickle. }` + /// + /// + /// - Remark: Generated from `#/paths/api/study/{studyId}.pgn/GET/query/comments`. + internal var comments: Swift.Bool? + /// Include non-mainline moves, when available. + /// Example: `4. d4 Bb4+ (4... Nc6 5. Nf3 Bb4+ 6. Bd2 (6. Nbd2 O-O 7. O-O) 6... Bd6) 5. Nd2` + /// + /// + /// - Remark: Generated from `#/paths/api/study/{studyId}.pgn/GET/query/variations`. + internal var variations: Swift.Bool? + /// Add a `Source` PGN tag with the study chapter URL. + /// Example: `[Source "https://lichess.org/study/4NBHImfM/1Tk4IyTz"]` + /// + /// + /// - Remark: Generated from `#/paths/api/study/{studyId}.pgn/GET/query/source`. + internal var source: Swift.Bool? + /// Add a `Orientation` PGN tag with the chapter predefined orientation. + /// Example: `[Orientation "white"]` + /// + /// + /// - Remark: Generated from `#/paths/api/study/{studyId}.pgn/GET/query/orientation`. + internal var orientation: Swift.Bool? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - clocks: Include clock comments in the PGN moves, when available. + /// - comments: Include analysis and annotator comments in the PGN moves, when available. + /// - variations: Include non-mainline moves, when available. + /// - source: Add a `Source` PGN tag with the study chapter URL. + /// - orientation: Add a `Orientation` PGN tag with the chapter predefined orientation. + internal init( + clocks: Swift.Bool? = nil, + comments: Swift.Bool? = nil, + variations: Swift.Bool? = nil, + source: Swift.Bool? = nil, + orientation: Swift.Bool? = nil + ) { + self.clocks = clocks + self.comments = comments + self.variations = variations + self.source = source + self.orientation = orientation + } + } + internal var query: Operations.studyAllChaptersPgn.Input.Query + /// - Remark: Generated from `#/paths/api/study/{studyId}.pgn/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.studyAllChaptersPgn.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.studyAllChaptersPgn.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.studyAllChaptersPgn.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + internal init( + path: Operations.studyAllChaptersPgn.Input.Path, + query: Operations.studyAllChaptersPgn.Input.Query = .init(), + headers: Operations.studyAllChaptersPgn.Input.Headers = .init() + ) { + self.path = path + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/study/{studyId}.pgn/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/study/{studyId}.pgn/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// - Remark: Generated from `#/paths/api/study/{studyId}.pgn/GET/responses/200/headers/Last-Modified`. + internal var Last_hyphen_Modified: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + /// - Last_hyphen_Modified: + internal init( + Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil, + Last_hyphen_Modified: Swift.String? = nil + ) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + self.Last_hyphen_Modified = Last_hyphen_Modified + } + } + /// Received HTTP response headers + internal var headers: Operations.studyAllChaptersPgn.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/study/{studyId}.pgn/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/study/{studyId}.pgn/GET/responses/200/content/application\/x-chess-pgn`. + case application_x_hyphen_chess_hyphen_pgn(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_chess_hyphen_pgn`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_chess_hyphen_pgn`. + /// - SeeAlso: `.application_x_hyphen_chess_hyphen_pgn`. + internal var application_x_hyphen_chess_hyphen_pgn: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_chess_hyphen_pgn(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.studyAllChaptersPgn.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.studyAllChaptersPgn.Output.Ok.Headers = .init(), + body: Operations.studyAllChaptersPgn.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The PGN representation of the study. + /// + /// - Remark: Generated from `#/paths//api/study/{studyId}.pgn/get(studyAllChaptersPgn)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.studyAllChaptersPgn.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.studyAllChaptersPgn.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_chess_hyphen_pgn + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-chess-pgn": + self = .application_x_hyphen_chess_hyphen_pgn + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_chess_hyphen_pgn: + return "application/x-chess-pgn" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_chess_hyphen_pgn + ] + } + } + } + /// 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 enum studyAllChaptersHead { + internal static let id: Swift.String = "studyAllChaptersHead" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/study/{studyId}.pgn/HEAD/path`. + internal struct Path: Sendable, Hashable { + /// The study ID (8 characters). + /// + /// - Remark: Generated from `#/paths/api/study/{studyId}.pgn/HEAD/path/studyId`. + internal var studyId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - studyId: The study ID (8 characters). + internal init(studyId: Swift.String) { + self.studyId = studyId + } + } + internal var path: Operations.studyAllChaptersHead.Input.Path + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + internal init(path: Operations.studyAllChaptersHead.Input.Path) { + self.path = path + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/study/{studyId}.pgn/HEAD/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/study/{studyId}.pgn/HEAD/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// - Remark: Generated from `#/paths/api/study/{studyId}.pgn/HEAD/responses/200/headers/Last-Modified`. + internal var Last_hyphen_Modified: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + /// - Last_hyphen_Modified: + internal init( + Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil, + Last_hyphen_Modified: Swift.String? = nil + ) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + self.Last_hyphen_Modified = Last_hyphen_Modified + } + } + /// Received HTTP response headers + internal var headers: Operations.studyAllChaptersHead.Output.Ok.Headers + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + internal init(headers: Operations.studyAllChaptersHead.Output.Ok.Headers = .init()) { + self.headers = headers + } + } + /// The study headers. + /// + /// - Remark: Generated from `#/paths//api/study/{studyId}.pgn/head(studyAllChaptersHead)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.studyAllChaptersHead.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.studyAllChaptersHead.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// 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 enum apiStudyImportPGN { + internal static let id: Swift.String = "apiStudyImportPGN" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/study/{studyId}/import-pgn/POST/path`. + internal struct Path: Sendable, Hashable { + /// ID of the study + /// + /// - Remark: Generated from `#/paths/api/study/{studyId}/import-pgn/POST/path/studyId`. + internal var studyId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - studyId: ID of the study + internal init(studyId: Swift.String) { + self.studyId = studyId + } + } + internal var path: Operations.apiStudyImportPGN.Input.Path + /// - Remark: Generated from `#/paths/api/study/{studyId}/import-pgn/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiStudyImportPGN.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiStudyImportPGN.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiStudyImportPGN.Input.Headers + /// - Remark: Generated from `#/paths/api/study/{studyId}/import-pgn/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/study/{studyId}/import-pgn/POST/requestBody/urlEncodedForm`. + internal struct urlEncodedFormPayload: Codable, Hashable, Sendable { + /// Name of the new chapter. + /// If multiple chapters are created, the names will be infered from the PGN tags. + /// + /// + /// - Remark: Generated from `#/paths/api/study/{studyId}/import-pgn/POST/requestBody/urlEncodedForm/name`. + internal var name: Swift.String + /// PGN to import. Can contain multiple games separated by 2 or more newlines. + /// + /// + /// - Remark: Generated from `#/paths/api/study/{studyId}/import-pgn/POST/requestBody/urlEncodedForm/pgn`. + internal var pgn: Swift.String + /// Default board orientation. + /// + /// - Remark: Generated from `#/paths/api/study/{studyId}/import-pgn/POST/requestBody/urlEncodedForm/orientation`. + @frozen internal enum orientationPayload: String, Codable, Hashable, Sendable { + case white = "white" + case black = "black" + } + /// Default board orientation. + /// + /// - Remark: Generated from `#/paths/api/study/{studyId}/import-pgn/POST/requestBody/urlEncodedForm/orientation`. + internal var orientation: Operations.apiStudyImportPGN.Input.Body.urlEncodedFormPayload.orientationPayload? + /// - Remark: Generated from `#/paths/api/study/{studyId}/import-pgn/POST/requestBody/urlEncodedForm/variant`. + internal var variant: Components.Schemas.VariantKey? + /// Creates a new `urlEncodedFormPayload`. + /// + /// - Parameters: + /// - name: Name of the new chapter. + /// - pgn: PGN to import. Can contain multiple games separated by 2 or more newlines. + /// - orientation: Default board orientation. + /// - variant: + internal init( + name: Swift.String, + pgn: Swift.String, + orientation: Operations.apiStudyImportPGN.Input.Body.urlEncodedFormPayload.orientationPayload? = nil, + variant: Components.Schemas.VariantKey? = nil + ) { + self.name = name + self.pgn = pgn + self.orientation = orientation + self.variant = variant + } + internal enum CodingKeys: String, CodingKey { + case name + case pgn + case orientation + case variant + } + } + /// - Remark: Generated from `#/paths/api/study/{studyId}/import-pgn/POST/requestBody/content/application\/x-www-form-urlencoded`. + case urlEncodedForm(Operations.apiStudyImportPGN.Input.Body.urlEncodedFormPayload) + } + internal var body: Operations.apiStudyImportPGN.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + /// - body: + internal init( + path: Operations.apiStudyImportPGN.Input.Path, + headers: Operations.apiStudyImportPGN.Input.Headers = .init(), + body: Operations.apiStudyImportPGN.Input.Body + ) { + self.path = path + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/study/{studyId}/import-pgn/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/study/{studyId}/import-pgn/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiStudyImportPGN.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/study/{studyId}/import-pgn/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/study/{studyId}/import-pgn/POST/responses/200/content/application\/json`. + case json(Components.Schemas.StudyImportPgnChapters) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.StudyImportPgnChapters { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiStudyImportPGN.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiStudyImportPGN.Output.Ok.Headers = .init(), + body: Operations.apiStudyImportPGN.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The chapters that were created. + /// + /// - Remark: Generated from `#/paths//api/study/{studyId}/import-pgn/post(apiStudyImportPGN)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiStudyImportPGN.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiStudyImportPGN.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/study/{studyId}/import-pgn/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/study/{studyId}/import-pgn/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiStudyImportPGN.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.apiStudyImportPGN.Output.BadRequest.Body) { + self.body = body + } + } + /// The creation of the chapter(s) failed. + /// + /// - Remark: Generated from `#/paths//api/study/{studyId}/import-pgn/post(apiStudyImportPGN)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.apiStudyImportPGN.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.apiStudyImportPGN.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum studyExportAllPgn { + internal static let id: Swift.String = "studyExportAllPgn" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/study/by/{username}/export.pgn/GET/path`. + internal struct Path: Sendable, Hashable { + /// The user whose studies we export + /// + /// - Remark: Generated from `#/paths/study/by/{username}/export.pgn/GET/path/username`. + internal var username: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - username: The user whose studies we export + internal init(username: Swift.String) { + self.username = username + } + } + internal var path: Operations.studyExportAllPgn.Input.Path + /// - Remark: Generated from `#/paths/study/by/{username}/export.pgn/GET/query`. + internal struct Query: Sendable, Hashable { + /// Include clock comments in the PGN moves, when available. + /// Example: `2. exd5 { [%clk 1:01:27] } e5 { [%clk 1:01:28] }` + /// + /// + /// - Remark: Generated from `#/paths/study/by/{username}/export.pgn/GET/query/clocks`. + internal var clocks: Swift.Bool? + /// Include analysis and annotator comments in the PGN moves, when available. + /// Example: `12. Bxf6 { [%eval 0.23] } a3 { White is in a pickle. }` + /// + /// + /// - Remark: Generated from `#/paths/study/by/{username}/export.pgn/GET/query/comments`. + internal var comments: Swift.Bool? + /// Include non-mainline moves, when available. + /// Example: `4. d4 Bb4+ (4... Nc6 5. Nf3 Bb4+ 6. Bd2 (6. Nbd2 O-O 7. O-O) 6... Bd6) 5. Nd2` + /// + /// + /// - Remark: Generated from `#/paths/study/by/{username}/export.pgn/GET/query/variations`. + internal var variations: Swift.Bool? + /// Add a `Source` PGN tag with the study chapter URL. + /// Example: `[Source "https://lichess.org/study/4NBHImfM/1Tk4IyTz"]` + /// + /// + /// - Remark: Generated from `#/paths/study/by/{username}/export.pgn/GET/query/source`. + internal var source: Swift.Bool? + /// Add a `Orientation` PGN tag with the chapter predefined orientation. + /// Example: `[Orientation "white"]` + /// + /// + /// - Remark: Generated from `#/paths/study/by/{username}/export.pgn/GET/query/orientation`. + internal var orientation: Swift.Bool? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - clocks: Include clock comments in the PGN moves, when available. + /// - comments: Include analysis and annotator comments in the PGN moves, when available. + /// - variations: Include non-mainline moves, when available. + /// - source: Add a `Source` PGN tag with the study chapter URL. + /// - orientation: Add a `Orientation` PGN tag with the chapter predefined orientation. + internal init( + clocks: Swift.Bool? = nil, + comments: Swift.Bool? = nil, + variations: Swift.Bool? = nil, + source: Swift.Bool? = nil, + orientation: Swift.Bool? = nil + ) { + self.clocks = clocks + self.comments = comments + self.variations = variations + self.source = source + self.orientation = orientation + } + } + internal var query: Operations.studyExportAllPgn.Input.Query + /// - Remark: Generated from `#/paths/study/by/{username}/export.pgn/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.studyExportAllPgn.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.studyExportAllPgn.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.studyExportAllPgn.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + internal init( + path: Operations.studyExportAllPgn.Input.Path, + query: Operations.studyExportAllPgn.Input.Query = .init(), + headers: Operations.studyExportAllPgn.Input.Headers = .init() + ) { + self.path = path + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/study/by/{username}/export.pgn/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/study/by/{username}/export.pgn/GET/responses/200/content/application\/x-chess-pgn`. + case application_x_hyphen_chess_hyphen_pgn(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_chess_hyphen_pgn`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_chess_hyphen_pgn`. + /// - SeeAlso: `.application_x_hyphen_chess_hyphen_pgn`. + internal var application_x_hyphen_chess_hyphen_pgn: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_chess_hyphen_pgn(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.studyExportAllPgn.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.studyExportAllPgn.Output.Ok.Body) { + self.body = body + } + } + /// The studies of the user. + /// + /// - Remark: Generated from `#/paths//study/by/{username}/export.pgn/get(studyExportAllPgn)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.studyExportAllPgn.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.studyExportAllPgn.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_chess_hyphen_pgn + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-chess-pgn": + self = .application_x_hyphen_chess_hyphen_pgn + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_chess_hyphen_pgn: + return "application/x-chess-pgn" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_chess_hyphen_pgn + ] + } + } + } + /// 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 enum studyListMetadata { + internal static let id: Swift.String = "studyListMetadata" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/study/by/{username}/GET/path`. + internal struct Path: Sendable, Hashable { + /// The user whose studies we list + /// + /// - Remark: Generated from `#/paths/api/study/by/{username}/GET/path/username`. + internal var username: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - username: The user whose studies we list + internal init(username: Swift.String) { + self.username = username + } + } + internal var path: Operations.studyListMetadata.Input.Path + /// - Remark: Generated from `#/paths/api/study/by/{username}/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.studyListMetadata.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.studyListMetadata.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.studyListMetadata.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.studyListMetadata.Input.Path, + headers: Operations.studyListMetadata.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/study/by/{username}/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/study/by/{username}/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.studyListMetadata.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/study/by/{username}/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/study/by/{username}/GET/responses/200/content/application\/x-ndjson`. + case application_x_hyphen_ndjson(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_ndjson`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_ndjson`. + /// - SeeAlso: `.application_x_hyphen_ndjson`. + internal var application_x_hyphen_ndjson: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_ndjson(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.studyListMetadata.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.studyListMetadata.Output.Ok.Headers = .init(), + body: Operations.studyListMetadata.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The list of studies. + /// + /// - Remark: Generated from `#/paths//api/study/by/{username}/get(studyListMetadata)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.studyListMetadata.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.studyListMetadata.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_ndjson + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-ndjson": + self = .application_x_hyphen_ndjson + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_ndjson: + return "application/x-ndjson" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_ndjson + ] + } + } + } + /// 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 enum apiStudyStudyIdChapterIdDelete { + internal static let id: Swift.String = "apiStudyStudyIdChapterIdDelete" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/study/{studyId}/{chapterId}/DELETE/path`. + internal struct Path: Sendable, Hashable { + /// The study ID (8 characters). + /// + /// - Remark: Generated from `#/paths/api/study/{studyId}/{chapterId}/DELETE/path/studyId`. + internal var studyId: Swift.String + /// The chapter ID (8 characters). + /// + /// - Remark: Generated from `#/paths/api/study/{studyId}/{chapterId}/DELETE/path/chapterId`. + internal var chapterId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - studyId: The study ID (8 characters). + /// - chapterId: The chapter ID (8 characters). + internal init( + studyId: Swift.String, + chapterId: Swift.String + ) { + self.studyId = studyId + self.chapterId = chapterId + } + } + internal var path: Operations.apiStudyStudyIdChapterIdDelete.Input.Path + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + internal init(path: Operations.apiStudyStudyIdChapterIdDelete.Input.Path) { + self.path = path + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct NoContent: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/study/{studyId}/{chapterId}/DELETE/responses/204/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/study/{studyId}/{chapterId}/DELETE/responses/204/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiStudyStudyIdChapterIdDelete.Output.NoContent.Headers + /// Creates a new `NoContent`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + internal init(headers: Operations.apiStudyStudyIdChapterIdDelete.Output.NoContent.Headers = .init()) { + self.headers = headers + } + } + /// Chapter successfully deleted + /// + /// - Remark: Generated from `#/paths//api/study/{studyId}/{chapterId}/delete(apiStudyStudyIdChapterIdDelete)/responses/204`. + /// + /// HTTP response code: `204 noContent`. + case noContent(Operations.apiStudyStudyIdChapterIdDelete.Output.NoContent) + /// The associated value of the enum case if `self` is `.noContent`. + /// + /// - Throws: An error if `self` is not `.noContent`. + /// - SeeAlso: `.noContent`. + internal var noContent: Operations.apiStudyStudyIdChapterIdDelete.Output.NoContent { + get throws { + switch self { + case let .noContent(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "noContent", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// 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 enum broadcastIndex { + internal static let id: Swift.String = "broadcastIndex" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/broadcast/GET/query`. + internal struct Query: Sendable, Hashable { + /// Max number of broadcasts to fetch + /// + /// - Remark: Generated from `#/paths/api/broadcast/GET/query/nb`. + internal var nb: Swift.Int? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - nb: Max number of broadcasts to fetch + internal init(nb: Swift.Int? = nil) { + self.nb = nb + } + } + internal var query: Operations.broadcastIndex.Input.Query + /// - Remark: Generated from `#/paths/api/broadcast/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.broadcastIndex.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.broadcastIndex.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.broadcastIndex.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - query: + /// - headers: + internal init( + query: Operations.broadcastIndex.Input.Query = .init(), + headers: Operations.broadcastIndex.Input.Headers = .init() + ) { + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/broadcast/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/broadcast/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.broadcastIndex.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/broadcast/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/broadcast/GET/responses/200/content/application\/x-ndjson`. + case application_x_hyphen_ndjson(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_ndjson`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_ndjson`. + /// - SeeAlso: `.application_x_hyphen_ndjson`. + internal var application_x_hyphen_ndjson: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_ndjson(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.broadcastIndex.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.broadcastIndex.Output.Ok.Headers = .init(), + body: Operations.broadcastIndex.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The list of official broadcasts. + /// + /// - Remark: Generated from `#/paths//api/broadcast/get(broadcastIndex)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.broadcastIndex.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.broadcastIndex.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_ndjson + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-ndjson": + self = .application_x_hyphen_ndjson + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_ndjson: + return "application/x-ndjson" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_ndjson + ] + } + } + } + /// 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 enum broadcastTourCreate { + internal static let id: Swift.String = "broadcastTourCreate" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/new/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.broadcastTourCreate.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.broadcastTourCreate.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.broadcastTourCreate.Input.Headers + /// - Remark: Generated from `#/paths/broadcast/new/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/new/POST/requestBody/content/application\/x-www-form-urlencoded`. + case urlEncodedForm(Components.Schemas.BroadcastForm) + } + internal var body: Operations.broadcastTourCreate.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + /// - body: + internal init( + headers: Operations.broadcastTourCreate.Input.Headers = .init(), + body: Operations.broadcastTourCreate.Input.Body + ) { + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/new/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/new/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.broadcastTourCreate.Output.Ok.Headers + /// - Remark: Generated from `#/paths/broadcast/new/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/new/POST/responses/200/content/application\/json`. + case json(Components.Schemas.BroadcastTour) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.BroadcastTour { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.broadcastTourCreate.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.broadcastTourCreate.Output.Ok.Headers = .init(), + body: Operations.broadcastTourCreate.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The broadcast tournament was successfully created. + /// + /// - Remark: Generated from `#/paths//broadcast/new/post(broadcastTourCreate)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.broadcastTourCreate.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.broadcastTourCreate.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/new/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/new/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.broadcastTourCreate.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.broadcastTourCreate.Output.BadRequest.Body) { + self.body = body + } + } + /// The creation of the broadcast tournament failed. + /// + /// - Remark: Generated from `#/paths//broadcast/new/post(broadcastTourCreate)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.broadcastTourCreate.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.broadcastTourCreate.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum broadcastTourGet { + internal static let id: Swift.String = "broadcastTourGet" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/broadcast/{broadcastTournamentId}/GET/path`. + internal struct Path: Sendable, Hashable { + /// The broadcast tournament ID (8 characters). + /// + /// - Remark: Generated from `#/paths/api/broadcast/{broadcastTournamentId}/GET/path/broadcastTournamentId`. + internal var broadcastTournamentId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - broadcastTournamentId: The broadcast tournament ID (8 characters). + internal init(broadcastTournamentId: Swift.String) { + self.broadcastTournamentId = broadcastTournamentId + } + } + internal var path: Operations.broadcastTourGet.Input.Path + /// - Remark: Generated from `#/paths/api/broadcast/{broadcastTournamentId}/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.broadcastTourGet.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.broadcastTourGet.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.broadcastTourGet.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.broadcastTourGet.Input.Path, + headers: Operations.broadcastTourGet.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/broadcast/{broadcastTournamentId}/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/broadcast/{broadcastTournamentId}/GET/responses/200/content/application\/json`. + case json(Components.Schemas.BroadcastTour) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.BroadcastTour { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.broadcastTourGet.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.broadcastTourGet.Output.Ok.Body) { + self.body = body + } + } + /// The information about the broadcast tournament. + /// + /// - Remark: Generated from `#/paths//api/broadcast/{broadcastTournamentId}/get(broadcastTourGet)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.broadcastTourGet.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.broadcastTourGet.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum broadcastLeaderboardGet { + internal static let id: Swift.String = "broadcastLeaderboardGet" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/leaderboard/GET/path`. + internal struct Path: Sendable, Hashable { + /// The broadcast tournament ID (8 characters). + /// + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/leaderboard/GET/path/broadcastTournamentId`. + internal var broadcastTournamentId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - broadcastTournamentId: The broadcast tournament ID (8 characters). + internal init(broadcastTournamentId: Swift.String) { + self.broadcastTournamentId = broadcastTournamentId + } + } + internal var path: Operations.broadcastLeaderboardGet.Input.Path + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/leaderboard/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.broadcastLeaderboardGet.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.broadcastLeaderboardGet.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.broadcastLeaderboardGet.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.broadcastLeaderboardGet.Input.Path, + headers: Operations.broadcastLeaderboardGet.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/leaderboard/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/leaderboard/GET/responses/200/content/application\/json`. + case json([Components.Schemas.BroadcastLeaderboardEntry]) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: [Components.Schemas.BroadcastLeaderboardEntry] { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.broadcastLeaderboardGet.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.broadcastLeaderboardGet.Output.Ok.Body) { + self.body = body + } + } + /// The broadcast leaderboard players + /// + /// - Remark: Generated from `#/paths//broadcast/{broadcastTournamentId}/leaderboard/get(broadcastLeaderboardGet)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.broadcastLeaderboardGet.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.broadcastLeaderboardGet.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum broadcastTourUpdate { + internal static let id: Swift.String = "broadcastTourUpdate" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/edit/POST/path`. + internal struct Path: Sendable, Hashable { + /// The broadcast ID (8 characters). + /// + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/edit/POST/path/broadcastTournamentId`. + internal var broadcastTournamentId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - broadcastTournamentId: The broadcast ID (8 characters). + internal init(broadcastTournamentId: Swift.String) { + self.broadcastTournamentId = broadcastTournamentId + } + } + internal var path: Operations.broadcastTourUpdate.Input.Path + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/edit/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.broadcastTourUpdate.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.broadcastTourUpdate.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.broadcastTourUpdate.Input.Headers + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/edit/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/edit/POST/requestBody/content/application\/x-www-form-urlencoded`. + case urlEncodedForm(Components.Schemas.BroadcastForm) + } + internal var body: Operations.broadcastTourUpdate.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + /// - body: + internal init( + path: Operations.broadcastTourUpdate.Input.Path, + headers: Operations.broadcastTourUpdate.Input.Headers = .init(), + body: Operations.broadcastTourUpdate.Input.Body + ) { + self.path = path + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/edit/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/edit/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.broadcastTourUpdate.Output.Ok.Headers + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/edit/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/edit/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.broadcastTourUpdate.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.broadcastTourUpdate.Output.Ok.Headers = .init(), + body: Operations.broadcastTourUpdate.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The broadcast tournament was successfully edited. + /// + /// - Remark: Generated from `#/paths//broadcast/{broadcastTournamentId}/edit/post(broadcastTourUpdate)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.broadcastTourUpdate.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.broadcastTourUpdate.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/edit/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/edit/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.broadcastTourUpdate.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.broadcastTourUpdate.Output.BadRequest.Body) { + self.body = body + } + } + /// The edition of the broadcast tournament failed. + /// + /// - Remark: Generated from `#/paths//broadcast/{broadcastTournamentId}/edit/post(broadcastTourUpdate)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.broadcastTourUpdate.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.broadcastTourUpdate.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum broadcastRoundCreate { + internal static let id: Swift.String = "broadcastRoundCreate" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/new/POST/path`. + internal struct Path: Sendable, Hashable { + /// The broadcast tournament ID (8 characters). + /// + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/new/POST/path/broadcastTournamentId`. + internal var broadcastTournamentId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - broadcastTournamentId: The broadcast tournament ID (8 characters). + internal init(broadcastTournamentId: Swift.String) { + self.broadcastTournamentId = broadcastTournamentId + } + } + internal var path: Operations.broadcastRoundCreate.Input.Path + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/new/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.broadcastRoundCreate.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.broadcastRoundCreate.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.broadcastRoundCreate.Input.Headers + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/new/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/new/POST/requestBody/urlEncodedForm`. + internal struct urlEncodedFormPayload: Codable, Hashable, Sendable { + /// Name of the broadcast round. Length must be between 3 and 80 characters. + /// Example: `Round 1` + /// + /// + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/new/POST/requestBody/urlEncodedForm/name`. + internal var name: Swift.String + /// URL that Lichess will poll to get updates about the games. It must be publicly accessible from the Internet. + /// Example: `https://myserver.org/myevent/round-10/games.pgn` + /// If the syncUrl is missing, then the broadcast needs to be fed by [pushing PGN to it](#operation/broadcastPush). + /// + /// + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/new/POST/requestBody/urlEncodedForm/syncUrl`. + internal var syncUrl: Swift.String? + /// Required if `syncUrl` contains a livechesscloud link. + /// + /// + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/new/POST/requestBody/urlEncodedForm/syncUrlRound`. + internal var syncUrlRound: Swift.String? + /// Timestamp in milliseconds of broadcast round start. Leave empty to manually start the broadcast round. + /// Example: `1356998400070` + /// + /// + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/new/POST/requestBody/urlEncodedForm/startsAt`. + internal var startsAt: Swift.Int? + /// Delay in seconds for movements to appear on the broadcast. Leave it empty if you don't need it. + /// Example: `900` (15 min) + /// + /// + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/new/POST/requestBody/urlEncodedForm/delay`. + internal var delay: Swift.Int? + /// (Only for Admins) Waiting time for each poll. + /// + /// + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/new/POST/requestBody/urlEncodedForm/period`. + internal var period: Swift.Int? + /// Mark whether the round has been completed. + /// + /// + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/new/POST/requestBody/urlEncodedForm/finished`. + internal var finished: Swift.Bool? + /// Creates a new `urlEncodedFormPayload`. + /// + /// - Parameters: + /// - name: Name of the broadcast round. Length must be between 3 and 80 characters. + /// - syncUrl: URL that Lichess will poll to get updates about the games. It must be publicly accessible from the Internet. + /// - syncUrlRound: Required if `syncUrl` contains a livechesscloud link. + /// - startsAt: Timestamp in milliseconds of broadcast round start. Leave empty to manually start the broadcast round. + /// - delay: Delay in seconds for movements to appear on the broadcast. Leave it empty if you don't need it. + /// - period: (Only for Admins) Waiting time for each poll. + /// - finished: Mark whether the round has been completed. + internal init( + name: Swift.String, + syncUrl: Swift.String? = nil, + syncUrlRound: Swift.String? = nil, + startsAt: Swift.Int? = nil, + delay: Swift.Int? = nil, + period: Swift.Int? = nil, + finished: Swift.Bool? = nil + ) { + self.name = name + self.syncUrl = syncUrl + self.syncUrlRound = syncUrlRound + self.startsAt = startsAt + self.delay = delay + self.period = period + self.finished = finished + } + internal enum CodingKeys: String, CodingKey { + case name + case syncUrl + case syncUrlRound + case startsAt + case delay + case period + case finished + } + } + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/new/POST/requestBody/content/application\/x-www-form-urlencoded`. + case urlEncodedForm(Operations.broadcastRoundCreate.Input.Body.urlEncodedFormPayload) + } + internal var body: Operations.broadcastRoundCreate.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + /// - body: + internal init( + path: Operations.broadcastRoundCreate.Input.Path, + headers: Operations.broadcastRoundCreate.Input.Headers = .init(), + body: Operations.broadcastRoundCreate.Input.Body + ) { + self.path = path + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/new/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/new/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.broadcastRoundCreate.Output.Ok.Headers + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/new/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/new/POST/responses/200/content/application\/json`. + case json(Components.Schemas.BroadcastRound) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.BroadcastRound { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.broadcastRoundCreate.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.broadcastRoundCreate.Output.Ok.Headers = .init(), + body: Operations.broadcastRoundCreate.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The broadcast round was successfully created. + /// + /// - Remark: Generated from `#/paths//broadcast/{broadcastTournamentId}/new/post(broadcastRoundCreate)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.broadcastRoundCreate.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.broadcastRoundCreate.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/new/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/{broadcastTournamentId}/new/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.broadcastRoundCreate.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.broadcastRoundCreate.Output.BadRequest.Body) { + self.body = body + } + } + /// The creation of the broadcast failed. + /// + /// - Remark: Generated from `#/paths//broadcast/{broadcastTournamentId}/new/post(broadcastRoundCreate)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.broadcastRoundCreate.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.broadcastRoundCreate.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum broadcastRoundGet { + internal static let id: Swift.String = "broadcastRoundGet" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/broadcast/{broadcastTournamentSlug}/{broadcastRoundSlug}/{broadcastRoundId}/GET/path`. + internal struct Path: Sendable, Hashable { + /// The broadcast tournament slug. Only used for SEO, the slug can be safely replaced by `-`. Only the `broadcastRoundId` is actually used. + /// + /// - Remark: Generated from `#/paths/api/broadcast/{broadcastTournamentSlug}/{broadcastRoundSlug}/{broadcastRoundId}/GET/path/broadcastTournamentSlug`. + internal var broadcastTournamentSlug: Swift.String + /// The broadcast round slug. Only used for SEO, the slug can be safely replaced by `-`. Only the `broadcastRoundId` is actually used. + /// + /// - Remark: Generated from `#/paths/api/broadcast/{broadcastTournamentSlug}/{broadcastRoundSlug}/{broadcastRoundId}/GET/path/broadcastRoundSlug`. + internal var broadcastRoundSlug: Swift.String + /// The broadcast Round ID (8 characters). + /// + /// - Remark: Generated from `#/paths/api/broadcast/{broadcastTournamentSlug}/{broadcastRoundSlug}/{broadcastRoundId}/GET/path/broadcastRoundId`. + internal var broadcastRoundId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - broadcastTournamentSlug: The broadcast tournament slug. Only used for SEO, the slug can be safely replaced by `-`. Only the `broadcastRoundId` is actually used. + /// - broadcastRoundSlug: The broadcast round slug. Only used for SEO, the slug can be safely replaced by `-`. Only the `broadcastRoundId` is actually used. + /// - broadcastRoundId: The broadcast Round ID (8 characters). + internal init( + broadcastTournamentSlug: Swift.String, + broadcastRoundSlug: Swift.String, + broadcastRoundId: Swift.String + ) { + self.broadcastTournamentSlug = broadcastTournamentSlug + self.broadcastRoundSlug = broadcastRoundSlug + self.broadcastRoundId = broadcastRoundId + } + } + internal var path: Operations.broadcastRoundGet.Input.Path + /// - Remark: Generated from `#/paths/api/broadcast/{broadcastTournamentSlug}/{broadcastRoundSlug}/{broadcastRoundId}/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.broadcastRoundGet.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.broadcastRoundGet.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.broadcastRoundGet.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.broadcastRoundGet.Input.Path, + headers: Operations.broadcastRoundGet.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/broadcast/{broadcastTournamentSlug}/{broadcastRoundSlug}/{broadcastRoundId}/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/broadcast/{broadcastTournamentSlug}/{broadcastRoundSlug}/{broadcastRoundId}/GET/responses/200/content/application\/json`. + case json(Components.Schemas.BroadcastRound) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.BroadcastRound { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.broadcastRoundGet.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.broadcastRoundGet.Output.Ok.Body) { + self.body = body + } + } + /// The information about the broadcast round. + /// + /// - Remark: Generated from `#/paths//api/broadcast/{broadcastTournamentSlug}/{broadcastRoundSlug}/{broadcastRoundId}/get(broadcastRoundGet)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.broadcastRoundGet.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.broadcastRoundGet.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum broadcastRoundUpdate { + internal static let id: Swift.String = "broadcastRoundUpdate" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/edit/POST/path`. + internal struct Path: Sendable, Hashable { + /// The broadcast round ID (8 characters). + /// + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/edit/POST/path/broadcastRoundId`. + internal var broadcastRoundId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - broadcastRoundId: The broadcast round ID (8 characters). + internal init(broadcastRoundId: Swift.String) { + self.broadcastRoundId = broadcastRoundId + } + } + internal var path: Operations.broadcastRoundUpdate.Input.Path + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/edit/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.broadcastRoundUpdate.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.broadcastRoundUpdate.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.broadcastRoundUpdate.Input.Headers + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/edit/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/edit/POST/requestBody/urlEncodedForm`. + internal struct urlEncodedFormPayload: Codable, Hashable, Sendable { + /// Name of the broadcast round. Length must be between 3 and 80 characters. + /// Example: `Round 10` + /// + /// + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/edit/POST/requestBody/urlEncodedForm/name`. + internal var name: Swift.String + /// URL that Lichess will poll to get updates about the games. It must be publicly accessible from the Internet. + /// Example: `https://myserver.org/myevent/round-10/games.pgn` + /// + /// + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/edit/POST/requestBody/urlEncodedForm/syncUrl`. + internal var syncUrl: Swift.String? + /// Required if `syncUrl` contains a livechesscloud link. + /// + /// + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/edit/POST/requestBody/urlEncodedForm/syncUrlRound`. + internal var syncUrlRound: Swift.String? + /// Timestamp in milliseconds of broadcast start. Leave empty to manually start the broadcast. + /// Example: `1356998400070` + /// + /// + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/edit/POST/requestBody/urlEncodedForm/startsAt`. + internal var startsAt: Swift.Int? + /// Delay in seconds for movements to appear on the broadcast. Leave it empty if you don't need it. + /// Example: `900` (15 min) + /// + /// + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/edit/POST/requestBody/urlEncodedForm/delay`. + internal var delay: Swift.Int? + /// (Only for Admins) Waiting time for each poll. + /// + /// + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/edit/POST/requestBody/urlEncodedForm/period`. + internal var period: Swift.Int? + /// Mark whether the round has been completed. + /// + /// + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/edit/POST/requestBody/urlEncodedForm/finished`. + internal var finished: Swift.Bool? + /// Creates a new `urlEncodedFormPayload`. + /// + /// - Parameters: + /// - name: Name of the broadcast round. Length must be between 3 and 80 characters. + /// - syncUrl: URL that Lichess will poll to get updates about the games. It must be publicly accessible from the Internet. + /// - syncUrlRound: Required if `syncUrl` contains a livechesscloud link. + /// - startsAt: Timestamp in milliseconds of broadcast start. Leave empty to manually start the broadcast. + /// - delay: Delay in seconds for movements to appear on the broadcast. Leave it empty if you don't need it. + /// - period: (Only for Admins) Waiting time for each poll. + /// - finished: Mark whether the round has been completed. + internal init( + name: Swift.String, + syncUrl: Swift.String? = nil, + syncUrlRound: Swift.String? = nil, + startsAt: Swift.Int? = nil, + delay: Swift.Int? = nil, + period: Swift.Int? = nil, + finished: Swift.Bool? = nil + ) { + self.name = name + self.syncUrl = syncUrl + self.syncUrlRound = syncUrlRound + self.startsAt = startsAt + self.delay = delay + self.period = period + self.finished = finished + } + internal enum CodingKeys: String, CodingKey { + case name + case syncUrl + case syncUrlRound + case startsAt + case delay + case period + case finished + } + } + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/edit/POST/requestBody/content/application\/x-www-form-urlencoded`. + case urlEncodedForm(Operations.broadcastRoundUpdate.Input.Body.urlEncodedFormPayload) + } + internal var body: Operations.broadcastRoundUpdate.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + /// - body: + internal init( + path: Operations.broadcastRoundUpdate.Input.Path, + headers: Operations.broadcastRoundUpdate.Input.Headers = .init(), + body: Operations.broadcastRoundUpdate.Input.Body + ) { + self.path = path + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/edit/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/edit/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.broadcastRoundUpdate.Output.Ok.Headers + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/edit/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/edit/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.broadcastRoundUpdate.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.broadcastRoundUpdate.Output.Ok.Headers = .init(), + body: Operations.broadcastRoundUpdate.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The broadcast round was successfully edited. + /// + /// - Remark: Generated from `#/paths//broadcast/round/{broadcastRoundId}/edit/post(broadcastRoundUpdate)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.broadcastRoundUpdate.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.broadcastRoundUpdate.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/edit/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/edit/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.broadcastRoundUpdate.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.broadcastRoundUpdate.Output.BadRequest.Body) { + self.body = body + } + } + /// The edition of the broadcast tournament failed. + /// + /// - Remark: Generated from `#/paths//broadcast/round/{broadcastRoundId}/edit/post(broadcastRoundUpdate)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.broadcastRoundUpdate.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.broadcastRoundUpdate.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum broadcastPush { + internal static let id: Swift.String = "broadcastPush" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/push/POST/path`. + internal struct Path: Sendable, Hashable { + /// The broadcast round ID (8 characters). + /// + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/push/POST/path/broadcastRoundId`. + internal var broadcastRoundId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - broadcastRoundId: The broadcast round ID (8 characters). + internal init(broadcastRoundId: Swift.String) { + self.broadcastRoundId = broadcastRoundId + } + } + internal var path: Operations.broadcastPush.Input.Path + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/push/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.broadcastPush.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.broadcastPush.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.broadcastPush.Input.Headers + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/push/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/push/POST/requestBody/content/text\/plain`. + case plainText(OpenAPIRuntime.HTTPBody) + } + internal var body: Operations.broadcastPush.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + /// - body: + internal init( + path: Operations.broadcastPush.Input.Path, + headers: Operations.broadcastPush.Input.Headers = .init(), + body: Operations.broadcastPush.Input.Body + ) { + self.path = path + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/push/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/push/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.broadcastPush.Output.Ok.Headers + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/push/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/push/POST/responses/200/content/application\/json`. + case json(Components.Schemas.BroadcastPgnPush) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.BroadcastPgnPush { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.broadcastPush.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.broadcastPush.Output.Ok.Headers = .init(), + body: Operations.broadcastPush.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The broadcast was successfully updated. + /// + /// - Remark: Generated from `#/paths//broadcast/round/{broadcastRoundId}/push/post(broadcastPush)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.broadcastPush.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.broadcastPush.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/push/POST/responses/400/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/push/POST/responses/400/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.broadcastPush.Output.BadRequest.Headers + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/push/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/push/POST/responses/400/content/json`. + internal struct jsonPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/push/POST/responses/400/content/json/error`. + internal var error: Swift.String? + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - error: + internal init(error: Swift.String? = nil) { + self.error = error + } + internal enum CodingKeys: String, CodingKey { + case error + } + } + /// - Remark: Generated from `#/paths/broadcast/round/{broadcastRoundId}/push/POST/responses/400/content/application\/json`. + case json(Operations.broadcastPush.Output.BadRequest.Body.jsonPayload) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Operations.broadcastPush.Output.BadRequest.Body.jsonPayload { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.broadcastPush.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.broadcastPush.Output.BadRequest.Headers = .init(), + body: Operations.broadcastPush.Output.BadRequest.Body + ) { + self.headers = headers + self.body = body + } + } + /// There was a problem with the pushed PGN. + /// + /// - Remark: Generated from `#/paths//broadcast/round/{broadcastRoundId}/push/post(broadcastPush)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.broadcastPush.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.broadcastPush.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum broadcastStreamRoundPgn { + internal static let id: Swift.String = "broadcastStreamRoundPgn" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/stream/broadcast/round/{broadcastRoundId}.pgn/GET/path`. + internal struct Path: Sendable, Hashable { + /// The broadcast round ID (8 characters). + /// + /// - Remark: Generated from `#/paths/api/stream/broadcast/round/{broadcastRoundId}.pgn/GET/path/broadcastRoundId`. + internal var broadcastRoundId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - broadcastRoundId: The broadcast round ID (8 characters). + internal init(broadcastRoundId: Swift.String) { + self.broadcastRoundId = broadcastRoundId + } + } + internal var path: Operations.broadcastStreamRoundPgn.Input.Path + /// - Remark: Generated from `#/paths/api/stream/broadcast/round/{broadcastRoundId}.pgn/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.broadcastStreamRoundPgn.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.broadcastStreamRoundPgn.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.broadcastStreamRoundPgn.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.broadcastStreamRoundPgn.Input.Path, + headers: Operations.broadcastStreamRoundPgn.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/stream/broadcast/round/{broadcastRoundId}.pgn/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/stream/broadcast/round/{broadcastRoundId}.pgn/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.broadcastStreamRoundPgn.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/stream/broadcast/round/{broadcastRoundId}.pgn/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/stream/broadcast/round/{broadcastRoundId}.pgn/GET/responses/200/content/application\/x-chess-pgn`. + case application_x_hyphen_chess_hyphen_pgn(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_chess_hyphen_pgn`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_chess_hyphen_pgn`. + /// - SeeAlso: `.application_x_hyphen_chess_hyphen_pgn`. + internal var application_x_hyphen_chess_hyphen_pgn: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_chess_hyphen_pgn(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.broadcastStreamRoundPgn.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.broadcastStreamRoundPgn.Output.Ok.Headers = .init(), + body: Operations.broadcastStreamRoundPgn.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The PGN representation of the tournament games, then the PGNs of games as they are updated. + /// + /// - Remark: Generated from `#/paths//api/stream/broadcast/round/{broadcastRoundId}.pgn/get(broadcastStreamRoundPgn)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.broadcastStreamRoundPgn.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.broadcastStreamRoundPgn.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_chess_hyphen_pgn + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-chess-pgn": + self = .application_x_hyphen_chess_hyphen_pgn + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_chess_hyphen_pgn: + return "application/x-chess-pgn" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_chess_hyphen_pgn + ] + } + } + } + /// 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 enum broadcastRoundPgn { + internal static let id: Swift.String = "broadcastRoundPgn" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/broadcast/round/{broadcastRoundId}.pgn/GET/path`. + internal struct Path: Sendable, Hashable { + /// The round ID (8 characters). + /// + /// - Remark: Generated from `#/paths/api/broadcast/round/{broadcastRoundId}.pgn/GET/path/broadcastRoundId`. + internal var broadcastRoundId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - broadcastRoundId: The round ID (8 characters). + internal init(broadcastRoundId: Swift.String) { + self.broadcastRoundId = broadcastRoundId + } + } + internal var path: Operations.broadcastRoundPgn.Input.Path + /// - Remark: Generated from `#/paths/api/broadcast/round/{broadcastRoundId}.pgn/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.broadcastRoundPgn.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.broadcastRoundPgn.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.broadcastRoundPgn.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.broadcastRoundPgn.Input.Path, + headers: Operations.broadcastRoundPgn.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/broadcast/round/{broadcastRoundId}.pgn/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/broadcast/round/{broadcastRoundId}.pgn/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.broadcastRoundPgn.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/broadcast/round/{broadcastRoundId}.pgn/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/broadcast/round/{broadcastRoundId}.pgn/GET/responses/200/content/application\/x-chess-pgn`. + case application_x_hyphen_chess_hyphen_pgn(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_chess_hyphen_pgn`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_chess_hyphen_pgn`. + /// - SeeAlso: `.application_x_hyphen_chess_hyphen_pgn`. + internal var application_x_hyphen_chess_hyphen_pgn: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_chess_hyphen_pgn(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.broadcastRoundPgn.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.broadcastRoundPgn.Output.Ok.Headers = .init(), + body: Operations.broadcastRoundPgn.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The PGN representation of the round. + /// + /// - Remark: Generated from `#/paths//api/broadcast/round/{broadcastRoundId}.pgn/get(broadcastRoundPgn)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.broadcastRoundPgn.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.broadcastRoundPgn.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_chess_hyphen_pgn + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-chess-pgn": + self = .application_x_hyphen_chess_hyphen_pgn + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_chess_hyphen_pgn: + return "application/x-chess-pgn" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_chess_hyphen_pgn + ] + } + } + } + /// 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 enum broadcastAllRoundsPgn { + internal static let id: Swift.String = "broadcastAllRoundsPgn" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/broadcast/{broadcastTournamentId}.pgn/GET/path`. + internal struct Path: Sendable, Hashable { + /// The broadcast tournament ID (8 characters). + /// + /// - Remark: Generated from `#/paths/api/broadcast/{broadcastTournamentId}.pgn/GET/path/broadcastTournamentId`. + internal var broadcastTournamentId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - broadcastTournamentId: The broadcast tournament ID (8 characters). + internal init(broadcastTournamentId: Swift.String) { + self.broadcastTournamentId = broadcastTournamentId + } + } + internal var path: Operations.broadcastAllRoundsPgn.Input.Path + /// - Remark: Generated from `#/paths/api/broadcast/{broadcastTournamentId}.pgn/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.broadcastAllRoundsPgn.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.broadcastAllRoundsPgn.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.broadcastAllRoundsPgn.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.broadcastAllRoundsPgn.Input.Path, + headers: Operations.broadcastAllRoundsPgn.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/broadcast/{broadcastTournamentId}.pgn/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/broadcast/{broadcastTournamentId}.pgn/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.broadcastAllRoundsPgn.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/broadcast/{broadcastTournamentId}.pgn/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/broadcast/{broadcastTournamentId}.pgn/GET/responses/200/content/application\/x-chess-pgn`. + case application_x_hyphen_chess_hyphen_pgn(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_chess_hyphen_pgn`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_chess_hyphen_pgn`. + /// - SeeAlso: `.application_x_hyphen_chess_hyphen_pgn`. + internal var application_x_hyphen_chess_hyphen_pgn: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_chess_hyphen_pgn(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.broadcastAllRoundsPgn.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.broadcastAllRoundsPgn.Output.Ok.Headers = .init(), + body: Operations.broadcastAllRoundsPgn.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The PGN representation of the broadcast. + /// + /// - Remark: Generated from `#/paths//api/broadcast/{broadcastTournamentId}.pgn/get(broadcastAllRoundsPgn)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.broadcastAllRoundsPgn.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.broadcastAllRoundsPgn.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_chess_hyphen_pgn + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-chess-pgn": + self = .application_x_hyphen_chess_hyphen_pgn + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_chess_hyphen_pgn: + return "application/x-chess-pgn" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_chess_hyphen_pgn + ] + } + } + } + /// 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 enum broadcastMyRoundsGet { + internal static let id: Swift.String = "broadcastMyRoundsGet" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/broadcast/my-rounds/GET/query`. + internal struct Query: Sendable, Hashable { + /// How many rounds to get + /// + /// - Remark: Generated from `#/paths/api/broadcast/my-rounds/GET/query/nb`. + internal var nb: Swift.Int? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - nb: How many rounds to get + internal init(nb: Swift.Int? = nil) { + self.nb = nb + } + } + internal var query: Operations.broadcastMyRoundsGet.Input.Query + /// - Remark: Generated from `#/paths/api/broadcast/my-rounds/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.broadcastMyRoundsGet.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.broadcastMyRoundsGet.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.broadcastMyRoundsGet.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - query: + /// - headers: + internal init( + query: Operations.broadcastMyRoundsGet.Input.Query = .init(), + headers: Operations.broadcastMyRoundsGet.Input.Headers = .init() + ) { + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/broadcast/my-rounds/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/broadcast/my-rounds/GET/responses/200/content/application\/json`. + case json(Components.Schemas.BroadcastMyRound) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.BroadcastMyRound { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.broadcastMyRoundsGet.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.broadcastMyRoundsGet.Output.Ok.Body) { + self.body = body + } + } + /// The broadcast rounds with their tournament and a `study.writeable` flag. + /// + /// - Remark: Generated from `#/paths//api/broadcast/my-rounds/get(broadcastMyRoundsGet)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.broadcastMyRoundsGet.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.broadcastMyRoundsGet.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiSimul { + internal static let id: Swift.String = "apiSimul" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/simul/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiSimul.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiSimul.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiSimul.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + internal init(headers: Operations.apiSimul.Input.Headers = .init()) { + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/simul/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/simul/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiSimul.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/simul/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/simul/GET/responses/200/content/json`. + internal struct jsonPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/simul/GET/responses/200/content/json/pending`. + internal var pending: [Components.Schemas.Simul]? + /// - Remark: Generated from `#/paths/api/simul/GET/responses/200/content/json/created`. + internal var created: [Components.Schemas.Simul]? + /// - Remark: Generated from `#/paths/api/simul/GET/responses/200/content/json/started`. + internal var started: [Components.Schemas.Simul]? + /// - Remark: Generated from `#/paths/api/simul/GET/responses/200/content/json/finished`. + internal var finished: [Components.Schemas.Simul]? + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - pending: + /// - created: + /// - started: + /// - finished: + internal init( + pending: [Components.Schemas.Simul]? = nil, + created: [Components.Schemas.Simul]? = nil, + started: [Components.Schemas.Simul]? = nil, + finished: [Components.Schemas.Simul]? = nil + ) { + self.pending = pending + self.created = created + self.started = started + self.finished = finished + } + internal enum CodingKeys: String, CodingKey { + case pending + case created + case started + case finished + } + } + /// - Remark: Generated from `#/paths/api/simul/GET/responses/200/content/application\/json`. + case json(Operations.apiSimul.Output.Ok.Body.jsonPayload) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Operations.apiSimul.Output.Ok.Body.jsonPayload { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiSimul.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiSimul.Output.Ok.Headers = .init(), + body: Operations.apiSimul.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The list of simuls. + /// + /// - Remark: Generated from `#/paths//api/simul/get(apiSimul)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiSimul.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiSimul.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum teamShow { + internal static let id: Swift.String = "teamShow" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/GET/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/GET/path/teamId`. + internal var teamId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - teamId: + internal init(teamId: Swift.String) { + self.teamId = teamId + } + } + internal var path: Operations.teamShow.Input.Path + /// - Remark: Generated from `#/paths/api/team/{teamId}/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.teamShow.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.teamShow.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.teamShow.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.teamShow.Input.Path, + headers: Operations.teamShow.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.teamShow.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/team/{teamId}/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/GET/responses/200/content/application\/json`. + case json(Components.Schemas.Team) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Team { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.teamShow.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.teamShow.Output.Ok.Headers = .init(), + body: Operations.teamShow.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The information about the team. + /// + /// - Remark: Generated from `#/paths//api/team/{teamId}/get(teamShow)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.teamShow.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.teamShow.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum teamAll { + internal static let id: Swift.String = "teamAll" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/all/GET/query`. + internal struct Query: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/all/GET/query/page`. + internal var page: Swift.Double? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - page: + internal init(page: Swift.Double? = nil) { + self.page = page + } + } + internal var query: Operations.teamAll.Input.Query + /// - Remark: Generated from `#/paths/api/team/all/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.teamAll.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.teamAll.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.teamAll.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - query: + /// - headers: + internal init( + query: Operations.teamAll.Input.Query = .init(), + headers: Operations.teamAll.Input.Headers = .init() + ) { + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/all/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/all/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.teamAll.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/team/all/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/all/GET/responses/200/content/application\/json`. + case json(Components.Schemas.TeamPaginatorJson) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.TeamPaginatorJson { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.teamAll.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.teamAll.Output.Ok.Headers = .init(), + body: Operations.teamAll.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// A paginated list of the most popular teams. + /// + /// - Remark: Generated from `#/paths//api/team/all/get(teamAll)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.teamAll.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.teamAll.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum teamOfUsername { + internal static let id: Swift.String = "teamOfUsername" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/of/{username}/GET/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/of/{username}/GET/path/username`. + internal var username: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - username: + internal init(username: Swift.String) { + self.username = username + } + } + internal var path: Operations.teamOfUsername.Input.Path + /// - Remark: Generated from `#/paths/api/team/of/{username}/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.teamOfUsername.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.teamOfUsername.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.teamOfUsername.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.teamOfUsername.Input.Path, + headers: Operations.teamOfUsername.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/of/{username}/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/of/{username}/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.teamOfUsername.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/team/of/{username}/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/of/{username}/GET/responses/200/content/application\/json`. + case json([Components.Schemas.Team]) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: [Components.Schemas.Team] { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.teamOfUsername.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.teamOfUsername.Output.Ok.Headers = .init(), + body: Operations.teamOfUsername.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The list of teams the user is a member of. + /// + /// - Remark: Generated from `#/paths//api/team/of/{username}/get(teamOfUsername)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.teamOfUsername.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.teamOfUsername.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum teamSearch { + internal static let id: Swift.String = "teamSearch" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/search/GET/query`. + internal struct Query: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/search/GET/query/text`. + internal var text: Swift.String? + /// - Remark: Generated from `#/paths/api/team/search/GET/query/page`. + internal var page: Swift.Double? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - text: + /// - page: + internal init( + text: Swift.String? = nil, + page: Swift.Double? = nil + ) { + self.text = text + self.page = page + } + } + internal var query: Operations.teamSearch.Input.Query + /// - Remark: Generated from `#/paths/api/team/search/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.teamSearch.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.teamSearch.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.teamSearch.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - query: + /// - headers: + internal init( + query: Operations.teamSearch.Input.Query = .init(), + headers: Operations.teamSearch.Input.Headers = .init() + ) { + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/search/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/search/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.teamSearch.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/team/search/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/search/GET/responses/200/content/application\/json`. + case json(Components.Schemas.TeamPaginatorJson) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.TeamPaginatorJson { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.teamSearch.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.teamSearch.Output.Ok.Headers = .init(), + body: Operations.teamSearch.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The paginated list of teams. + /// + /// - Remark: Generated from `#/paths//api/team/search/get(teamSearch)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.teamSearch.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.teamSearch.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum teamIdUsers { + internal static let id: Swift.String = "teamIdUsers" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/users/GET/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/users/GET/path/teamId`. + internal var teamId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - teamId: + internal init(teamId: Swift.String) { + self.teamId = teamId + } + } + internal var path: Operations.teamIdUsers.Input.Path + /// - Remark: Generated from `#/paths/api/team/{teamId}/users/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.teamIdUsers.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.teamIdUsers.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.teamIdUsers.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.teamIdUsers.Input.Path, + headers: Operations.teamIdUsers.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/users/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/users/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.teamIdUsers.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/team/{teamId}/users/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/users/GET/responses/200/content/application\/x-ndjson`. + case application_x_hyphen_ndjson(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_ndjson`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_ndjson`. + /// - SeeAlso: `.application_x_hyphen_ndjson`. + internal var application_x_hyphen_ndjson: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_ndjson(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.teamIdUsers.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.teamIdUsers.Output.Ok.Headers = .init(), + body: Operations.teamIdUsers.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The list of users in the team. + /// + /// - Remark: Generated from `#/paths//api/team/{teamId}/users/get(teamIdUsers)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.teamIdUsers.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.teamIdUsers.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_ndjson + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-ndjson": + self = .application_x_hyphen_ndjson + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_ndjson: + return "application/x-ndjson" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_ndjson + ] + } + } + } + /// 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 enum apiTeamArena { + internal static let id: Swift.String = "apiTeamArena" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/arena/GET/path`. + internal struct Path: Sendable, Hashable { + /// ID of the team + /// + /// - Remark: Generated from `#/paths/api/team/{teamId}/arena/GET/path/teamId`. + internal var teamId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - teamId: ID of the team + internal init(teamId: Swift.String) { + self.teamId = teamId + } + } + internal var path: Operations.apiTeamArena.Input.Path + /// - Remark: Generated from `#/paths/api/team/{teamId}/arena/GET/query`. + internal struct Query: Sendable, Hashable { + /// How many tournaments to download. + /// + /// - Remark: Generated from `#/paths/api/team/{teamId}/arena/GET/query/max`. + internal var max: Swift.Int? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - max: How many tournaments to download. + internal init(max: Swift.Int? = nil) { + self.max = max + } + } + internal var query: Operations.apiTeamArena.Input.Query + /// - Remark: Generated from `#/paths/api/team/{teamId}/arena/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiTeamArena.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiTeamArena.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiTeamArena.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + internal init( + path: Operations.apiTeamArena.Input.Path, + query: Operations.apiTeamArena.Input.Query = .init(), + headers: Operations.apiTeamArena.Input.Headers = .init() + ) { + self.path = path + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/arena/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/arena/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiTeamArena.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/team/{teamId}/arena/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/arena/GET/responses/200/content/application\/x-ndjson`. + case application_x_hyphen_ndjson(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_ndjson`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_ndjson`. + /// - SeeAlso: `.application_x_hyphen_ndjson`. + internal var application_x_hyphen_ndjson: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_ndjson(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiTeamArena.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiTeamArena.Output.Ok.Headers = .init(), + body: Operations.apiTeamArena.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The list of Arena tournaments of a team. + /// + /// - Remark: Generated from `#/paths//api/team/{teamId}/arena/get(apiTeamArena)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiTeamArena.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiTeamArena.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_ndjson + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-ndjson": + self = .application_x_hyphen_ndjson + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_ndjson: + return "application/x-ndjson" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_ndjson + ] + } + } + } + /// 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 enum teamIdJoin { + internal static let id: Swift.String = "teamIdJoin" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/team/{teamId}/join/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/team/{teamId}/join/POST/path/teamId`. + internal var teamId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - teamId: + internal init(teamId: Swift.String) { + self.teamId = teamId + } + } + internal var path: Operations.teamIdJoin.Input.Path + /// - Remark: Generated from `#/paths/team/{teamId}/join/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.teamIdJoin.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.teamIdJoin.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.teamIdJoin.Input.Headers + /// - Remark: Generated from `#/paths/team/{teamId}/join/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/team/{teamId}/join/POST/requestBody/urlEncodedForm`. + internal struct urlEncodedFormPayload: Codable, Hashable, Sendable { + /// Optional request message, if the team requires one. + /// + /// - Remark: Generated from `#/paths/team/{teamId}/join/POST/requestBody/urlEncodedForm/message`. + internal var message: Swift.String? + /// Optional password, if the team requires one. + /// + /// - Remark: Generated from `#/paths/team/{teamId}/join/POST/requestBody/urlEncodedForm/password`. + internal var password: Swift.String? + /// Creates a new `urlEncodedFormPayload`. + /// + /// - Parameters: + /// - message: Optional request message, if the team requires one. + /// - password: Optional password, if the team requires one. + internal init( + message: Swift.String? = nil, + password: Swift.String? = nil + ) { + self.message = message + self.password = password + } + internal enum CodingKeys: String, CodingKey { + case message + case password + } + } + /// - Remark: Generated from `#/paths/team/{teamId}/join/POST/requestBody/content/application\/x-www-form-urlencoded`. + case urlEncodedForm(Operations.teamIdJoin.Input.Body.urlEncodedFormPayload) + } + internal var body: Operations.teamIdJoin.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + /// - body: + internal init( + path: Operations.teamIdJoin.Input.Path, + headers: Operations.teamIdJoin.Input.Headers = .init(), + body: Operations.teamIdJoin.Input.Body + ) { + self.path = path + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/team/{teamId}/join/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/team/{teamId}/join/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.teamIdJoin.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.teamIdJoin.Output.Ok.Body) { + self.body = body + } + } + /// The request to join a team was successfully sent. + /// + /// - Remark: Generated from `#/paths//team/{teamId}/join/post(teamIdJoin)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.teamIdJoin.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.teamIdJoin.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum teamIdQuit { + internal static let id: Swift.String = "teamIdQuit" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/team/{teamId}/quit/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/team/{teamId}/quit/POST/path/teamId`. + internal var teamId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - teamId: + internal init(teamId: Swift.String) { + self.teamId = teamId + } + } + internal var path: Operations.teamIdQuit.Input.Path + /// - Remark: Generated from `#/paths/team/{teamId}/quit/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.teamIdQuit.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.teamIdQuit.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.teamIdQuit.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.teamIdQuit.Input.Path, + headers: Operations.teamIdQuit.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/team/{teamId}/quit/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/team/{teamId}/quit/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.teamIdQuit.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.teamIdQuit.Output.Ok.Body) { + self.body = body + } + } + /// The logged in user has successfully left the team. + /// + /// - Remark: Generated from `#/paths//team/{teamId}/quit/post(teamIdQuit)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.teamIdQuit.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.teamIdQuit.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum teamRequests { + internal static let id: Swift.String = "teamRequests" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/requests/GET/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/requests/GET/path/teamId`. + internal var teamId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - teamId: + internal init(teamId: Swift.String) { + self.teamId = teamId + } + } + internal var path: Operations.teamRequests.Input.Path + /// - Remark: Generated from `#/paths/api/team/{teamId}/requests/GET/query`. + internal struct Query: Sendable, Hashable { + /// Get the declined join requests + /// + /// - Remark: Generated from `#/paths/api/team/{teamId}/requests/GET/query/declined`. + internal var declined: Swift.Bool? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - declined: Get the declined join requests + internal init(declined: Swift.Bool? = nil) { + self.declined = declined + } + } + internal var query: Operations.teamRequests.Input.Query + /// - Remark: Generated from `#/paths/api/team/{teamId}/requests/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.teamRequests.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.teamRequests.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.teamRequests.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + internal init( + path: Operations.teamRequests.Input.Path, + query: Operations.teamRequests.Input.Query = .init(), + headers: Operations.teamRequests.Input.Headers = .init() + ) { + self.path = path + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/requests/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/requests/GET/responses/200/content/application\/json`. + case json([Components.Schemas.TeamRequestWithUser]) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: [Components.Schemas.TeamRequestWithUser] { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.teamRequests.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.teamRequests.Output.Ok.Body) { + self.body = body + } + } + /// The list of pending join requests on your team + /// + /// - Remark: Generated from `#/paths//api/team/{teamId}/requests/get(teamRequests)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.teamRequests.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.teamRequests.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum teamRequestAccept { + internal static let id: Swift.String = "teamRequestAccept" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/request/{userId}/accept/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/request/{userId}/accept/POST/path/teamId`. + internal var teamId: Swift.String + /// - Remark: Generated from `#/paths/api/team/{teamId}/request/{userId}/accept/POST/path/userId`. + internal var userId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - teamId: + /// - userId: + internal init( + teamId: Swift.String, + userId: Swift.String + ) { + self.teamId = teamId + self.userId = userId + } + } + internal var path: Operations.teamRequestAccept.Input.Path + /// - Remark: Generated from `#/paths/api/team/{teamId}/request/{userId}/accept/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.teamRequestAccept.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.teamRequestAccept.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.teamRequestAccept.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.teamRequestAccept.Input.Path, + headers: Operations.teamRequestAccept.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/request/{userId}/accept/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/request/{userId}/accept/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.teamRequestAccept.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.teamRequestAccept.Output.Ok.Body) { + self.body = body + } + } + /// The member has been added to the team. + /// + /// - Remark: Generated from `#/paths//api/team/{teamId}/request/{userId}/accept/post(teamRequestAccept)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.teamRequestAccept.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.teamRequestAccept.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum teamRequestDecline { + internal static let id: Swift.String = "teamRequestDecline" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/request/{userId}/decline/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/request/{userId}/decline/POST/path/teamId`. + internal var teamId: Swift.String + /// - Remark: Generated from `#/paths/api/team/{teamId}/request/{userId}/decline/POST/path/userId`. + internal var userId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - teamId: + /// - userId: + internal init( + teamId: Swift.String, + userId: Swift.String + ) { + self.teamId = teamId + self.userId = userId + } + } + internal var path: Operations.teamRequestDecline.Input.Path + /// - Remark: Generated from `#/paths/api/team/{teamId}/request/{userId}/decline/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.teamRequestDecline.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.teamRequestDecline.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.teamRequestDecline.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.teamRequestDecline.Input.Path, + headers: Operations.teamRequestDecline.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/request/{userId}/decline/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/request/{userId}/decline/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.teamRequestDecline.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.teamRequestDecline.Output.Ok.Body) { + self.body = body + } + } + /// The join request has been declined and is no longer pending. + /// + /// - Remark: Generated from `#/paths//api/team/{teamId}/request/{userId}/decline/post(teamRequestDecline)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.teamRequestDecline.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.teamRequestDecline.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum teamIdKickUserId { + internal static let id: Swift.String = "teamIdKickUserId" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/kick/{userId}/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/kick/{userId}/POST/path/teamId`. + internal var teamId: Swift.String + /// - Remark: Generated from `#/paths/api/team/{teamId}/kick/{userId}/POST/path/userId`. + internal var userId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - teamId: + /// - userId: + internal init( + teamId: Swift.String, + userId: Swift.String + ) { + self.teamId = teamId + self.userId = userId + } + } + internal var path: Operations.teamIdKickUserId.Input.Path + /// - Remark: Generated from `#/paths/api/team/{teamId}/kick/{userId}/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.teamIdKickUserId.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.teamIdKickUserId.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.teamIdKickUserId.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.teamIdKickUserId.Input.Path, + headers: Operations.teamIdKickUserId.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/kick/{userId}/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/team/{teamId}/kick/{userId}/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.teamIdKickUserId.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.teamIdKickUserId.Output.Ok.Body) { + self.body = body + } + } + /// The member has been kicked from the team. + /// + /// - Remark: Generated from `#/paths//api/team/{teamId}/kick/{userId}/post(teamIdKickUserId)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.teamIdKickUserId.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.teamIdKickUserId.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum teamIdPmAll { + internal static let id: Swift.String = "teamIdPmAll" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/team/{teamId}/pm-all/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/team/{teamId}/pm-all/POST/path/teamId`. + internal var teamId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - teamId: + internal init(teamId: Swift.String) { + self.teamId = teamId + } + } + internal var path: Operations.teamIdPmAll.Input.Path + /// - Remark: Generated from `#/paths/team/{teamId}/pm-all/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.teamIdPmAll.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.teamIdPmAll.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.teamIdPmAll.Input.Headers + /// - Remark: Generated from `#/paths/team/{teamId}/pm-all/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/team/{teamId}/pm-all/POST/requestBody/urlEncodedForm`. + internal struct urlEncodedFormPayload: Codable, Hashable, Sendable { + /// The message to send to all your team members. + /// + /// - Remark: Generated from `#/paths/team/{teamId}/pm-all/POST/requestBody/urlEncodedForm/message`. + internal var message: Swift.String? + /// Creates a new `urlEncodedFormPayload`. + /// + /// - Parameters: + /// - message: The message to send to all your team members. + internal init(message: Swift.String? = nil) { + self.message = message + } + internal enum CodingKeys: String, CodingKey { + case message + } + } + /// - Remark: Generated from `#/paths/team/{teamId}/pm-all/POST/requestBody/content/application\/x-www-form-urlencoded`. + case urlEncodedForm(Operations.teamIdPmAll.Input.Body.urlEncodedFormPayload) + } + internal var body: Operations.teamIdPmAll.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + /// - body: + internal init( + path: Operations.teamIdPmAll.Input.Path, + headers: Operations.teamIdPmAll.Input.Headers = .init(), + body: Operations.teamIdPmAll.Input.Body + ) { + self.path = path + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/team/{teamId}/pm-all/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/team/{teamId}/pm-all/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.teamIdPmAll.Output.Ok.Headers + /// - Remark: Generated from `#/paths/team/{teamId}/pm-all/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/team/{teamId}/pm-all/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.teamIdPmAll.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.teamIdPmAll.Output.Ok.Headers = .init(), + body: Operations.teamIdPmAll.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The message has successfully been sent to all team members. + /// + /// - Remark: Generated from `#/paths//team/{teamId}/pm-all/post(teamIdPmAll)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.teamIdPmAll.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.teamIdPmAll.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/team/{teamId}/pm-all/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/team/{teamId}/pm-all/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.teamIdPmAll.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.teamIdPmAll.Output.BadRequest.Body) { + self.body = body + } + } + /// The sending of message to all team members has failed. + /// + /// - Remark: Generated from `#/paths//team/{teamId}/pm-all/post(teamIdPmAll)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.teamIdPmAll.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.teamIdPmAll.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum streamerLive { + internal static let id: Swift.String = "streamerLive" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/streamer/live/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.streamerLive.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.streamerLive.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.streamerLive.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + internal init(headers: Operations.streamerLive.Input.Headers = .init()) { + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/streamer/live/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/streamer/live/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.streamerLive.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/streamer/live/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/streamer/live/GET/responses/200/content/application\/json`. + case json([Components.Schemas.LightUser]) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: [Components.Schemas.LightUser] { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.streamerLive.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.streamerLive.Output.Ok.Headers = .init(), + body: Operations.streamerLive.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The list of live streamers and their respective information. + /// + /// - Remark: Generated from `#/paths//api/streamer/live/get(streamerLive)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.streamerLive.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.streamerLive.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiCrosstable { + internal static let id: Swift.String = "apiCrosstable" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/crosstable/{user1}/{user2}/GET/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/crosstable/{user1}/{user2}/GET/path/user1`. + internal var user1: Swift.String + /// - Remark: Generated from `#/paths/api/crosstable/{user1}/{user2}/GET/path/user2`. + internal var user2: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - user1: + /// - user2: + internal init( + user1: Swift.String, + user2: Swift.String + ) { + self.user1 = user1 + self.user2 = user2 + } + } + internal var path: Operations.apiCrosstable.Input.Path + /// - Remark: Generated from `#/paths/api/crosstable/{user1}/{user2}/GET/query`. + internal struct Query: Sendable, Hashable { + /// Whether to get the current match data, if any + /// + /// - Remark: Generated from `#/paths/api/crosstable/{user1}/{user2}/GET/query/matchup`. + internal var matchup: Swift.Bool? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - matchup: Whether to get the current match data, if any + internal init(matchup: Swift.Bool? = nil) { + self.matchup = matchup + } + } + internal var query: Operations.apiCrosstable.Input.Query + /// - Remark: Generated from `#/paths/api/crosstable/{user1}/{user2}/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiCrosstable.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiCrosstable.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiCrosstable.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + internal init( + path: Operations.apiCrosstable.Input.Path, + query: Operations.apiCrosstable.Input.Query = .init(), + headers: Operations.apiCrosstable.Input.Headers = .init() + ) { + self.path = path + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/crosstable/{user1}/{user2}/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/crosstable/{user1}/{user2}/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiCrosstable.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/crosstable/{user1}/{user2}/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/crosstable/{user1}/{user2}/GET/responses/200/content/application\/json`. + case json(Components.Schemas.Crosstable) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Crosstable { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiCrosstable.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiCrosstable.Output.Ok.Headers = .init(), + body: Operations.apiCrosstable.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The crosstable of the two users. + /// + /// - Remark: Generated from `#/paths//api/crosstable/{user1}/{user2}/get(apiCrosstable)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiCrosstable.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiCrosstable.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiPlayerAutocomplete { + internal static let id: Swift.String = "apiPlayerAutocomplete" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/player/autocomplete/GET/query`. + internal struct Query: Sendable, Hashable { + /// The beginning of a username + /// + /// - Remark: Generated from `#/paths/api/player/autocomplete/GET/query/term`. + internal var term: Swift.String + /// - `false` returns an array of usernames + /// - `true` returns an object with matching users + /// + /// + /// - Remark: Generated from `#/paths/api/player/autocomplete/GET/query/object`. + internal var object: Swift.Bool? + /// Returns followed players matching `term` if any, else returns other players. + /// Requires [OAuth](#tag/OAuth). + /// + /// + /// - Remark: Generated from `#/paths/api/player/autocomplete/GET/query/friend`. + internal var friend: Swift.Bool? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - term: The beginning of a username + /// - object: + /// - friend: Returns followed players matching `term` if any, else returns other players. + internal init( + term: Swift.String, + object: Swift.Bool? = nil, + friend: Swift.Bool? = nil + ) { + self.term = term + self.object = object + self.friend = friend + } + } + internal var query: Operations.apiPlayerAutocomplete.Input.Query + /// - Remark: Generated from `#/paths/api/player/autocomplete/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiPlayerAutocomplete.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiPlayerAutocomplete.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiPlayerAutocomplete.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - query: + /// - headers: + internal init( + query: Operations.apiPlayerAutocomplete.Input.Query, + headers: Operations.apiPlayerAutocomplete.Input.Headers = .init() + ) { + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/player/autocomplete/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/player/autocomplete/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiPlayerAutocomplete.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/player/autocomplete/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/player/autocomplete/GET/responses/200/content/json`. + @frozen internal enum jsonPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/player/autocomplete/GET/responses/200/content/json/case1`. + case case1([Swift.String]) + /// - Remark: Generated from `#/paths/api/player/autocomplete/GET/responses/200/content/json/case2`. + internal struct Case2Payload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/player/autocomplete/GET/responses/200/content/json/case2/result`. + internal var result: [Components.Schemas.LightUserOnline]? + /// Creates a new `Case2Payload`. + /// + /// - Parameters: + /// - result: + internal init(result: [Components.Schemas.LightUserOnline]? = nil) { + self.result = result + } + internal enum CodingKeys: String, CodingKey { + case result + } + } + /// - Remark: Generated from `#/paths/api/player/autocomplete/GET/responses/200/content/json/case2`. + case case2(Operations.apiPlayerAutocomplete.Output.Ok.Body.jsonPayload.Case2Payload) + internal init(from decoder: any Decoder) throws { + var errors: [any Error] = [] + do { + self = .case1(try decoder.decodeFromSingleValueContainer()) + return + } catch { + errors.append(error) + } + do { + self = .case2(try .init(from: decoder)) + return + } catch { + errors.append(error) + } + throw Swift.DecodingError.failedToDecodeOneOfSchema( + type: Self.self, + codingPath: decoder.codingPath, + errors: errors + ) + } + internal func encode(to encoder: any Encoder) throws { + switch self { + case let .case1(value): + try encoder.encodeToSingleValueContainer(value) + case let .case2(value): + try value.encode(to: encoder) + } + } + } + /// - Remark: Generated from `#/paths/api/player/autocomplete/GET/responses/200/content/application\/json`. + case json(Operations.apiPlayerAutocomplete.Output.Ok.Body.jsonPayload) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Operations.apiPlayerAutocomplete.Output.Ok.Body.jsonPayload { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiPlayerAutocomplete.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiPlayerAutocomplete.Output.Ok.Headers = .init(), + body: Operations.apiPlayerAutocomplete.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// An array of players which usernames start with the provided term. + /// + /// - Remark: Generated from `#/paths//api/player/autocomplete/get(apiPlayerAutocomplete)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiPlayerAutocomplete.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiPlayerAutocomplete.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum readNote { + internal static let id: Swift.String = "readNote" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/note/GET/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/note/GET/path/username`. + internal var username: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - username: + internal init(username: Swift.String) { + self.username = username + } + } + internal var path: Operations.readNote.Input.Path + /// - Remark: Generated from `#/paths/api/user/{username}/note/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.readNote.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.readNote.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.readNote.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.readNote.Input.Path, + headers: Operations.readNote.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/note/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/note/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.readNote.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/user/{username}/note/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/note/GET/responses/200/content/application\/json`. + case json([Components.Schemas.UserNote]) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: [Components.Schemas.UserNote] { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.readNote.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.readNote.Output.Ok.Headers = .init(), + body: Operations.readNote.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The list of notes you have added for this user + /// + /// - Remark: Generated from `#/paths//api/user/{username}/note/get(readNote)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.readNote.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.readNote.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum writeNote { + internal static let id: Swift.String = "writeNote" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/note/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/note/POST/path/username`. + internal var username: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - username: + internal init(username: Swift.String) { + self.username = username + } + } + internal var path: Operations.writeNote.Input.Path + /// - Remark: Generated from `#/paths/api/user/{username}/note/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.writeNote.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.writeNote.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.writeNote.Input.Headers + /// - Remark: Generated from `#/paths/api/user/{username}/note/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/note/POST/requestBody/urlEncodedForm`. + internal struct urlEncodedFormPayload: Codable, Hashable, Sendable { + /// The contents of the note + /// + /// - Remark: Generated from `#/paths/api/user/{username}/note/POST/requestBody/urlEncodedForm/text`. + internal var text: Swift.String + /// Creates a new `urlEncodedFormPayload`. + /// + /// - Parameters: + /// - text: The contents of the note + internal init(text: Swift.String) { + self.text = text + } + internal enum CodingKeys: String, CodingKey { + case text + } + } + /// - Remark: Generated from `#/paths/api/user/{username}/note/POST/requestBody/content/application\/x-www-form-urlencoded`. + case urlEncodedForm(Operations.writeNote.Input.Body.urlEncodedFormPayload) + } + internal var body: Operations.writeNote.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + /// - body: + internal init( + path: Operations.writeNote.Input.Path, + headers: Operations.writeNote.Input.Headers = .init(), + body: Operations.writeNote.Input.Body + ) { + self.path = path + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/note/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/user/{username}/note/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.writeNote.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.writeNote.Output.Ok.Body) { + self.body = body + } + } + /// The note was successfully added. + /// + /// - Remark: Generated from `#/paths//api/user/{username}/note/post(writeNote)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.writeNote.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.writeNote.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiUserFollowing { + internal static let id: Swift.String = "apiUserFollowing" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/rel/following/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiUserFollowing.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiUserFollowing.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiUserFollowing.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + internal init(headers: Operations.apiUserFollowing.Input.Headers = .init()) { + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/rel/following/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/rel/following/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiUserFollowing.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/rel/following/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/rel/following/GET/responses/200/content/application\/x-ndjson`. + case application_x_hyphen_ndjson(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_ndjson`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_ndjson`. + /// - SeeAlso: `.application_x_hyphen_ndjson`. + internal var application_x_hyphen_ndjson: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_ndjson(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiUserFollowing.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiUserFollowing.Output.Ok.Headers = .init(), + body: Operations.apiUserFollowing.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The list of users followed by a user. + /// + /// - Remark: Generated from `#/paths//api/rel/following/get(apiUserFollowing)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiUserFollowing.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiUserFollowing.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_ndjson + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-ndjson": + self = .application_x_hyphen_ndjson + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_ndjson: + return "application/x-ndjson" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_ndjson + ] + } + } + } + /// 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 enum followUser { + internal static let id: Swift.String = "followUser" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/rel/follow/{username}/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/rel/follow/{username}/POST/path/username`. + internal var username: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - username: + internal init(username: Swift.String) { + self.username = username + } + } + internal var path: Operations.followUser.Input.Path + /// - Remark: Generated from `#/paths/api/rel/follow/{username}/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.followUser.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.followUser.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.followUser.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.followUser.Input.Path, + headers: Operations.followUser.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/rel/follow/{username}/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/rel/follow/{username}/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.followUser.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.followUser.Output.Ok.Body) { + self.body = body + } + } + /// The player was successfully added. + /// + /// - Remark: Generated from `#/paths//api/rel/follow/{username}/post(followUser)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.followUser.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.followUser.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum unfollowUser { + internal static let id: Swift.String = "unfollowUser" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/rel/unfollow/{username}/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/rel/unfollow/{username}/POST/path/username`. + internal var username: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - username: + internal init(username: Swift.String) { + self.username = username + } + } + internal var path: Operations.unfollowUser.Input.Path + /// - Remark: Generated from `#/paths/api/rel/unfollow/{username}/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.unfollowUser.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.unfollowUser.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.unfollowUser.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.unfollowUser.Input.Path, + headers: Operations.unfollowUser.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/rel/unfollow/{username}/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/rel/unfollow/{username}/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.unfollowUser.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.unfollowUser.Output.Ok.Body) { + self.body = body + } + } + /// The player was successfully removed. + /// + /// - Remark: Generated from `#/paths//api/rel/unfollow/{username}/post(unfollowUser)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.unfollowUser.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.unfollowUser.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiStreamEvent { + internal static let id: Swift.String = "apiStreamEvent" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/stream/event/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiStreamEvent.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiStreamEvent.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiStreamEvent.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + internal init(headers: Operations.apiStreamEvent.Input.Headers = .init()) { + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/stream/event/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/stream/event/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiStreamEvent.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/stream/event/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/stream/event/GET/responses/200/content/application\/x-ndjson`. + case application_x_hyphen_ndjson(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_ndjson`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_ndjson`. + /// - SeeAlso: `.application_x_hyphen_ndjson`. + internal var application_x_hyphen_ndjson: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_ndjson(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiStreamEvent.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiStreamEvent.Output.Ok.Headers = .init(), + body: Operations.apiStreamEvent.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The stream of events reaching the logged in user. + /// + /// - Remark: Generated from `#/paths//api/stream/event/get(apiStreamEvent)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiStreamEvent.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiStreamEvent.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_ndjson + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-ndjson": + self = .application_x_hyphen_ndjson + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_ndjson: + return "application/x-ndjson" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_ndjson + ] + } + } + } + /// 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 enum apiBoardSeek { + internal static let id: Swift.String = "apiBoardSeek" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/seek/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiBoardSeek.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiBoardSeek.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiBoardSeek.Input.Headers + /// - Remark: Generated from `#/paths/api/board/seek/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/seek/POST/requestBody/urlEncodedForm`. + internal struct urlEncodedFormPayload: Codable, Hashable, Sendable { + /// Whether the game is rated and impacts players ratings. + /// + /// - Remark: Generated from `#/paths/api/board/seek/POST/requestBody/urlEncodedForm/rated`. + internal var rated: Swift.Bool? + /// Clock initial time in minutes. Required for real-time seeks. + /// + /// - Remark: Generated from `#/paths/api/board/seek/POST/requestBody/urlEncodedForm/time`. + internal var time: Swift.Double? + /// Clock increment in seconds. Required for real-time seeks. + /// + /// - Remark: Generated from `#/paths/api/board/seek/POST/requestBody/urlEncodedForm/increment`. + internal var increment: Swift.Int? + /// Days per turn. Required for correspondence seeks. + /// + /// - Remark: Generated from `#/paths/api/board/seek/POST/requestBody/urlEncodedForm/days`. + @frozen internal enum daysPayload: Int, Codable, Hashable, Sendable { + case _1 = 1 + case _2 = 2 + case _3 = 3 + case _5 = 5 + case _7 = 7 + case _10 = 10 + case _14 = 14 + } + /// Days per turn. Required for correspondence seeks. + /// + /// - Remark: Generated from `#/paths/api/board/seek/POST/requestBody/urlEncodedForm/days`. + internal var days: Operations.apiBoardSeek.Input.Body.urlEncodedFormPayload.daysPayload? + /// - Remark: Generated from `#/paths/api/board/seek/POST/requestBody/urlEncodedForm/variant`. + internal var variant: Components.Schemas.VariantKey? + /// The color to play. Better left empty to automatically get 50% white. + /// + /// - Remark: Generated from `#/paths/api/board/seek/POST/requestBody/urlEncodedForm/color`. + @frozen internal enum colorPayload: String, Codable, Hashable, Sendable { + case random = "random" + case white = "white" + case black = "black" + } + /// The color to play. Better left empty to automatically get 50% white. + /// + /// - Remark: Generated from `#/paths/api/board/seek/POST/requestBody/urlEncodedForm/color`. + internal var color: Operations.apiBoardSeek.Input.Body.urlEncodedFormPayload.colorPayload? + /// The rating range of potential opponents. Better left empty. + /// Example: 1500-1800 + /// + /// + /// - Remark: Generated from `#/paths/api/board/seek/POST/requestBody/urlEncodedForm/ratingRange`. + internal var ratingRange: Swift.String? + /// Creates a new `urlEncodedFormPayload`. + /// + /// - Parameters: + /// - rated: Whether the game is rated and impacts players ratings. + /// - time: Clock initial time in minutes. Required for real-time seeks. + /// - increment: Clock increment in seconds. Required for real-time seeks. + /// - days: Days per turn. Required for correspondence seeks. + /// - variant: + /// - color: The color to play. Better left empty to automatically get 50% white. + /// - ratingRange: The rating range of potential opponents. Better left empty. + internal init( + rated: Swift.Bool? = nil, + time: Swift.Double? = nil, + increment: Swift.Int? = nil, + days: Operations.apiBoardSeek.Input.Body.urlEncodedFormPayload.daysPayload? = nil, + variant: Components.Schemas.VariantKey? = nil, + color: Operations.apiBoardSeek.Input.Body.urlEncodedFormPayload.colorPayload? = nil, + ratingRange: Swift.String? = nil + ) { + self.rated = rated + self.time = time + self.increment = increment + self.days = days + self.variant = variant + self.color = color + self.ratingRange = ratingRange + } + internal enum CodingKeys: String, CodingKey { + case rated + case time + case increment + case days + case variant + case color + case ratingRange + } + } + /// - Remark: Generated from `#/paths/api/board/seek/POST/requestBody/content/application\/x-www-form-urlencoded`. + case urlEncodedForm(Operations.apiBoardSeek.Input.Body.urlEncodedFormPayload) + } + internal var body: Operations.apiBoardSeek.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + /// - body: + internal init( + headers: Operations.apiBoardSeek.Input.Headers = .init(), + body: Operations.apiBoardSeek.Input.Body + ) { + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/seek/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/seek/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiBoardSeek.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/board/seek/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/seek/POST/responses/200/content/text\/plain`. + case plainText(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.plainText`. + /// + /// - Throws: An error if `self` is not `.plainText`. + /// - SeeAlso: `.plainText`. + internal var plainText: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .plainText(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiBoardSeek.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiBoardSeek.Output.Ok.Headers = .init(), + body: Operations.apiBoardSeek.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The seek was successfully created. + /// + /// - Remark: Generated from `#/paths//api/board/seek/post(apiBoardSeek)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiBoardSeek.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiBoardSeek.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/seek/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/seek/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiBoardSeek.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.apiBoardSeek.Output.BadRequest.Body) { + self.body = body + } + } + /// The creation of the seek failed. + /// + /// - Remark: Generated from `#/paths//api/board/seek/post(apiBoardSeek)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.apiBoardSeek.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.apiBoardSeek.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case plainText + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "text/plain": + self = .plainText + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .plainText: + return "text/plain" + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .plainText, + .json + ] + } + } + } + /// 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 enum boardGameStream { + internal static let id: Swift.String = "boardGameStream" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/stream/{gameId}/GET/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/stream/{gameId}/GET/path/gameId`. + internal var gameId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - gameId: + internal init(gameId: Swift.String) { + self.gameId = gameId + } + } + internal var path: Operations.boardGameStream.Input.Path + /// - Remark: Generated from `#/paths/api/board/game/stream/{gameId}/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.boardGameStream.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.boardGameStream.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.boardGameStream.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.boardGameStream.Input.Path, + headers: Operations.boardGameStream.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/stream/{gameId}/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/stream/{gameId}/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.boardGameStream.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/board/game/stream/{gameId}/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/stream/{gameId}/GET/responses/200/content/application\/x-ndjson`. + case application_x_hyphen_ndjson(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_ndjson`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_ndjson`. + /// - SeeAlso: `.application_x_hyphen_ndjson`. + internal var application_x_hyphen_ndjson: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_ndjson(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.boardGameStream.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.boardGameStream.Output.Ok.Headers = .init(), + body: Operations.boardGameStream.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The stream of the game. + /// + /// - Remark: Generated from `#/paths//api/board/game/stream/{gameId}/get(boardGameStream)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.boardGameStream.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.boardGameStream.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct NotFound: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/stream/{gameId}/GET/responses/404/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/stream/{gameId}/GET/responses/404/content/application\/json`. + case json(Components.Schemas.NotFound) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.NotFound { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.boardGameStream.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.boardGameStream.Output.NotFound.Body) { + self.body = body + } + } + /// The game was not found. + /// + /// - Remark: Generated from `#/paths//api/board/game/stream/{gameId}/get(boardGameStream)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.boardGameStream.Output.NotFound) + /// The associated value of the enum case if `self` is `.notFound`. + /// + /// - Throws: An error if `self` is not `.notFound`. + /// - SeeAlso: `.notFound`. + internal var notFound: Operations.boardGameStream.Output.NotFound { + get throws { + switch self { + case let .notFound(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "notFound", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_ndjson + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-ndjson": + self = .application_x_hyphen_ndjson + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_ndjson: + return "application/x-ndjson" + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_ndjson, + .json + ] + } + } + } + /// 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 enum boardGameMove { + internal static let id: Swift.String = "boardGameMove" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/move/{move}/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/move/{move}/POST/path/gameId`. + internal var gameId: Swift.String + /// The move to play, in UCI format + /// + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/move/{move}/POST/path/move`. + internal var move: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - gameId: + /// - move: The move to play, in UCI format + internal init( + gameId: Swift.String, + move: Swift.String + ) { + self.gameId = gameId + self.move = move + } + } + internal var path: Operations.boardGameMove.Input.Path + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/move/{move}/POST/query`. + internal struct Query: Sendable, Hashable { + /// Whether to offer (or agree to) a draw + /// + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/move/{move}/POST/query/offeringDraw`. + internal var offeringDraw: Swift.Bool? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - offeringDraw: Whether to offer (or agree to) a draw + internal init(offeringDraw: Swift.Bool? = nil) { + self.offeringDraw = offeringDraw + } + } + internal var query: Operations.boardGameMove.Input.Query + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/move/{move}/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.boardGameMove.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.boardGameMove.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.boardGameMove.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + internal init( + path: Operations.boardGameMove.Input.Path, + query: Operations.boardGameMove.Input.Query = .init(), + headers: Operations.boardGameMove.Input.Headers = .init() + ) { + self.path = path + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/move/{move}/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/move/{move}/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.boardGameMove.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/move/{move}/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/move/{move}/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.boardGameMove.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.boardGameMove.Output.Ok.Headers = .init(), + body: Operations.boardGameMove.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The move was successfully made. + /// + /// - Remark: Generated from `#/paths//api/board/game/{gameId}/move/{move}/post(boardGameMove)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.boardGameMove.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.boardGameMove.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/move/{move}/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/move/{move}/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.boardGameMove.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.boardGameMove.Output.BadRequest.Body) { + self.body = body + } + } + /// The move failed. + /// + /// - Remark: Generated from `#/paths//api/board/game/{gameId}/move/{move}/post(boardGameMove)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.boardGameMove.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.boardGameMove.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum boardGameChatGet { + internal static let id: Swift.String = "boardGameChatGet" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/chat/GET/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/chat/GET/path/gameId`. + internal var gameId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - gameId: + internal init(gameId: Swift.String) { + self.gameId = gameId + } + } + internal var path: Operations.boardGameChatGet.Input.Path + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/chat/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.boardGameChatGet.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.boardGameChatGet.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.boardGameChatGet.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.boardGameChatGet.Input.Path, + headers: Operations.boardGameChatGet.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/chat/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/chat/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.boardGameChatGet.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/chat/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/chat/GET/responses/200/content/application\/x-ndjson`. + case application_x_hyphen_ndjson(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_ndjson`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_ndjson`. + /// - SeeAlso: `.application_x_hyphen_ndjson`. + internal var application_x_hyphen_ndjson: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_ndjson(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.boardGameChatGet.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.boardGameChatGet.Output.Ok.Headers = .init(), + body: Operations.boardGameChatGet.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The messages posted in the chat. + /// + /// - Remark: Generated from `#/paths//api/board/game/{gameId}/chat/get(boardGameChatGet)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.boardGameChatGet.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.boardGameChatGet.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_ndjson + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-ndjson": + self = .application_x_hyphen_ndjson + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_ndjson: + return "application/x-ndjson" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_ndjson + ] + } + } + } + /// 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 enum boardGameChatPost { + internal static let id: Swift.String = "boardGameChatPost" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/chat/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/chat/POST/path/gameId`. + internal var gameId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - gameId: + internal init(gameId: Swift.String) { + self.gameId = gameId + } + } + internal var path: Operations.boardGameChatPost.Input.Path + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/chat/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.boardGameChatPost.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.boardGameChatPost.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.boardGameChatPost.Input.Headers + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/chat/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/chat/POST/requestBody/urlEncodedForm`. + internal struct urlEncodedFormPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/chat/POST/requestBody/urlEncodedForm/room`. + @frozen internal enum roomPayload: String, Codable, Hashable, Sendable { + case player = "player" + case spectator = "spectator" + } + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/chat/POST/requestBody/urlEncodedForm/room`. + internal var room: Operations.boardGameChatPost.Input.Body.urlEncodedFormPayload.roomPayload + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/chat/POST/requestBody/urlEncodedForm/text`. + internal var text: Swift.String + /// Creates a new `urlEncodedFormPayload`. + /// + /// - Parameters: + /// - room: + /// - text: + internal init( + room: Operations.boardGameChatPost.Input.Body.urlEncodedFormPayload.roomPayload, + text: Swift.String + ) { + self.room = room + self.text = text + } + internal enum CodingKeys: String, CodingKey { + case room + case text + } + } + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/chat/POST/requestBody/content/application\/x-www-form-urlencoded`. + case urlEncodedForm(Operations.boardGameChatPost.Input.Body.urlEncodedFormPayload) + } + internal var body: Operations.boardGameChatPost.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + /// - body: + internal init( + path: Operations.boardGameChatPost.Input.Path, + headers: Operations.boardGameChatPost.Input.Headers = .init(), + body: Operations.boardGameChatPost.Input.Body + ) { + self.path = path + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/chat/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/chat/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.boardGameChatPost.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/chat/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/chat/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.boardGameChatPost.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.boardGameChatPost.Output.Ok.Headers = .init(), + body: Operations.boardGameChatPost.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The message was successfully posted in the chat. + /// + /// - Remark: Generated from `#/paths//api/board/game/{gameId}/chat/post(boardGameChatPost)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.boardGameChatPost.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.boardGameChatPost.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/chat/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/chat/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.boardGameChatPost.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.boardGameChatPost.Output.BadRequest.Body) { + self.body = body + } + } + /// The posting of the message in the chat failed. + /// + /// - Remark: Generated from `#/paths//api/board/game/{gameId}/chat/post(boardGameChatPost)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.boardGameChatPost.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.boardGameChatPost.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum boardGameAbort { + internal static let id: Swift.String = "boardGameAbort" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/abort/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/abort/POST/path/gameId`. + internal var gameId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - gameId: + internal init(gameId: Swift.String) { + self.gameId = gameId + } + } + internal var path: Operations.boardGameAbort.Input.Path + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/abort/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.boardGameAbort.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.boardGameAbort.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.boardGameAbort.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.boardGameAbort.Input.Path, + headers: Operations.boardGameAbort.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/abort/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/abort/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.boardGameAbort.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/abort/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/abort/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.boardGameAbort.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.boardGameAbort.Output.Ok.Headers = .init(), + body: Operations.boardGameAbort.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The game successfully aborted. + /// + /// - Remark: Generated from `#/paths//api/board/game/{gameId}/abort/post(boardGameAbort)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.boardGameAbort.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.boardGameAbort.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/abort/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/abort/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.boardGameAbort.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.boardGameAbort.Output.BadRequest.Body) { + self.body = body + } + } + /// The abortion of the game failed. + /// + /// - Remark: Generated from `#/paths//api/board/game/{gameId}/abort/post(boardGameAbort)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.boardGameAbort.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.boardGameAbort.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum boardGameResign { + internal static let id: Swift.String = "boardGameResign" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/resign/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/resign/POST/path/gameId`. + internal var gameId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - gameId: + internal init(gameId: Swift.String) { + self.gameId = gameId + } + } + internal var path: Operations.boardGameResign.Input.Path + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/resign/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.boardGameResign.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.boardGameResign.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.boardGameResign.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.boardGameResign.Input.Path, + headers: Operations.boardGameResign.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/resign/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/resign/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.boardGameResign.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/resign/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/resign/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.boardGameResign.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.boardGameResign.Output.Ok.Headers = .init(), + body: Operations.boardGameResign.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The game was successfully resigned. + /// + /// - Remark: Generated from `#/paths//api/board/game/{gameId}/resign/post(boardGameResign)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.boardGameResign.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.boardGameResign.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/resign/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/resign/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.boardGameResign.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.boardGameResign.Output.BadRequest.Body) { + self.body = body + } + } + /// The resigning from the game failed. + /// + /// - Remark: Generated from `#/paths//api/board/game/{gameId}/resign/post(boardGameResign)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.boardGameResign.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.boardGameResign.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum boardGameDraw { + internal static let id: Swift.String = "boardGameDraw" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/draw/{accept}/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/draw/{accept}/POST/path/gameId`. + internal var gameId: Swift.String + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/draw/{accept}/POST/path/accept`. + internal struct acceptPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/draw/{accept}/POST/path/accept/value1`. + internal var value1: Swift.Bool? + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/draw/{accept}/POST/path/accept/value2`. + @frozen internal enum Value2Payload: String, Codable, Hashable, Sendable { + case yes = "yes" + } + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/draw/{accept}/POST/path/accept/value2`. + internal var value2: Operations.boardGameDraw.Input.Path.acceptPayload.Value2Payload? + /// Creates a new `acceptPayload`. + /// + /// - Parameters: + /// - value1: + /// - value2: + internal init( + value1: Swift.Bool? = nil, + value2: Operations.boardGameDraw.Input.Path.acceptPayload.Value2Payload? = nil + ) { + self.value1 = value1 + self.value2 = value2 + } + internal init(from decoder: any Decoder) throws { + var errors: [any Error] = [] + do { + value1 = try decoder.decodeFromSingleValueContainer() + } catch { + errors.append(error) + } + do { + value2 = try decoder.decodeFromSingleValueContainer() + } catch { + errors.append(error) + } + try Swift.DecodingError.verifyAtLeastOneSchemaIsNotNil( + [ + value1, + value2 + ], + type: Self.self, + codingPath: decoder.codingPath, + errors: errors + ) + } + internal func encode(to encoder: any Encoder) throws { + try encoder.encodeFirstNonNilValueToSingleValueContainer([ + value1, + value2 + ]) + } + } + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/draw/{accept}/POST/path/accept`. + internal var accept: Operations.boardGameDraw.Input.Path.acceptPayload + /// Creates a new `Path`. + /// + /// - Parameters: + /// - gameId: + /// - accept: + internal init( + gameId: Swift.String, + accept: Operations.boardGameDraw.Input.Path.acceptPayload + ) { + self.gameId = gameId + self.accept = accept + } + } + internal var path: Operations.boardGameDraw.Input.Path + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/draw/{accept}/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.boardGameDraw.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.boardGameDraw.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.boardGameDraw.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.boardGameDraw.Input.Path, + headers: Operations.boardGameDraw.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/draw/{accept}/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/draw/{accept}/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.boardGameDraw.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/draw/{accept}/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/draw/{accept}/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.boardGameDraw.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.boardGameDraw.Output.Ok.Headers = .init(), + body: Operations.boardGameDraw.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The draw offer was successfully sent. + /// + /// - Remark: Generated from `#/paths//api/board/game/{gameId}/draw/{accept}/post(boardGameDraw)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.boardGameDraw.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.boardGameDraw.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/draw/{accept}/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/draw/{accept}/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.boardGameDraw.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.boardGameDraw.Output.BadRequest.Body) { + self.body = body + } + } + /// The draw offering failed. + /// + /// - Remark: Generated from `#/paths//api/board/game/{gameId}/draw/{accept}/post(boardGameDraw)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.boardGameDraw.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.boardGameDraw.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum boardGameTakeback { + internal static let id: Swift.String = "boardGameTakeback" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/takeback/{accept}/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/takeback/{accept}/POST/path/gameId`. + internal var gameId: Swift.String + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/takeback/{accept}/POST/path/accept`. + internal struct acceptPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/takeback/{accept}/POST/path/accept/value1`. + internal var value1: Swift.Bool? + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/takeback/{accept}/POST/path/accept/value2`. + @frozen internal enum Value2Payload: String, Codable, Hashable, Sendable { + case yes = "yes" + } + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/takeback/{accept}/POST/path/accept/value2`. + internal var value2: Operations.boardGameTakeback.Input.Path.acceptPayload.Value2Payload? + /// Creates a new `acceptPayload`. + /// + /// - Parameters: + /// - value1: + /// - value2: + internal init( + value1: Swift.Bool? = nil, + value2: Operations.boardGameTakeback.Input.Path.acceptPayload.Value2Payload? = nil + ) { + self.value1 = value1 + self.value2 = value2 + } + internal init(from decoder: any Decoder) throws { + var errors: [any Error] = [] + do { + value1 = try decoder.decodeFromSingleValueContainer() + } catch { + errors.append(error) + } + do { + value2 = try decoder.decodeFromSingleValueContainer() + } catch { + errors.append(error) + } + try Swift.DecodingError.verifyAtLeastOneSchemaIsNotNil( + [ + value1, + value2 + ], + type: Self.self, + codingPath: decoder.codingPath, + errors: errors + ) + } + internal func encode(to encoder: any Encoder) throws { + try encoder.encodeFirstNonNilValueToSingleValueContainer([ + value1, + value2 + ]) + } + } + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/takeback/{accept}/POST/path/accept`. + internal var accept: Operations.boardGameTakeback.Input.Path.acceptPayload + /// Creates a new `Path`. + /// + /// - Parameters: + /// - gameId: + /// - accept: + internal init( + gameId: Swift.String, + accept: Operations.boardGameTakeback.Input.Path.acceptPayload + ) { + self.gameId = gameId + self.accept = accept + } + } + internal var path: Operations.boardGameTakeback.Input.Path + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/takeback/{accept}/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.boardGameTakeback.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.boardGameTakeback.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.boardGameTakeback.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.boardGameTakeback.Input.Path, + headers: Operations.boardGameTakeback.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/takeback/{accept}/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/takeback/{accept}/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.boardGameTakeback.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/takeback/{accept}/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/takeback/{accept}/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.boardGameTakeback.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.boardGameTakeback.Output.Ok.Headers = .init(), + body: Operations.boardGameTakeback.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The takeback offer was successfully sent. + /// + /// - Remark: Generated from `#/paths//api/board/game/{gameId}/takeback/{accept}/post(boardGameTakeback)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.boardGameTakeback.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.boardGameTakeback.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/takeback/{accept}/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/takeback/{accept}/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.boardGameTakeback.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.boardGameTakeback.Output.BadRequest.Body) { + self.body = body + } + } + /// The takeback offering failed. + /// + /// - Remark: Generated from `#/paths//api/board/game/{gameId}/takeback/{accept}/post(boardGameTakeback)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.boardGameTakeback.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.boardGameTakeback.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum boardGameClaimVictory { + internal static let id: Swift.String = "boardGameClaimVictory" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/claim-victory/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/claim-victory/POST/path/gameId`. + internal var gameId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - gameId: + internal init(gameId: Swift.String) { + self.gameId = gameId + } + } + internal var path: Operations.boardGameClaimVictory.Input.Path + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/claim-victory/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.boardGameClaimVictory.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.boardGameClaimVictory.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.boardGameClaimVictory.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.boardGameClaimVictory.Input.Path, + headers: Operations.boardGameClaimVictory.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/claim-victory/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/claim-victory/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.boardGameClaimVictory.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/claim-victory/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/claim-victory/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.boardGameClaimVictory.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.boardGameClaimVictory.Output.Ok.Headers = .init(), + body: Operations.boardGameClaimVictory.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The victory was successfully claimed. + /// + /// - Remark: Generated from `#/paths//api/board/game/{gameId}/claim-victory/post(boardGameClaimVictory)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.boardGameClaimVictory.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.boardGameClaimVictory.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/claim-victory/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/claim-victory/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.boardGameClaimVictory.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.boardGameClaimVictory.Output.BadRequest.Body) { + self.body = body + } + } + /// The victory claim has failed. + /// + /// - Remark: Generated from `#/paths//api/board/game/{gameId}/claim-victory/post(boardGameClaimVictory)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.boardGameClaimVictory.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.boardGameClaimVictory.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum boardGameBerserk { + internal static let id: Swift.String = "boardGameBerserk" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/berserk/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/berserk/POST/path/gameId`. + internal var gameId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - gameId: + internal init(gameId: Swift.String) { + self.gameId = gameId + } + } + internal var path: Operations.boardGameBerserk.Input.Path + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/berserk/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.boardGameBerserk.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.boardGameBerserk.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.boardGameBerserk.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.boardGameBerserk.Input.Path, + headers: Operations.boardGameBerserk.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/berserk/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/berserk/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.boardGameBerserk.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/berserk/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/berserk/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.boardGameBerserk.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.boardGameBerserk.Output.Ok.Headers = .init(), + body: Operations.boardGameBerserk.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The player successfully whent berserk. + /// + /// - Remark: Generated from `#/paths//api/board/game/{gameId}/berserk/post(boardGameBerserk)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.boardGameBerserk.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.boardGameBerserk.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/berserk/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/board/game/{gameId}/berserk/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.boardGameBerserk.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.boardGameBerserk.Output.BadRequest.Body) { + self.body = body + } + } + /// The berserk has failed. + /// + /// - Remark: Generated from `#/paths//api/board/game/{gameId}/berserk/post(boardGameBerserk)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.boardGameBerserk.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.boardGameBerserk.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiBotOnline { + internal static let id: Swift.String = "apiBotOnline" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/online/GET/query`. + internal struct Query: Sendable, Hashable { + /// How many bot users to fetch + /// + /// - Remark: Generated from `#/paths/api/bot/online/GET/query/nb`. + internal var nb: Swift.Int? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - nb: How many bot users to fetch + internal init(nb: Swift.Int? = nil) { + self.nb = nb + } + } + internal var query: Operations.apiBotOnline.Input.Query + /// - Remark: Generated from `#/paths/api/bot/online/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiBotOnline.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiBotOnline.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiBotOnline.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - query: + /// - headers: + internal init( + query: Operations.apiBotOnline.Input.Query = .init(), + headers: Operations.apiBotOnline.Input.Headers = .init() + ) { + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/online/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/online/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiBotOnline.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/bot/online/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/online/GET/responses/200/content/application\/x-ndjson`. + case application_x_hyphen_ndjson(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_ndjson`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_ndjson`. + /// - SeeAlso: `.application_x_hyphen_ndjson`. + internal var application_x_hyphen_ndjson: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_ndjson(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiBotOnline.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiBotOnline.Output.Ok.Headers = .init(), + body: Operations.apiBotOnline.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The list of online bot users + /// + /// - Remark: Generated from `#/paths//api/bot/online/get(apiBotOnline)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiBotOnline.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiBotOnline.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_ndjson + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-ndjson": + self = .application_x_hyphen_ndjson + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_ndjson: + return "application/x-ndjson" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_ndjson + ] + } + } + } + /// 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 enum botAccountUpgrade { + internal static let id: Swift.String = "botAccountUpgrade" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/account/upgrade/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.botAccountUpgrade.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.botAccountUpgrade.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.botAccountUpgrade.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + internal init(headers: Operations.botAccountUpgrade.Input.Headers = .init()) { + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/account/upgrade/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/account/upgrade/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.botAccountUpgrade.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/bot/account/upgrade/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/account/upgrade/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.botAccountUpgrade.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.botAccountUpgrade.Output.Ok.Headers = .init(), + body: Operations.botAccountUpgrade.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The bot account was successfully upgraded. + /// + /// - Remark: Generated from `#/paths//api/bot/account/upgrade/post(botAccountUpgrade)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.botAccountUpgrade.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.botAccountUpgrade.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/account/upgrade/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/account/upgrade/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.botAccountUpgrade.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.botAccountUpgrade.Output.BadRequest.Body) { + self.body = body + } + } + /// The upgrade of the bot account failed. + /// + /// - Remark: Generated from `#/paths//api/bot/account/upgrade/post(botAccountUpgrade)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.botAccountUpgrade.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.botAccountUpgrade.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum botGameStream { + internal static let id: Swift.String = "botGameStream" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/stream/{gameId}/GET/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/stream/{gameId}/GET/path/gameId`. + internal var gameId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - gameId: + internal init(gameId: Swift.String) { + self.gameId = gameId + } + } + internal var path: Operations.botGameStream.Input.Path + /// - Remark: Generated from `#/paths/api/bot/game/stream/{gameId}/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.botGameStream.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.botGameStream.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.botGameStream.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.botGameStream.Input.Path, + headers: Operations.botGameStream.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/stream/{gameId}/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/stream/{gameId}/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.botGameStream.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/bot/game/stream/{gameId}/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/stream/{gameId}/GET/responses/200/content/application\/x-ndjson`. + case application_x_hyphen_ndjson(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_ndjson`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_ndjson`. + /// - SeeAlso: `.application_x_hyphen_ndjson`. + internal var application_x_hyphen_ndjson: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_ndjson(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.botGameStream.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.botGameStream.Output.Ok.Headers = .init(), + body: Operations.botGameStream.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The stream of the bot game. + /// + /// - Remark: Generated from `#/paths//api/bot/game/stream/{gameId}/get(botGameStream)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.botGameStream.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.botGameStream.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct NotFound: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/stream/{gameId}/GET/responses/404/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/stream/{gameId}/GET/responses/404/content/application\/json`. + case json(Components.Schemas.NotFound) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.NotFound { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.botGameStream.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.botGameStream.Output.NotFound.Body) { + self.body = body + } + } + /// The bot game was not found. + /// + /// - Remark: Generated from `#/paths//api/bot/game/stream/{gameId}/get(botGameStream)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.botGameStream.Output.NotFound) + /// The associated value of the enum case if `self` is `.notFound`. + /// + /// - Throws: An error if `self` is not `.notFound`. + /// - SeeAlso: `.notFound`. + internal var notFound: Operations.botGameStream.Output.NotFound { + get throws { + switch self { + case let .notFound(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "notFound", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_ndjson + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-ndjson": + self = .application_x_hyphen_ndjson + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_ndjson: + return "application/x-ndjson" + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_ndjson, + .json + ] + } + } + } + /// 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 enum botGameMove { + internal static let id: Swift.String = "botGameMove" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/move/{move}/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/move/{move}/POST/path/gameId`. + internal var gameId: Swift.String + /// The move to play, in UCI format + /// + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/move/{move}/POST/path/move`. + internal var move: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - gameId: + /// - move: The move to play, in UCI format + internal init( + gameId: Swift.String, + move: Swift.String + ) { + self.gameId = gameId + self.move = move + } + } + internal var path: Operations.botGameMove.Input.Path + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/move/{move}/POST/query`. + internal struct Query: Sendable, Hashable { + /// Whether to offer (or agree to) a draw + /// + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/move/{move}/POST/query/offeringDraw`. + internal var offeringDraw: Swift.Bool? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - offeringDraw: Whether to offer (or agree to) a draw + internal init(offeringDraw: Swift.Bool? = nil) { + self.offeringDraw = offeringDraw + } + } + internal var query: Operations.botGameMove.Input.Query + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/move/{move}/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.botGameMove.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.botGameMove.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.botGameMove.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + internal init( + path: Operations.botGameMove.Input.Path, + query: Operations.botGameMove.Input.Query = .init(), + headers: Operations.botGameMove.Input.Headers = .init() + ) { + self.path = path + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/move/{move}/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/move/{move}/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.botGameMove.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/move/{move}/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/move/{move}/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.botGameMove.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.botGameMove.Output.Ok.Headers = .init(), + body: Operations.botGameMove.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The bot move was successfully made. + /// + /// - Remark: Generated from `#/paths//api/bot/game/{gameId}/move/{move}/post(botGameMove)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.botGameMove.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.botGameMove.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/move/{move}/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/move/{move}/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.botGameMove.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.botGameMove.Output.BadRequest.Body) { + self.body = body + } + } + /// The bot move failed. + /// + /// - Remark: Generated from `#/paths//api/bot/game/{gameId}/move/{move}/post(botGameMove)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.botGameMove.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.botGameMove.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum botGameChatGet { + internal static let id: Swift.String = "botGameChatGet" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/chat/GET/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/chat/GET/path/gameId`. + internal var gameId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - gameId: + internal init(gameId: Swift.String) { + self.gameId = gameId + } + } + internal var path: Operations.botGameChatGet.Input.Path + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/chat/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.botGameChatGet.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.botGameChatGet.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.botGameChatGet.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.botGameChatGet.Input.Path, + headers: Operations.botGameChatGet.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/chat/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/chat/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.botGameChatGet.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/chat/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/chat/GET/responses/200/content/application\/x-ndjson`. + case application_x_hyphen_ndjson(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_ndjson`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_ndjson`. + /// - SeeAlso: `.application_x_hyphen_ndjson`. + internal var application_x_hyphen_ndjson: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_ndjson(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.botGameChatGet.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.botGameChatGet.Output.Ok.Headers = .init(), + body: Operations.botGameChatGet.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The messages posted in the chat. + /// + /// - Remark: Generated from `#/paths//api/bot/game/{gameId}/chat/get(botGameChatGet)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.botGameChatGet.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.botGameChatGet.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_ndjson + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-ndjson": + self = .application_x_hyphen_ndjson + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_ndjson: + return "application/x-ndjson" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_ndjson + ] + } + } + } + /// 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 enum botGameChat { + internal static let id: Swift.String = "botGameChat" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/chat/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/chat/POST/path/gameId`. + internal var gameId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - gameId: + internal init(gameId: Swift.String) { + self.gameId = gameId + } + } + internal var path: Operations.botGameChat.Input.Path + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/chat/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.botGameChat.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.botGameChat.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.botGameChat.Input.Headers + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/chat/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/chat/POST/requestBody/urlEncodedForm`. + internal struct urlEncodedFormPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/chat/POST/requestBody/urlEncodedForm/room`. + @frozen internal enum roomPayload: String, Codable, Hashable, Sendable { + case player = "player" + case spectator = "spectator" + } + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/chat/POST/requestBody/urlEncodedForm/room`. + internal var room: Operations.botGameChat.Input.Body.urlEncodedFormPayload.roomPayload + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/chat/POST/requestBody/urlEncodedForm/text`. + internal var text: Swift.String + /// Creates a new `urlEncodedFormPayload`. + /// + /// - Parameters: + /// - room: + /// - text: + internal init( + room: Operations.botGameChat.Input.Body.urlEncodedFormPayload.roomPayload, + text: Swift.String + ) { + self.room = room + self.text = text + } + internal enum CodingKeys: String, CodingKey { + case room + case text + } + } + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/chat/POST/requestBody/content/application\/x-www-form-urlencoded`. + case urlEncodedForm(Operations.botGameChat.Input.Body.urlEncodedFormPayload) + } + internal var body: Operations.botGameChat.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + /// - body: + internal init( + path: Operations.botGameChat.Input.Path, + headers: Operations.botGameChat.Input.Headers = .init(), + body: Operations.botGameChat.Input.Body + ) { + self.path = path + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/chat/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/chat/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.botGameChat.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/chat/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/chat/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.botGameChat.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.botGameChat.Output.Ok.Headers = .init(), + body: Operations.botGameChat.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The message was successfully posted in chat. + /// + /// - Remark: Generated from `#/paths//api/bot/game/{gameId}/chat/post(botGameChat)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.botGameChat.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.botGameChat.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/chat/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/chat/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.botGameChat.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.botGameChat.Output.BadRequest.Body) { + self.body = body + } + } + /// The posting of the message in chat failed. + /// + /// - Remark: Generated from `#/paths//api/bot/game/{gameId}/chat/post(botGameChat)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.botGameChat.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.botGameChat.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum botGameAbort { + internal static let id: Swift.String = "botGameAbort" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/abort/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/abort/POST/path/gameId`. + internal var gameId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - gameId: + internal init(gameId: Swift.String) { + self.gameId = gameId + } + } + internal var path: Operations.botGameAbort.Input.Path + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/abort/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.botGameAbort.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.botGameAbort.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.botGameAbort.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.botGameAbort.Input.Path, + headers: Operations.botGameAbort.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/abort/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/abort/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.botGameAbort.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/abort/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/abort/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.botGameAbort.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.botGameAbort.Output.Ok.Headers = .init(), + body: Operations.botGameAbort.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The game was successfully aborted. + /// + /// - Remark: Generated from `#/paths//api/bot/game/{gameId}/abort/post(botGameAbort)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.botGameAbort.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.botGameAbort.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/abort/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/abort/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.botGameAbort.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.botGameAbort.Output.BadRequest.Body) { + self.body = body + } + } + /// The abortion of the game failed. + /// + /// - Remark: Generated from `#/paths//api/bot/game/{gameId}/abort/post(botGameAbort)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.botGameAbort.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.botGameAbort.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum botGameResign { + internal static let id: Swift.String = "botGameResign" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/resign/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/resign/POST/path/gameId`. + internal var gameId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - gameId: + internal init(gameId: Swift.String) { + self.gameId = gameId + } + } + internal var path: Operations.botGameResign.Input.Path + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/resign/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.botGameResign.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.botGameResign.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.botGameResign.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.botGameResign.Input.Path, + headers: Operations.botGameResign.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/resign/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/resign/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.botGameResign.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/resign/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/resign/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.botGameResign.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.botGameResign.Output.Ok.Headers = .init(), + body: Operations.botGameResign.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The game was successfully resigned from. + /// + /// - Remark: Generated from `#/paths//api/bot/game/{gameId}/resign/post(botGameResign)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.botGameResign.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.botGameResign.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/resign/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/resign/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.botGameResign.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.botGameResign.Output.BadRequest.Body) { + self.body = body + } + } + /// Resigning the game failed. + /// + /// - Remark: Generated from `#/paths//api/bot/game/{gameId}/resign/post(botGameResign)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.botGameResign.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.botGameResign.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum botGameDraw { + internal static let id: Swift.String = "botGameDraw" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/draw/{accept}/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/draw/{accept}/POST/path/gameId`. + internal var gameId: Swift.String + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/draw/{accept}/POST/path/accept`. + internal struct acceptPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/draw/{accept}/POST/path/accept/value1`. + internal var value1: Swift.Bool? + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/draw/{accept}/POST/path/accept/value2`. + @frozen internal enum Value2Payload: String, Codable, Hashable, Sendable { + case yes = "yes" + } + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/draw/{accept}/POST/path/accept/value2`. + internal var value2: Operations.botGameDraw.Input.Path.acceptPayload.Value2Payload? + /// Creates a new `acceptPayload`. + /// + /// - Parameters: + /// - value1: + /// - value2: + internal init( + value1: Swift.Bool? = nil, + value2: Operations.botGameDraw.Input.Path.acceptPayload.Value2Payload? = nil + ) { + self.value1 = value1 + self.value2 = value2 + } + internal init(from decoder: any Decoder) throws { + var errors: [any Error] = [] + do { + value1 = try decoder.decodeFromSingleValueContainer() + } catch { + errors.append(error) + } + do { + value2 = try decoder.decodeFromSingleValueContainer() + } catch { + errors.append(error) + } + try Swift.DecodingError.verifyAtLeastOneSchemaIsNotNil( + [ + value1, + value2 + ], + type: Self.self, + codingPath: decoder.codingPath, + errors: errors + ) + } + internal func encode(to encoder: any Encoder) throws { + try encoder.encodeFirstNonNilValueToSingleValueContainer([ + value1, + value2 + ]) + } + } + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/draw/{accept}/POST/path/accept`. + internal var accept: Operations.botGameDraw.Input.Path.acceptPayload + /// Creates a new `Path`. + /// + /// - Parameters: + /// - gameId: + /// - accept: + internal init( + gameId: Swift.String, + accept: Operations.botGameDraw.Input.Path.acceptPayload + ) { + self.gameId = gameId + self.accept = accept + } + } + internal var path: Operations.botGameDraw.Input.Path + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/draw/{accept}/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.botGameDraw.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.botGameDraw.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.botGameDraw.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.botGameDraw.Input.Path, + headers: Operations.botGameDraw.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/draw/{accept}/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/draw/{accept}/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.botGameDraw.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/draw/{accept}/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/draw/{accept}/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.botGameDraw.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.botGameDraw.Output.Ok.Headers = .init(), + body: Operations.botGameDraw.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The draw offer was successfully sent. + /// + /// - Remark: Generated from `#/paths//api/bot/game/{gameId}/draw/{accept}/post(botGameDraw)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.botGameDraw.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.botGameDraw.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/draw/{accept}/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/draw/{accept}/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.botGameDraw.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.botGameDraw.Output.BadRequest.Body) { + self.body = body + } + } + /// The draw offering failed. + /// + /// - Remark: Generated from `#/paths//api/bot/game/{gameId}/draw/{accept}/post(botGameDraw)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.botGameDraw.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.botGameDraw.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum botGameTakeback { + internal static let id: Swift.String = "botGameTakeback" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/takeback/{accept}/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/takeback/{accept}/POST/path/gameId`. + internal var gameId: Swift.String + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/takeback/{accept}/POST/path/accept`. + internal struct acceptPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/takeback/{accept}/POST/path/accept/value1`. + internal var value1: Swift.Bool? + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/takeback/{accept}/POST/path/accept/value2`. + @frozen internal enum Value2Payload: String, Codable, Hashable, Sendable { + case yes = "yes" + } + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/takeback/{accept}/POST/path/accept/value2`. + internal var value2: Operations.botGameTakeback.Input.Path.acceptPayload.Value2Payload? + /// Creates a new `acceptPayload`. + /// + /// - Parameters: + /// - value1: + /// - value2: + internal init( + value1: Swift.Bool? = nil, + value2: Operations.botGameTakeback.Input.Path.acceptPayload.Value2Payload? = nil + ) { + self.value1 = value1 + self.value2 = value2 + } + internal init(from decoder: any Decoder) throws { + var errors: [any Error] = [] + do { + value1 = try decoder.decodeFromSingleValueContainer() + } catch { + errors.append(error) + } + do { + value2 = try decoder.decodeFromSingleValueContainer() + } catch { + errors.append(error) + } + try Swift.DecodingError.verifyAtLeastOneSchemaIsNotNil( + [ + value1, + value2 + ], + type: Self.self, + codingPath: decoder.codingPath, + errors: errors + ) + } + internal func encode(to encoder: any Encoder) throws { + try encoder.encodeFirstNonNilValueToSingleValueContainer([ + value1, + value2 + ]) + } + } + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/takeback/{accept}/POST/path/accept`. + internal var accept: Operations.botGameTakeback.Input.Path.acceptPayload + /// Creates a new `Path`. + /// + /// - Parameters: + /// - gameId: + /// - accept: + internal init( + gameId: Swift.String, + accept: Operations.botGameTakeback.Input.Path.acceptPayload + ) { + self.gameId = gameId + self.accept = accept + } + } + internal var path: Operations.botGameTakeback.Input.Path + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/takeback/{accept}/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.botGameTakeback.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.botGameTakeback.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.botGameTakeback.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.botGameTakeback.Input.Path, + headers: Operations.botGameTakeback.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/takeback/{accept}/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/takeback/{accept}/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.botGameTakeback.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/takeback/{accept}/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/takeback/{accept}/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.botGameTakeback.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.botGameTakeback.Output.Ok.Headers = .init(), + body: Operations.botGameTakeback.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The takeback offer was successfully sent. + /// + /// - Remark: Generated from `#/paths//api/bot/game/{gameId}/takeback/{accept}/post(botGameTakeback)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.botGameTakeback.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.botGameTakeback.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/takeback/{accept}/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bot/game/{gameId}/takeback/{accept}/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.botGameTakeback.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.botGameTakeback.Output.BadRequest.Body) { + self.body = body + } + } + /// The takeback offering failed. + /// + /// - Remark: Generated from `#/paths//api/bot/game/{gameId}/takeback/{accept}/post(botGameTakeback)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.botGameTakeback.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.botGameTakeback.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum challengeList { + internal static let id: Swift.String = "challengeList" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.challengeList.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.challengeList.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.challengeList.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + internal init(headers: Operations.challengeList.Input.Headers = .init()) { + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.challengeList.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/challenge/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/GET/responses/200/content/json`. + internal struct jsonPayload: Codable, Hashable, Sendable { + /// Incoming challenges i.e. targeted at you + /// + /// - Remark: Generated from `#/paths/api/challenge/GET/responses/200/content/json/in`. + internal var _in: [Components.Schemas.ChallengeJson]? + /// Outgoing challenges i.e. created by you + /// + /// - Remark: Generated from `#/paths/api/challenge/GET/responses/200/content/json/out`. + internal var out: [Components.Schemas.ChallengeJson]? + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - _in: Incoming challenges i.e. targeted at you + /// - out: Outgoing challenges i.e. created by you + internal init( + _in: [Components.Schemas.ChallengeJson]? = nil, + out: [Components.Schemas.ChallengeJson]? = nil + ) { + self._in = _in + self.out = out + } + internal enum CodingKeys: String, CodingKey { + case _in = "in" + case out + } + } + /// - Remark: Generated from `#/paths/api/challenge/GET/responses/200/content/application\/json`. + case json(Operations.challengeList.Output.Ok.Body.jsonPayload) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Operations.challengeList.Output.Ok.Body.jsonPayload { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.challengeList.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.challengeList.Output.Ok.Headers = .init(), + body: Operations.challengeList.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The list of challenges created by or targeted at the logged in user. + /// + /// - Remark: Generated from `#/paths//api/challenge/get(challengeList)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.challengeList.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.challengeList.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum challengeCreate { + internal static let id: Swift.String = "challengeCreate" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{username}/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{username}/POST/path/username`. + internal var username: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - username: + internal init(username: Swift.String) { + self.username = username + } + } + internal var path: Operations.challengeCreate.Input.Path + /// - Remark: Generated from `#/paths/api/challenge/{username}/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.challengeCreate.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.challengeCreate.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.challengeCreate.Input.Headers + /// - Remark: Generated from `#/paths/api/challenge/{username}/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{username}/POST/requestBody/urlEncodedForm`. + internal struct urlEncodedFormPayload: Codable, Hashable, Sendable { + /// Game is rated and impacts players ratings + /// + /// - Remark: Generated from `#/paths/api/challenge/{username}/POST/requestBody/urlEncodedForm/rated`. + internal var rated: Swift.Bool? + /// Clock initial time in seconds. If empty, a correspondence game is created. Valid values are 0, 15, 30, 45, 60, 90, and any multiple of 60 up to 10800 (3 hours). + /// + /// - Remark: Generated from `#/paths/api/challenge/{username}/POST/requestBody/urlEncodedForm/clock.limit`. + internal var clock_period_limit: Swift.Double? + /// Clock increment in seconds. If empty, a correspondence game is created. + /// + /// - Remark: Generated from `#/paths/api/challenge/{username}/POST/requestBody/urlEncodedForm/clock.increment`. + internal var clock_period_increment: Swift.Int? + /// Days per move, for correspondence games. Clock settings must be omitted. + /// + /// - Remark: Generated from `#/paths/api/challenge/{username}/POST/requestBody/urlEncodedForm/days`. + @frozen internal enum daysPayload: Int, Codable, Hashable, Sendable { + case _1 = 1 + case _2 = 2 + case _3 = 3 + case _5 = 5 + case _7 = 7 + case _10 = 10 + case _14 = 14 + } + /// Days per move, for correspondence games. Clock settings must be omitted. + /// + /// - Remark: Generated from `#/paths/api/challenge/{username}/POST/requestBody/urlEncodedForm/days`. + internal var days: Operations.challengeCreate.Input.Body.urlEncodedFormPayload.daysPayload? + /// Which color you get to play + /// + /// - Remark: Generated from `#/paths/api/challenge/{username}/POST/requestBody/urlEncodedForm/color`. + @frozen internal enum colorPayload: String, Codable, Hashable, Sendable { + case random = "random" + case white = "white" + case black = "black" + } + /// Which color you get to play + /// + /// - Remark: Generated from `#/paths/api/challenge/{username}/POST/requestBody/urlEncodedForm/color`. + internal var color: Operations.challengeCreate.Input.Body.urlEncodedFormPayload.colorPayload? + /// - Remark: Generated from `#/paths/api/challenge/{username}/POST/requestBody/urlEncodedForm/variant`. + internal var variant: Components.Schemas.VariantKey? + /// - Remark: Generated from `#/paths/api/challenge/{username}/POST/requestBody/urlEncodedForm/fen`. + internal var fen: Components.Schemas.FromPositionFEN? + /// If set, the response is streamed as [ndjson](#section/Introduction/Streaming-with-ND-JSON). + /// The challenge is kept alive until the connection is closed by the client. + /// When the challenge is accepted, declined or canceled, a message of the form `{"done":"accepted"}` is sent, + /// then the connection is closed by the server. + /// If not set, the response is not streamed, and the challenge expires after 20s if not accepted. + /// + /// + /// - Remark: Generated from `#/paths/api/challenge/{username}/POST/requestBody/urlEncodedForm/keepAliveStream`. + internal var keepAliveStream: Swift.Bool? + /// Extra game rules separated by commas. + /// Example: `noAbort,noRematch` + /// + /// + /// - Remark: Generated from `#/paths/api/challenge/{username}/POST/requestBody/urlEncodedForm/rules`. + @frozen internal enum rulesPayload: String, Codable, Hashable, Sendable { + case noAbort = "noAbort" + case noRematch = "noRematch" + case noGiveTime = "noGiveTime" + case noClaimWin = "noClaimWin" + case noEarlyDraw = "noEarlyDraw" + } + /// Extra game rules separated by commas. + /// Example: `noAbort,noRematch` + /// + /// + /// - Remark: Generated from `#/paths/api/challenge/{username}/POST/requestBody/urlEncodedForm/rules`. + internal var rules: Operations.challengeCreate.Input.Body.urlEncodedFormPayload.rulesPayload? + /// Creates a new `urlEncodedFormPayload`. + /// + /// - Parameters: + /// - rated: Game is rated and impacts players ratings + /// - clock_period_limit: Clock initial time in seconds. If empty, a correspondence game is created. Valid values are 0, 15, 30, 45, 60, 90, and any multiple of 60 up to 10800 (3 hours). + /// - clock_period_increment: Clock increment in seconds. If empty, a correspondence game is created. + /// - days: Days per move, for correspondence games. Clock settings must be omitted. + /// - color: Which color you get to play + /// - variant: + /// - fen: + /// - keepAliveStream: If set, the response is streamed as [ndjson](#section/Introduction/Streaming-with-ND-JSON). + /// - rules: Extra game rules separated by commas. + internal init( + rated: Swift.Bool? = nil, + clock_period_limit: Swift.Double? = nil, + clock_period_increment: Swift.Int? = nil, + days: Operations.challengeCreate.Input.Body.urlEncodedFormPayload.daysPayload? = nil, + color: Operations.challengeCreate.Input.Body.urlEncodedFormPayload.colorPayload? = nil, + variant: Components.Schemas.VariantKey? = nil, + fen: Components.Schemas.FromPositionFEN? = nil, + keepAliveStream: Swift.Bool? = nil, + rules: Operations.challengeCreate.Input.Body.urlEncodedFormPayload.rulesPayload? = nil + ) { + self.rated = rated + self.clock_period_limit = clock_period_limit + self.clock_period_increment = clock_period_increment + self.days = days + self.color = color + self.variant = variant + self.fen = fen + self.keepAliveStream = keepAliveStream + self.rules = rules + } + internal enum CodingKeys: String, CodingKey { + case rated + case clock_period_limit = "clock.limit" + case clock_period_increment = "clock.increment" + case days + case color + case variant + case fen + case keepAliveStream + case rules + } + } + /// - Remark: Generated from `#/paths/api/challenge/{username}/POST/requestBody/content/application\/x-www-form-urlencoded`. + case urlEncodedForm(Operations.challengeCreate.Input.Body.urlEncodedFormPayload) + } + internal var body: Operations.challengeCreate.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + /// - body: + internal init( + path: Operations.challengeCreate.Input.Path, + headers: Operations.challengeCreate.Input.Headers = .init(), + body: Operations.challengeCreate.Input.Body + ) { + self.path = path + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{username}/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{username}/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.challengeCreate.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/challenge/{username}/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{username}/POST/responses/200/content/json`. + internal struct jsonPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/challenge/{username}/POST/responses/200/content/json/challenge`. + internal var challenge: Components.Schemas.ChallengeJson? + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - challenge: + internal init(challenge: Components.Schemas.ChallengeJson? = nil) { + self.challenge = challenge + } + internal enum CodingKeys: String, CodingKey { + case challenge + } + } + /// - Remark: Generated from `#/paths/api/challenge/{username}/POST/responses/200/content/application\/json`. + case json(Operations.challengeCreate.Output.Ok.Body.jsonPayload) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Operations.challengeCreate.Output.Ok.Body.jsonPayload { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.challengeCreate.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.challengeCreate.Output.Ok.Headers = .init(), + body: Operations.challengeCreate.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The challenge was successfully created. + /// + /// - Remark: Generated from `#/paths//api/challenge/{username}/post(challengeCreate)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.challengeCreate.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.challengeCreate.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{username}/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{username}/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.challengeCreate.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.challengeCreate.Output.BadRequest.Body) { + self.body = body + } + } + /// The creation of the challenge failed. + /// + /// - Remark: Generated from `#/paths//api/challenge/{username}/post(challengeCreate)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.challengeCreate.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.challengeCreate.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum challengeAccept { + internal static let id: Swift.String = "challengeAccept" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/accept/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/accept/POST/path/challengeId`. + internal var challengeId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - challengeId: + internal init(challengeId: Swift.String) { + self.challengeId = challengeId + } + } + internal var path: Operations.challengeAccept.Input.Path + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/accept/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.challengeAccept.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.challengeAccept.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.challengeAccept.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.challengeAccept.Input.Path, + headers: Operations.challengeAccept.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/accept/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/accept/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.challengeAccept.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/accept/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/accept/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.challengeAccept.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.challengeAccept.Output.Ok.Headers = .init(), + body: Operations.challengeAccept.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The challenge was successfully accepted. + /// + /// - Remark: Generated from `#/paths//api/challenge/{challengeId}/accept/post(challengeAccept)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.challengeAccept.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.challengeAccept.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct NotFound: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/accept/POST/responses/404/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/accept/POST/responses/404/content/application\/json`. + case json(Components.Schemas.NotFound) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.NotFound { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.challengeAccept.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.challengeAccept.Output.NotFound.Body) { + self.body = body + } + } + /// The challenge to accept was not found. + /// + /// - Remark: Generated from `#/paths//api/challenge/{challengeId}/accept/post(challengeAccept)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.challengeAccept.Output.NotFound) + /// The associated value of the enum case if `self` is `.notFound`. + /// + /// - Throws: An error if `self` is not `.notFound`. + /// - SeeAlso: `.notFound`. + internal var notFound: Operations.challengeAccept.Output.NotFound { + get throws { + switch self { + case let .notFound(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "notFound", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum challengeDecline { + internal static let id: Swift.String = "challengeDecline" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/decline/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/decline/POST/path/challengeId`. + internal var challengeId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - challengeId: + internal init(challengeId: Swift.String) { + self.challengeId = challengeId + } + } + internal var path: Operations.challengeDecline.Input.Path + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/decline/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.challengeDecline.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.challengeDecline.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.challengeDecline.Input.Headers + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/decline/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/decline/POST/requestBody/urlEncodedForm`. + internal struct urlEncodedFormPayload: Codable, Hashable, Sendable { + /// Reason challenge was declined. It will be translated to the player's language. See [the full list in the translation file](https://github.com/ornicar/lila/blob/master/translation/source/challenge.xml#L14). + /// + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/decline/POST/requestBody/urlEncodedForm/reason`. + @frozen internal enum reasonPayload: String, Codable, Hashable, Sendable { + case generic = "generic" + case later = "later" + case tooFast = "tooFast" + case tooSlow = "tooSlow" + case timeControl = "timeControl" + case rated = "rated" + case casual = "casual" + case standard = "standard" + case variant = "variant" + case noBot = "noBot" + case onlyBot = "onlyBot" + } + /// Reason challenge was declined. It will be translated to the player's language. See [the full list in the translation file](https://github.com/ornicar/lila/blob/master/translation/source/challenge.xml#L14). + /// + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/decline/POST/requestBody/urlEncodedForm/reason`. + internal var reason: Operations.challengeDecline.Input.Body.urlEncodedFormPayload.reasonPayload? + /// Creates a new `urlEncodedFormPayload`. + /// + /// - Parameters: + /// - reason: Reason challenge was declined. It will be translated to the player's language. See [the full list in the translation file](https://github.com/ornicar/lila/blob/master/translation/source/challenge.xml#L14). + internal init(reason: Operations.challengeDecline.Input.Body.urlEncodedFormPayload.reasonPayload? = nil) { + self.reason = reason + } + internal enum CodingKeys: String, CodingKey { + case reason + } + } + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/decline/POST/requestBody/content/application\/x-www-form-urlencoded`. + case urlEncodedForm(Operations.challengeDecline.Input.Body.urlEncodedFormPayload) + } + internal var body: Operations.challengeDecline.Input.Body? + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + /// - body: + internal init( + path: Operations.challengeDecline.Input.Path, + headers: Operations.challengeDecline.Input.Headers = .init(), + body: Operations.challengeDecline.Input.Body? = nil + ) { + self.path = path + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/decline/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/decline/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.challengeDecline.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/decline/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/decline/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.challengeDecline.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.challengeDecline.Output.Ok.Headers = .init(), + body: Operations.challengeDecline.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The challenge was successfully declined. + /// + /// - Remark: Generated from `#/paths//api/challenge/{challengeId}/decline/post(challengeDecline)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.challengeDecline.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.challengeDecline.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct NotFound: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/decline/POST/responses/404/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/decline/POST/responses/404/content/application\/json`. + case json(Components.Schemas.NotFound) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.NotFound { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.challengeDecline.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.challengeDecline.Output.NotFound.Body) { + self.body = body + } + } + /// The challenge to decline was not found. + /// + /// - Remark: Generated from `#/paths//api/challenge/{challengeId}/decline/post(challengeDecline)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.challengeDecline.Output.NotFound) + /// The associated value of the enum case if `self` is `.notFound`. + /// + /// - Throws: An error if `self` is not `.notFound`. + /// - SeeAlso: `.notFound`. + internal var notFound: Operations.challengeDecline.Output.NotFound { + get throws { + switch self { + case let .notFound(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "notFound", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum challengeCancel { + internal static let id: Swift.String = "challengeCancel" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/cancel/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/cancel/POST/path/challengeId`. + internal var challengeId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - challengeId: + internal init(challengeId: Swift.String) { + self.challengeId = challengeId + } + } + internal var path: Operations.challengeCancel.Input.Path + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/cancel/POST/query`. + internal struct Query: Sendable, Hashable { + /// Optional `challenge:write` token of the opponent. If set, the game can be canceled even if both players have moved. + /// + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/cancel/POST/query/opponentToken`. + internal var opponentToken: Swift.String? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - opponentToken: Optional `challenge:write` token of the opponent. If set, the game can be canceled even if both players have moved. + internal init(opponentToken: Swift.String? = nil) { + self.opponentToken = opponentToken + } + } + internal var query: Operations.challengeCancel.Input.Query + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/cancel/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.challengeCancel.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.challengeCancel.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.challengeCancel.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + internal init( + path: Operations.challengeCancel.Input.Path, + query: Operations.challengeCancel.Input.Query = .init(), + headers: Operations.challengeCancel.Input.Headers = .init() + ) { + self.path = path + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/cancel/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/cancel/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.challengeCancel.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/cancel/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/cancel/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.challengeCancel.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.challengeCancel.Output.Ok.Headers = .init(), + body: Operations.challengeCancel.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The challenge was successfully cancelled. + /// + /// - Remark: Generated from `#/paths//api/challenge/{challengeId}/cancel/post(challengeCancel)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.challengeCancel.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.challengeCancel.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct NotFound: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/cancel/POST/responses/404/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{challengeId}/cancel/POST/responses/404/content/application\/json`. + case json(Components.Schemas.NotFound) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.NotFound { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.challengeCancel.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.challengeCancel.Output.NotFound.Body) { + self.body = body + } + } + /// The challenge to cancel was not found. + /// + /// - Remark: Generated from `#/paths//api/challenge/{challengeId}/cancel/post(challengeCancel)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.challengeCancel.Output.NotFound) + /// The associated value of the enum case if `self` is `.notFound`. + /// + /// - Throws: An error if `self` is not `.notFound`. + /// - SeeAlso: `.notFound`. + internal var notFound: Operations.challengeCancel.Output.NotFound { + get throws { + switch self { + case let .notFound(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "notFound", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum challengeAi { + internal static let id: Swift.String = "challengeAi" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/ai/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.challengeAi.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.challengeAi.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.challengeAi.Input.Headers + /// - Remark: Generated from `#/paths/api/challenge/ai/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/ai/POST/requestBody/urlEncodedForm`. + internal struct urlEncodedFormPayload: Codable, Hashable, Sendable { + /// AI strength + /// + /// - Remark: Generated from `#/paths/api/challenge/ai/POST/requestBody/urlEncodedForm/level`. + internal var level: Swift.Double? + /// Clock initial time in seconds. If empty, a correspondence game is created. + /// + /// - Remark: Generated from `#/paths/api/challenge/ai/POST/requestBody/urlEncodedForm/clock.limit`. + internal var clock_period_limit: Swift.Double? + /// Clock increment in seconds. If empty, a correspondence game is created. + /// + /// - Remark: Generated from `#/paths/api/challenge/ai/POST/requestBody/urlEncodedForm/clock.increment`. + internal var clock_period_increment: Swift.Int? + /// Days per move, for correspondence games. Clock settings must be omitted. + /// + /// - Remark: Generated from `#/paths/api/challenge/ai/POST/requestBody/urlEncodedForm/days`. + @frozen internal enum daysPayload: Int, Codable, Hashable, Sendable { + case _1 = 1 + case _2 = 2 + case _3 = 3 + case _5 = 5 + case _7 = 7 + case _10 = 10 + case _14 = 14 + } + /// Days per move, for correspondence games. Clock settings must be omitted. + /// + /// - Remark: Generated from `#/paths/api/challenge/ai/POST/requestBody/urlEncodedForm/days`. + internal var days: Operations.challengeAi.Input.Body.urlEncodedFormPayload.daysPayload? + /// Which color you get to play + /// + /// - Remark: Generated from `#/paths/api/challenge/ai/POST/requestBody/urlEncodedForm/color`. + @frozen internal enum colorPayload: String, Codable, Hashable, Sendable { + case random = "random" + case white = "white" + case black = "black" + } + /// Which color you get to play + /// + /// - Remark: Generated from `#/paths/api/challenge/ai/POST/requestBody/urlEncodedForm/color`. + internal var color: Operations.challengeAi.Input.Body.urlEncodedFormPayload.colorPayload? + /// - Remark: Generated from `#/paths/api/challenge/ai/POST/requestBody/urlEncodedForm/variant`. + internal var variant: Components.Schemas.VariantKey? + /// - Remark: Generated from `#/paths/api/challenge/ai/POST/requestBody/urlEncodedForm/fen`. + internal var fen: Components.Schemas.FromPositionFEN? + /// Creates a new `urlEncodedFormPayload`. + /// + /// - Parameters: + /// - level: AI strength + /// - clock_period_limit: Clock initial time in seconds. If empty, a correspondence game is created. + /// - clock_period_increment: Clock increment in seconds. If empty, a correspondence game is created. + /// - days: Days per move, for correspondence games. Clock settings must be omitted. + /// - color: Which color you get to play + /// - variant: + /// - fen: + internal init( + level: Swift.Double? = nil, + clock_period_limit: Swift.Double? = nil, + clock_period_increment: Swift.Int? = nil, + days: Operations.challengeAi.Input.Body.urlEncodedFormPayload.daysPayload? = nil, + color: Operations.challengeAi.Input.Body.urlEncodedFormPayload.colorPayload? = nil, + variant: Components.Schemas.VariantKey? = nil, + fen: Components.Schemas.FromPositionFEN? = nil + ) { + self.level = level + self.clock_period_limit = clock_period_limit + self.clock_period_increment = clock_period_increment + self.days = days + self.color = color + self.variant = variant + self.fen = fen + } + internal enum CodingKeys: String, CodingKey { + case level + case clock_period_limit = "clock.limit" + case clock_period_increment = "clock.increment" + case days + case color + case variant + case fen + } + } + /// - Remark: Generated from `#/paths/api/challenge/ai/POST/requestBody/content/application\/x-www-form-urlencoded`. + case urlEncodedForm(Operations.challengeAi.Input.Body.urlEncodedFormPayload) + } + internal var body: Operations.challengeAi.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + /// - body: + internal init( + headers: Operations.challengeAi.Input.Headers = .init(), + body: Operations.challengeAi.Input.Body + ) { + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Created: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/ai/POST/responses/201/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/ai/POST/responses/201/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.challengeAi.Output.Created.Headers + /// - Remark: Generated from `#/paths/api/challenge/ai/POST/responses/201/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/ai/POST/responses/201/content/application\/json`. + case json(Components.Schemas.GameJson) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.GameJson { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.challengeAi.Output.Created.Body + /// Creates a new `Created`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.challengeAi.Output.Created.Headers = .init(), + body: Operations.challengeAi.Output.Created.Body + ) { + self.headers = headers + self.body = body + } + } + /// The game with Lichess AI was successfully started. + /// + /// - Remark: Generated from `#/paths//api/challenge/ai/post(challengeAi)/responses/201`. + /// + /// HTTP response code: `201 created`. + case created(Operations.challengeAi.Output.Created) + /// The associated value of the enum case if `self` is `.created`. + /// + /// - Throws: An error if `self` is not `.created`. + /// - SeeAlso: `.created`. + internal var created: Operations.challengeAi.Output.Created { + get throws { + switch self { + case let .created(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "created", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/ai/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/ai/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.challengeAi.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.challengeAi.Output.BadRequest.Body) { + self.body = body + } + } + /// The creation of a game with Lichess AI failed. + /// + /// - Remark: Generated from `#/paths//api/challenge/ai/post(challengeAi)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.challengeAi.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.challengeAi.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum challengeOpen { + internal static let id: Swift.String = "challengeOpen" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/open/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.challengeOpen.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.challengeOpen.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.challengeOpen.Input.Headers + /// - Remark: Generated from `#/paths/api/challenge/open/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/open/POST/requestBody/urlEncodedForm`. + internal struct urlEncodedFormPayload: Codable, Hashable, Sendable { + /// Game is rated and impacts players ratings + /// + /// - Remark: Generated from `#/paths/api/challenge/open/POST/requestBody/urlEncodedForm/rated`. + internal var rated: Swift.Bool? + /// Clock initial time in seconds. If empty, a correspondence game is created. + /// + /// - Remark: Generated from `#/paths/api/challenge/open/POST/requestBody/urlEncodedForm/clock.limit`. + internal var clock_period_limit: Swift.Double? + /// Clock increment in seconds. If empty, a correspondence game is created. + /// + /// - Remark: Generated from `#/paths/api/challenge/open/POST/requestBody/urlEncodedForm/clock.increment`. + internal var clock_period_increment: Swift.Int? + /// Days per turn. For correspondence challenges. + /// + /// - Remark: Generated from `#/paths/api/challenge/open/POST/requestBody/urlEncodedForm/days`. + @frozen internal enum daysPayload: Int, Codable, Hashable, Sendable { + case _1 = 1 + case _2 = 2 + case _3 = 3 + case _5 = 5 + case _7 = 7 + case _10 = 10 + case _14 = 14 + } + /// Days per turn. For correspondence challenges. + /// + /// - Remark: Generated from `#/paths/api/challenge/open/POST/requestBody/urlEncodedForm/days`. + internal var days: Operations.challengeOpen.Input.Body.urlEncodedFormPayload.daysPayload? + /// - Remark: Generated from `#/paths/api/challenge/open/POST/requestBody/urlEncodedForm/variant`. + internal var variant: Components.Schemas.VariantKey? + /// - Remark: Generated from `#/paths/api/challenge/open/POST/requestBody/urlEncodedForm/fen`. + internal var fen: Components.Schemas.FromPositionFEN? + /// Optional name for the challenge, that players will see on the challenge page. + /// + /// - Remark: Generated from `#/paths/api/challenge/open/POST/requestBody/urlEncodedForm/name`. + internal var name: Swift.String? + /// Extra game rules separated by commas. + /// Example: `noRematch,noGiveTime` + /// The `noAbort` rule is available for Lichess admins only + /// + /// + /// - Remark: Generated from `#/paths/api/challenge/open/POST/requestBody/urlEncodedForm/rules`. + @frozen internal enum rulesPayload: String, Codable, Hashable, Sendable { + case noRematch = "noRematch" + case noGiveTime = "noGiveTime" + case noClaimWin = "noClaimWin" + case noEarlyDraw = "noEarlyDraw" + case noAbort = "noAbort" + } + /// Extra game rules separated by commas. + /// Example: `noRematch,noGiveTime` + /// The `noAbort` rule is available for Lichess admins only + /// + /// + /// - Remark: Generated from `#/paths/api/challenge/open/POST/requestBody/urlEncodedForm/rules`. + internal var rules: Operations.challengeOpen.Input.Body.urlEncodedFormPayload.rulesPayload? + /// Optional pair of usernames, separated by a comma. + /// If set, only these users will be allowed to join the game. + /// The first username gets the white pieces. + /// Example: `Username1,Username2` + /// + /// + /// - Remark: Generated from `#/paths/api/challenge/open/POST/requestBody/urlEncodedForm/users`. + internal var users: Swift.String? + /// Timestamp in milliseconds to expire the challenge. Defaults to 24h after creation. Can't be more than 2 weeks after creation. + /// + /// - Remark: Generated from `#/paths/api/challenge/open/POST/requestBody/urlEncodedForm/expiresAt`. + internal var expiresAt: Swift.Int? + /// Creates a new `urlEncodedFormPayload`. + /// + /// - Parameters: + /// - rated: Game is rated and impacts players ratings + /// - clock_period_limit: Clock initial time in seconds. If empty, a correspondence game is created. + /// - clock_period_increment: Clock increment in seconds. If empty, a correspondence game is created. + /// - days: Days per turn. For correspondence challenges. + /// - variant: + /// - fen: + /// - name: Optional name for the challenge, that players will see on the challenge page. + /// - rules: Extra game rules separated by commas. + /// - users: Optional pair of usernames, separated by a comma. + /// - expiresAt: Timestamp in milliseconds to expire the challenge. Defaults to 24h after creation. Can't be more than 2 weeks after creation. + internal init( + rated: Swift.Bool? = nil, + clock_period_limit: Swift.Double? = nil, + clock_period_increment: Swift.Int? = nil, + days: Operations.challengeOpen.Input.Body.urlEncodedFormPayload.daysPayload? = nil, + variant: Components.Schemas.VariantKey? = nil, + fen: Components.Schemas.FromPositionFEN? = nil, + name: Swift.String? = nil, + rules: Operations.challengeOpen.Input.Body.urlEncodedFormPayload.rulesPayload? = nil, + users: Swift.String? = nil, + expiresAt: Swift.Int? = nil + ) { + self.rated = rated + self.clock_period_limit = clock_period_limit + self.clock_period_increment = clock_period_increment + self.days = days + self.variant = variant + self.fen = fen + self.name = name + self.rules = rules + self.users = users + self.expiresAt = expiresAt + } + internal enum CodingKeys: String, CodingKey { + case rated + case clock_period_limit = "clock.limit" + case clock_period_increment = "clock.increment" + case days + case variant + case fen + case name + case rules + case users + case expiresAt + } + } + /// - Remark: Generated from `#/paths/api/challenge/open/POST/requestBody/content/application\/x-www-form-urlencoded`. + case urlEncodedForm(Operations.challengeOpen.Input.Body.urlEncodedFormPayload) + } + internal var body: Operations.challengeOpen.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + /// - body: + internal init( + headers: Operations.challengeOpen.Input.Headers = .init(), + body: Operations.challengeOpen.Input.Body + ) { + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/open/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/open/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.challengeOpen.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/challenge/open/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/open/POST/responses/200/content/application\/json`. + case json(Components.Schemas.ChallengeOpenJson) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.ChallengeOpenJson { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.challengeOpen.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.challengeOpen.Output.Ok.Headers = .init(), + body: Operations.challengeOpen.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The challenge was successfully created. + /// + /// - Remark: Generated from `#/paths//api/challenge/open/post(challengeOpen)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.challengeOpen.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.challengeOpen.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/open/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/open/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.challengeOpen.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.challengeOpen.Output.BadRequest.Body) { + self.body = body + } + } + /// The creation of the challenge failed. + /// + /// - Remark: Generated from `#/paths//api/challenge/open/post(challengeOpen)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.challengeOpen.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.challengeOpen.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum challengeStartClocks { + internal static let id: Swift.String = "challengeStartClocks" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{gameId}/start-clocks/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{gameId}/start-clocks/POST/path/gameId`. + internal var gameId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - gameId: + internal init(gameId: Swift.String) { + self.gameId = gameId + } + } + internal var path: Operations.challengeStartClocks.Input.Path + /// - Remark: Generated from `#/paths/api/challenge/{gameId}/start-clocks/POST/query`. + internal struct Query: Sendable, Hashable { + /// OAuth token of a player + /// + /// - Remark: Generated from `#/paths/api/challenge/{gameId}/start-clocks/POST/query/token1`. + internal var token1: Swift.String? + /// OAuth token of the other player + /// + /// - Remark: Generated from `#/paths/api/challenge/{gameId}/start-clocks/POST/query/token2`. + internal var token2: Swift.String? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - token1: OAuth token of a player + /// - token2: OAuth token of the other player + internal init( + token1: Swift.String? = nil, + token2: Swift.String? = nil + ) { + self.token1 = token1 + self.token2 = token2 + } + } + internal var query: Operations.challengeStartClocks.Input.Query + /// - Remark: Generated from `#/paths/api/challenge/{gameId}/start-clocks/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.challengeStartClocks.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.challengeStartClocks.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.challengeStartClocks.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - query: + /// - headers: + internal init( + path: Operations.challengeStartClocks.Input.Path, + query: Operations.challengeStartClocks.Input.Query = .init(), + headers: Operations.challengeStartClocks.Input.Headers = .init() + ) { + self.path = path + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{gameId}/start-clocks/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{gameId}/start-clocks/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.challengeStartClocks.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/challenge/{gameId}/start-clocks/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/challenge/{gameId}/start-clocks/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.challengeStartClocks.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.challengeStartClocks.Output.Ok.Headers = .init(), + body: Operations.challengeStartClocks.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The clock of a game was successfully started. + /// + /// - Remark: Generated from `#/paths//api/challenge/{gameId}/start-clocks/post(challengeStartClocks)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.challengeStartClocks.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.challengeStartClocks.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum bulkPairingList { + internal static let id: Swift.String = "bulkPairingList" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.bulkPairingList.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.bulkPairingList.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.bulkPairingList.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + internal init(headers: Operations.bulkPairingList.Input.Headers = .init()) { + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.bulkPairingList.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/bulk-pairing/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/GET/responses/200/content/application\/json`. + case json([Components.Schemas.BulkPairing]) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: [Components.Schemas.BulkPairing] { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.bulkPairingList.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.bulkPairingList.Output.Ok.Headers = .init(), + body: Operations.bulkPairingList.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The list of bulk pairing the logged in user created. + /// + /// - Remark: Generated from `#/paths//api/bulk-pairing/get(bulkPairingList)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.bulkPairingList.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.bulkPairingList.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum bulkPairingCreate { + internal static let id: Swift.String = "bulkPairingCreate" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.bulkPairingCreate.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.bulkPairingCreate.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.bulkPairingCreate.Input.Headers + /// - Remark: Generated from `#/paths/api/bulk-pairing/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/POST/requestBody/urlEncodedForm`. + internal struct urlEncodedFormPayload: Codable, Hashable, Sendable { + /// OAuth tokens of all the players to pair, with the syntax `tokenOfWhitePlayerInGame1:tokenOfBlackPlayerInGame1,tokenOfWhitePlayerInGame2:tokenOfBlackPlayerInGame2,...`. + /// The 2 tokens of the players of a game are separated with `:`. The first token gets the white pieces. Games are separated with `,`. + /// Up to 1000 tokens can be sent, for a max of 500 games. + /// Each token must be included at most once. + /// Example: `token1:token2,token3:token4,token5:token6` + /// + /// + /// - Remark: Generated from `#/paths/api/bulk-pairing/POST/requestBody/urlEncodedForm/players`. + internal var players: Swift.String? + /// Clock initial time in seconds. Example: `600` + /// + /// + /// - Remark: Generated from `#/paths/api/bulk-pairing/POST/requestBody/urlEncodedForm/clock.limit`. + internal var clock_period_limit: Swift.Double? + /// Clock increment in seconds. Example: `2` + /// + /// + /// - Remark: Generated from `#/paths/api/bulk-pairing/POST/requestBody/urlEncodedForm/clock.increment`. + internal var clock_period_increment: Swift.Int? + /// Days per turn. For correspondence games only. + /// + /// - Remark: Generated from `#/paths/api/bulk-pairing/POST/requestBody/urlEncodedForm/days`. + @frozen internal enum daysPayload: Int, Codable, Hashable, Sendable { + case _1 = 1 + case _2 = 2 + case _3 = 3 + case _5 = 5 + case _7 = 7 + case _10 = 10 + case _14 = 14 + } + /// Days per turn. For correspondence games only. + /// + /// - Remark: Generated from `#/paths/api/bulk-pairing/POST/requestBody/urlEncodedForm/days`. + internal var days: Operations.bulkPairingCreate.Input.Body.urlEncodedFormPayload.daysPayload? + /// Date at which the games will be created as a Unix timestamp in milliseconds. + /// Up to 7 days in the future. + /// Omit, or set to current date and time, to start the games immediately. + /// Example: `1612289869919` + /// + /// + /// - Remark: Generated from `#/paths/api/bulk-pairing/POST/requestBody/urlEncodedForm/pairAt`. + internal var pairAt: Swift.Int? + /// Date at which the clocks will be automatically started as a Unix timestamp in milliseconds. + /// Up to 7 days in the future. + /// Note that the clocks can start earlier than specified, if players start making moves in the game. + /// If omitted, the clocks will not start automatically. + /// Example: `1612289869919` + /// + /// + /// - Remark: Generated from `#/paths/api/bulk-pairing/POST/requestBody/urlEncodedForm/startClocksAt`. + internal var startClocksAt: Swift.Int? + /// Game is rated and impacts players ratings + /// + /// - Remark: Generated from `#/paths/api/bulk-pairing/POST/requestBody/urlEncodedForm/rated`. + internal var rated: Swift.Bool? + /// - Remark: Generated from `#/paths/api/bulk-pairing/POST/requestBody/urlEncodedForm/variant`. + internal var variant: Components.Schemas.VariantKey? + /// - Remark: Generated from `#/paths/api/bulk-pairing/POST/requestBody/urlEncodedForm/fen`. + internal var fen: Components.Schemas.FromPositionFEN? + /// Message that will be sent to each player, when the game is created. It is sent from your user account. + /// `{opponent}` and `{game}` are placeholders that will be replaced with the opponent and the game URLs. + /// You can omit this field to send the default message, + /// but if you set your own message, it must at least contain the `{game}` placeholder. + /// + /// + /// - Remark: Generated from `#/paths/api/bulk-pairing/POST/requestBody/urlEncodedForm/message`. + internal var message: Swift.String? + /// Extra game rules separated by commas. + /// Example: `noAbort,noRematch` + /// + /// + /// - Remark: Generated from `#/paths/api/bulk-pairing/POST/requestBody/urlEncodedForm/rules`. + @frozen internal enum rulesPayload: String, Codable, Hashable, Sendable { + case noAbort = "noAbort" + case noRematch = "noRematch" + case noGiveTime = "noGiveTime" + case noClaimWin = "noClaimWin" + case noEarlyDraw = "noEarlyDraw" + } + /// Extra game rules separated by commas. + /// Example: `noAbort,noRematch` + /// + /// + /// - Remark: Generated from `#/paths/api/bulk-pairing/POST/requestBody/urlEncodedForm/rules`. + internal var rules: Operations.bulkPairingCreate.Input.Body.urlEncodedFormPayload.rulesPayload? + /// Creates a new `urlEncodedFormPayload`. + /// + /// - Parameters: + /// - players: OAuth tokens of all the players to pair, with the syntax `tokenOfWhitePlayerInGame1:tokenOfBlackPlayerInGame1,tokenOfWhitePlayerInGame2:tokenOfBlackPlayerInGame2,...`. + /// - clock_period_limit: Clock initial time in seconds. Example: `600` + /// - clock_period_increment: Clock increment in seconds. Example: `2` + /// - days: Days per turn. For correspondence games only. + /// - pairAt: Date at which the games will be created as a Unix timestamp in milliseconds. + /// - startClocksAt: Date at which the clocks will be automatically started as a Unix timestamp in milliseconds. + /// - rated: Game is rated and impacts players ratings + /// - variant: + /// - fen: + /// - message: Message that will be sent to each player, when the game is created. It is sent from your user account. + /// - rules: Extra game rules separated by commas. + internal init( + players: Swift.String? = nil, + clock_period_limit: Swift.Double? = nil, + clock_period_increment: Swift.Int? = nil, + days: Operations.bulkPairingCreate.Input.Body.urlEncodedFormPayload.daysPayload? = nil, + pairAt: Swift.Int? = nil, + startClocksAt: Swift.Int? = nil, + rated: Swift.Bool? = nil, + variant: Components.Schemas.VariantKey? = nil, + fen: Components.Schemas.FromPositionFEN? = nil, + message: Swift.String? = nil, + rules: Operations.bulkPairingCreate.Input.Body.urlEncodedFormPayload.rulesPayload? = nil + ) { + self.players = players + self.clock_period_limit = clock_period_limit + self.clock_period_increment = clock_period_increment + self.days = days + self.pairAt = pairAt + self.startClocksAt = startClocksAt + self.rated = rated + self.variant = variant + self.fen = fen + self.message = message + self.rules = rules + } + internal enum CodingKeys: String, CodingKey { + case players + case clock_period_limit = "clock.limit" + case clock_period_increment = "clock.increment" + case days + case pairAt + case startClocksAt + case rated + case variant + case fen + case message + case rules + } + } + /// - Remark: Generated from `#/paths/api/bulk-pairing/POST/requestBody/content/application\/x-www-form-urlencoded`. + case urlEncodedForm(Operations.bulkPairingCreate.Input.Body.urlEncodedFormPayload) + } + internal var body: Operations.bulkPairingCreate.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + /// - body: + internal init( + headers: Operations.bulkPairingCreate.Input.Headers = .init(), + body: Operations.bulkPairingCreate.Input.Body + ) { + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.bulkPairingCreate.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/bulk-pairing/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/POST/responses/200/content/application\/json`. + case json(Components.Schemas.BulkPairing) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.BulkPairing { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.bulkPairingCreate.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.bulkPairingCreate.Output.Ok.Headers = .init(), + body: Operations.bulkPairingCreate.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The bulk pairing has been successfully created. + /// + /// - Remark: Generated from `#/paths//api/bulk-pairing/post(bulkPairingCreate)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.bulkPairingCreate.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.bulkPairingCreate.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.bulkPairingCreate.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.bulkPairingCreate.Output.BadRequest.Body) { + self.body = body + } + } + /// The creation of the bulk pairings failed. + /// + /// - Remark: Generated from `#/paths//api/bulk-pairing/post(bulkPairingCreate)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.bulkPairingCreate.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.bulkPairingCreate.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum bulkPairingStartClocks { + internal static let id: Swift.String = "bulkPairingStartClocks" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/{id}/start-clocks/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/{id}/start-clocks/POST/path/id`. + internal var id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - id: + internal init(id: Swift.String) { + self.id = id + } + } + internal var path: Operations.bulkPairingStartClocks.Input.Path + /// - Remark: Generated from `#/paths/api/bulk-pairing/{id}/start-clocks/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.bulkPairingStartClocks.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.bulkPairingStartClocks.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.bulkPairingStartClocks.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.bulkPairingStartClocks.Input.Path, + headers: Operations.bulkPairingStartClocks.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/{id}/start-clocks/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/{id}/start-clocks/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.bulkPairingStartClocks.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/bulk-pairing/{id}/start-clocks/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/{id}/start-clocks/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.bulkPairingStartClocks.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.bulkPairingStartClocks.Output.Ok.Headers = .init(), + body: Operations.bulkPairingStartClocks.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The clocks of the games of a bulk pairing were successfully started. + /// + /// - Remark: Generated from `#/paths//api/bulk-pairing/{id}/start-clocks/post(bulkPairingStartClocks)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.bulkPairingStartClocks.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.bulkPairingStartClocks.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct NotFound: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/{id}/start-clocks/POST/responses/404/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/{id}/start-clocks/POST/responses/404/content/application\/json`. + case json(Components.Schemas.NotFound) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.NotFound { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.bulkPairingStartClocks.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.bulkPairingStartClocks.Output.NotFound.Body) { + self.body = body + } + } + /// The bulk pairing was not found. + /// + /// - Remark: Generated from `#/paths//api/bulk-pairing/{id}/start-clocks/post(bulkPairingStartClocks)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.bulkPairingStartClocks.Output.NotFound) + /// The associated value of the enum case if `self` is `.notFound`. + /// + /// - Throws: An error if `self` is not `.notFound`. + /// - SeeAlso: `.notFound`. + internal var notFound: Operations.bulkPairingStartClocks.Output.NotFound { + get throws { + switch self { + case let .notFound(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "notFound", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum bulkPairingGet { + internal static let id: Swift.String = "bulkPairingGet" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/{id}/GET/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/{id}/GET/path/id`. + internal var id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - id: + internal init(id: Swift.String) { + self.id = id + } + } + internal var path: Operations.bulkPairingGet.Input.Path + /// - Remark: Generated from `#/paths/api/bulk-pairing/{id}/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.bulkPairingGet.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.bulkPairingGet.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.bulkPairingGet.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.bulkPairingGet.Input.Path, + headers: Operations.bulkPairingGet.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/{id}/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/{id}/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.bulkPairingGet.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/bulk-pairing/{id}/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/{id}/GET/responses/200/content/application\/json`. + case json(Components.Schemas.BulkPairing) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.BulkPairing { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.bulkPairingGet.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.bulkPairingGet.Output.Ok.Headers = .init(), + body: Operations.bulkPairingGet.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The bulk pairing. + /// + /// - Remark: Generated from `#/paths//api/bulk-pairing/{id}/get(bulkPairingGet)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.bulkPairingGet.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.bulkPairingGet.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct NotFound: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/{id}/GET/responses/404/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/{id}/GET/responses/404/content/application\/json`. + case json(Components.Schemas.NotFound) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.NotFound { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.bulkPairingGet.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.bulkPairingGet.Output.NotFound.Body) { + self.body = body + } + } + /// The bulk pairing was not found. + /// + /// - Remark: Generated from `#/paths//api/bulk-pairing/{id}/get(bulkPairingGet)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.bulkPairingGet.Output.NotFound) + /// The associated value of the enum case if `self` is `.notFound`. + /// + /// - Throws: An error if `self` is not `.notFound`. + /// - SeeAlso: `.notFound`. + internal var notFound: Operations.bulkPairingGet.Output.NotFound { + get throws { + switch self { + case let .notFound(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "notFound", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum bulkPairingDelete { + internal static let id: Swift.String = "bulkPairingDelete" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/{id}/DELETE/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/{id}/DELETE/path/id`. + internal var id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - id: + internal init(id: Swift.String) { + self.id = id + } + } + internal var path: Operations.bulkPairingDelete.Input.Path + /// - Remark: Generated from `#/paths/api/bulk-pairing/{id}/DELETE/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.bulkPairingDelete.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.bulkPairingDelete.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.bulkPairingDelete.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.bulkPairingDelete.Input.Path, + headers: Operations.bulkPairingDelete.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/{id}/DELETE/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/{id}/DELETE/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.bulkPairingDelete.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/bulk-pairing/{id}/DELETE/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/{id}/DELETE/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.bulkPairingDelete.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.bulkPairingDelete.Output.Ok.Headers = .init(), + body: Operations.bulkPairingDelete.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The bulk pairing was successfully deleted. + /// + /// - Remark: Generated from `#/paths//api/bulk-pairing/{id}/delete(bulkPairingDelete)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.bulkPairingDelete.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.bulkPairingDelete.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct NotFound: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/{id}/DELETE/responses/404/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/bulk-pairing/{id}/DELETE/responses/404/content/application\/json`. + case json(Components.Schemas.NotFound) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.NotFound { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.bulkPairingDelete.Output.NotFound.Body + /// Creates a new `NotFound`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.bulkPairingDelete.Output.NotFound.Body) { + self.body = body + } + } + /// The bulk pairing to delete was not found. + /// + /// - Remark: Generated from `#/paths//api/bulk-pairing/{id}/delete(bulkPairingDelete)/responses/404`. + /// + /// HTTP response code: `404 notFound`. + case notFound(Operations.bulkPairingDelete.Output.NotFound) + /// The associated value of the enum case if `self` is `.notFound`. + /// + /// - Throws: An error if `self` is not `.notFound`. + /// - SeeAlso: `.notFound`. + internal var notFound: Operations.bulkPairingDelete.Output.NotFound { + get throws { + switch self { + case let .notFound(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "notFound", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum roundAddTime { + internal static let id: Swift.String = "roundAddTime" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/round/{gameId}/add-time/{seconds}/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/round/{gameId}/add-time/{seconds}/POST/path/gameId`. + internal var gameId: Swift.String + /// How many seconds to give + /// + /// - Remark: Generated from `#/paths/api/round/{gameId}/add-time/{seconds}/POST/path/seconds`. + internal var seconds: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - gameId: + /// - seconds: How many seconds to give + internal init( + gameId: Swift.String, + seconds: Swift.String + ) { + self.gameId = gameId + self.seconds = seconds + } + } + internal var path: Operations.roundAddTime.Input.Path + /// - Remark: Generated from `#/paths/api/round/{gameId}/add-time/{seconds}/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.roundAddTime.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.roundAddTime.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.roundAddTime.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.roundAddTime.Input.Path, + headers: Operations.roundAddTime.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/round/{gameId}/add-time/{seconds}/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/round/{gameId}/add-time/{seconds}/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.roundAddTime.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/round/{gameId}/add-time/{seconds}/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/round/{gameId}/add-time/{seconds}/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.roundAddTime.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.roundAddTime.Output.Ok.Headers = .init(), + body: Operations.roundAddTime.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// Time was successfully added to the opponent's clock. + /// + /// - Remark: Generated from `#/paths//api/round/{gameId}/add-time/{seconds}/post(roundAddTime)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.roundAddTime.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.roundAddTime.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum adminChallengeTokens { + internal static let id: Swift.String = "adminChallengeTokens" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/token/admin-challenge/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.adminChallengeTokens.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.adminChallengeTokens.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.adminChallengeTokens.Input.Headers + /// - Remark: Generated from `#/paths/api/token/admin-challenge/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/token/admin-challenge/POST/requestBody/urlEncodedForm`. + internal struct urlEncodedFormPayload: Codable, Hashable, Sendable { + /// Usernames separated with commas + /// + /// - Remark: Generated from `#/paths/api/token/admin-challenge/POST/requestBody/urlEncodedForm/users`. + internal var users: Swift.String + /// User visible description of the token + /// + /// - Remark: Generated from `#/paths/api/token/admin-challenge/POST/requestBody/urlEncodedForm/description`. + internal var description: Swift.String + /// Creates a new `urlEncodedFormPayload`. + /// + /// - Parameters: + /// - users: Usernames separated with commas + /// - description: User visible description of the token + internal init( + users: Swift.String, + description: Swift.String + ) { + self.users = users + self.description = description + } + internal enum CodingKeys: String, CodingKey { + case users + case description + } + } + /// - Remark: Generated from `#/paths/api/token/admin-challenge/POST/requestBody/content/application\/x-www-form-urlencoded`. + case urlEncodedForm(Operations.adminChallengeTokens.Input.Body.urlEncodedFormPayload) + } + internal var body: Operations.adminChallengeTokens.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + /// - body: + internal init( + headers: Operations.adminChallengeTokens.Input.Headers = .init(), + body: Operations.adminChallengeTokens.Input.Body + ) { + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/token/admin-challenge/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/token/admin-challenge/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.adminChallengeTokens.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/token/admin-challenge/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/token/admin-challenge/POST/responses/200/content/application\/json`. + case json(OpenAPIRuntime.OpenAPIValueContainer) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: OpenAPIRuntime.OpenAPIValueContainer { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.adminChallengeTokens.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.adminChallengeTokens.Output.Ok.Headers = .init(), + body: Operations.adminChallengeTokens.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The `challenge:write` tokens of each user + /// + /// - Remark: Generated from `#/paths//api/token/admin-challenge/post(adminChallengeTokens)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.adminChallengeTokens.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.adminChallengeTokens.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/token/admin-challenge/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/token/admin-challenge/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.adminChallengeTokens.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.adminChallengeTokens.Output.BadRequest.Body) { + self.body = body + } + } + /// The creation of the tokens failed. + /// + /// - Remark: Generated from `#/paths//api/token/admin-challenge/post(adminChallengeTokens)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.adminChallengeTokens.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.adminChallengeTokens.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum inboxUsername { + internal static let id: Swift.String = "inboxUsername" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/inbox/{username}/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/inbox/{username}/POST/path/username`. + internal var username: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - username: + internal init(username: Swift.String) { + self.username = username + } + } + internal var path: Operations.inboxUsername.Input.Path + /// - Remark: Generated from `#/paths/inbox/{username}/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.inboxUsername.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.inboxUsername.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.inboxUsername.Input.Headers + /// - Remark: Generated from `#/paths/inbox/{username}/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/inbox/{username}/POST/requestBody/urlEncodedForm`. + internal struct urlEncodedFormPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/inbox/{username}/POST/requestBody/urlEncodedForm/text`. + internal var text: Swift.String + /// Creates a new `urlEncodedFormPayload`. + /// + /// - Parameters: + /// - text: + internal init(text: Swift.String) { + self.text = text + } + internal enum CodingKeys: String, CodingKey { + case text + } + } + /// - Remark: Generated from `#/paths/inbox/{username}/POST/requestBody/content/application\/x-www-form-urlencoded`. + case urlEncodedForm(Operations.inboxUsername.Input.Body.urlEncodedFormPayload) + } + internal var body: Operations.inboxUsername.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + /// - body: + internal init( + path: Operations.inboxUsername.Input.Path, + headers: Operations.inboxUsername.Input.Headers = .init(), + body: Operations.inboxUsername.Input.Body + ) { + self.path = path + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/inbox/{username}/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/inbox/{username}/POST/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.inboxUsername.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.inboxUsername.Output.Ok.Body) { + self.body = body + } + } + /// The private message has been successfully sent. + /// + /// - Remark: Generated from `#/paths//inbox/{username}/post(inboxUsername)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.inboxUsername.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.inboxUsername.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/inbox/{username}/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/inbox/{username}/POST/responses/400/content/application\/json`. + case json(Components.Schemas._Error) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas._Error { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.inboxUsername.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.inboxUsername.Output.BadRequest.Body) { + self.body = body + } + } + /// The sending of the private message has failed. + /// + /// - Remark: Generated from `#/paths//inbox/{username}/post(inboxUsername)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.inboxUsername.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.inboxUsername.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiCloudEval { + internal static let id: Swift.String = "apiCloudEval" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/cloud-eval/GET/query`. + internal struct Query: Sendable, Hashable { + /// FEN of the position + /// + /// - Remark: Generated from `#/paths/api/cloud-eval/GET/query/fen`. + internal var fen: Swift.String + /// Number of variations + /// + /// - Remark: Generated from `#/paths/api/cloud-eval/GET/query/multiPv`. + internal var multiPv: Swift.Double? + /// Variant + /// + /// - Remark: Generated from `#/paths/api/cloud-eval/GET/query/variant`. + internal var variant: Components.Schemas.VariantKey? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - fen: FEN of the position + /// - multiPv: Number of variations + /// - variant: Variant + internal init( + fen: Swift.String, + multiPv: Swift.Double? = nil, + variant: Components.Schemas.VariantKey? = nil + ) { + self.fen = fen + self.multiPv = multiPv + self.variant = variant + } + } + internal var query: Operations.apiCloudEval.Input.Query + /// - Remark: Generated from `#/paths/api/cloud-eval/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiCloudEval.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiCloudEval.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiCloudEval.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - query: + /// - headers: + internal init( + query: Operations.apiCloudEval.Input.Query, + headers: Operations.apiCloudEval.Input.Headers = .init() + ) { + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/cloud-eval/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/cloud-eval/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiCloudEval.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/cloud-eval/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/cloud-eval/GET/responses/200/content/application\/json`. + case json(OpenAPIRuntime.OpenAPIValueContainer) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: OpenAPIRuntime.OpenAPIValueContainer { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiCloudEval.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiCloudEval.Output.Ok.Headers = .init(), + body: Operations.apiCloudEval.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The evaluation of the position. + /// + /// - Remark: Generated from `#/paths//api/cloud-eval/get(apiCloudEval)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiCloudEval.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiCloudEval.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiExternalEngineList { + internal static let id: Swift.String = "apiExternalEngineList" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiExternalEngineList.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiExternalEngineList.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiExternalEngineList.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + internal init(headers: Operations.apiExternalEngineList.Input.Headers = .init()) { + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiExternalEngineList.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/external-engine/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/GET/responses/200/content/application\/json`. + case json([Components.Schemas.ExternalEngine]) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: [Components.Schemas.ExternalEngine] { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiExternalEngineList.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiExternalEngineList.Output.Ok.Headers = .init(), + body: Operations.apiExternalEngineList.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// A list of external engines. + /// + /// - Remark: Generated from `#/paths//api/external-engine/get(apiExternalEngineList)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiExternalEngineList.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiExternalEngineList.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiExternalEngineCreate { + internal static let id: Swift.String = "apiExternalEngineCreate" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiExternalEngineCreate.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiExternalEngineCreate.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiExternalEngineCreate.Input.Headers + /// - Remark: Generated from `#/paths/api/external-engine/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/POST/requestBody/content/application\/json`. + case json(Components.Schemas.ExternalEngineRegistration) + } + internal var body: Operations.apiExternalEngineCreate.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + /// - body: + internal init( + headers: Operations.apiExternalEngineCreate.Input.Headers = .init(), + body: Operations.apiExternalEngineCreate.Input.Body + ) { + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiExternalEngineCreate.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/external-engine/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/POST/responses/200/content/application\/json`. + case json(Components.Schemas.ExternalEngine) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.ExternalEngine { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiExternalEngineCreate.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiExternalEngineCreate.Output.Ok.Headers = .init(), + body: Operations.apiExternalEngineCreate.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The registered engine. + /// + /// - Remark: Generated from `#/paths//api/external-engine/post(apiExternalEngineCreate)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiExternalEngineCreate.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiExternalEngineCreate.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiExternalEngineGet { + internal static let id: Swift.String = "apiExternalEngineGet" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/{id}/GET/path`. + internal struct Path: Sendable, Hashable { + /// The external engine id. + /// + /// - Remark: Generated from `#/paths/api/external-engine/{id}/GET/path/id`. + internal var id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - id: The external engine id. + internal init(id: Swift.String) { + self.id = id + } + } + internal var path: Operations.apiExternalEngineGet.Input.Path + /// - Remark: Generated from `#/paths/api/external-engine/{id}/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiExternalEngineGet.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiExternalEngineGet.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiExternalEngineGet.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.apiExternalEngineGet.Input.Path, + headers: Operations.apiExternalEngineGet.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/{id}/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/{id}/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiExternalEngineGet.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/external-engine/{id}/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/{id}/GET/responses/200/content/application\/json`. + case json(Components.Schemas.ExternalEngine) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.ExternalEngine { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiExternalEngineGet.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiExternalEngineGet.Output.Ok.Headers = .init(), + body: Operations.apiExternalEngineGet.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// A registered engine. + /// + /// - Remark: Generated from `#/paths//api/external-engine/{id}/get(apiExternalEngineGet)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiExternalEngineGet.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiExternalEngineGet.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiExternalEnginePut { + internal static let id: Swift.String = "apiExternalEnginePut" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/{id}/PUT/path`. + internal struct Path: Sendable, Hashable { + /// The external engine id. + /// + /// - Remark: Generated from `#/paths/api/external-engine/{id}/PUT/path/id`. + internal var id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - id: The external engine id. + internal init(id: Swift.String) { + self.id = id + } + } + internal var path: Operations.apiExternalEnginePut.Input.Path + /// - Remark: Generated from `#/paths/api/external-engine/{id}/PUT/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiExternalEnginePut.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiExternalEnginePut.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiExternalEnginePut.Input.Headers + /// - Remark: Generated from `#/paths/api/external-engine/{id}/PUT/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/{id}/PUT/requestBody/content/application\/json`. + case json(Components.Schemas.ExternalEngineRegistration) + } + internal var body: Operations.apiExternalEnginePut.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + /// - body: + internal init( + path: Operations.apiExternalEnginePut.Input.Path, + headers: Operations.apiExternalEnginePut.Input.Headers = .init(), + body: Operations.apiExternalEnginePut.Input.Body + ) { + self.path = path + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/{id}/PUT/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/{id}/PUT/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiExternalEnginePut.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/external-engine/{id}/PUT/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/{id}/PUT/responses/200/content/application\/json`. + case json(Components.Schemas.ExternalEngine) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.ExternalEngine { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiExternalEnginePut.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiExternalEnginePut.Output.Ok.Headers = .init(), + body: Operations.apiExternalEnginePut.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// A registered engine. + /// + /// - Remark: Generated from `#/paths//api/external-engine/{id}/put(apiExternalEnginePut)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiExternalEnginePut.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiExternalEnginePut.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiExternalEngineDelete { + internal static let id: Swift.String = "apiExternalEngineDelete" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/{id}/DELETE/path`. + internal struct Path: Sendable, Hashable { + /// The external engine id. + /// + /// - Remark: Generated from `#/paths/api/external-engine/{id}/DELETE/path/id`. + internal var id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - id: The external engine id. + internal init(id: Swift.String) { + self.id = id + } + } + internal var path: Operations.apiExternalEngineDelete.Input.Path + /// - Remark: Generated from `#/paths/api/external-engine/{id}/DELETE/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiExternalEngineDelete.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiExternalEngineDelete.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiExternalEngineDelete.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.apiExternalEngineDelete.Input.Path, + headers: Operations.apiExternalEngineDelete.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/{id}/DELETE/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/{id}/DELETE/responses/200/content/application\/json`. + case json(Components.Schemas.Ok) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.Ok { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiExternalEngineDelete.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.apiExternalEngineDelete.Output.Ok.Body) { + self.body = body + } + } + /// Engine successfully deleted + /// + /// - Remark: Generated from `#/paths//api/external-engine/{id}/delete(apiExternalEngineDelete)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiExternalEngineDelete.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiExternalEngineDelete.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiExternalEngineAnalyse { + internal static let id: Swift.String = "apiExternalEngineAnalyse" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/{id}/analyse/POST/path`. + internal struct Path: Sendable, Hashable { + /// The external engine id. + /// + /// - Remark: Generated from `#/paths/api/external-engine/{id}/analyse/POST/path/id`. + internal var id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - id: The external engine id. + internal init(id: Swift.String) { + self.id = id + } + } + internal var path: Operations.apiExternalEngineAnalyse.Input.Path + /// - Remark: Generated from `#/paths/api/external-engine/{id}/analyse/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiExternalEngineAnalyse.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiExternalEngineAnalyse.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiExternalEngineAnalyse.Input.Headers + /// - Remark: Generated from `#/paths/api/external-engine/{id}/analyse/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/{id}/analyse/POST/requestBody/json`. + internal struct jsonPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/external-engine/{id}/analyse/POST/requestBody/json/clientSecret`. + internal var clientSecret: Swift.String + /// - Remark: Generated from `#/paths/api/external-engine/{id}/analyse/POST/requestBody/json/work`. + internal var work: Components.Schemas.ExternalEngineWork + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - clientSecret: + /// - work: + internal init( + clientSecret: Swift.String, + work: Components.Schemas.ExternalEngineWork + ) { + self.clientSecret = clientSecret + self.work = work + } + internal enum CodingKeys: String, CodingKey { + case clientSecret + case work + } + } + /// - Remark: Generated from `#/paths/api/external-engine/{id}/analyse/POST/requestBody/content/application\/json`. + case json(Operations.apiExternalEngineAnalyse.Input.Body.jsonPayload) + } + internal var body: Operations.apiExternalEngineAnalyse.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + /// - body: + internal init( + path: Operations.apiExternalEngineAnalyse.Input.Path, + headers: Operations.apiExternalEngineAnalyse.Input.Headers = .init(), + body: Operations.apiExternalEngineAnalyse.Input.Body + ) { + self.path = path + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/{id}/analyse/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/{id}/analyse/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiExternalEngineAnalyse.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/external-engine/{id}/analyse/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/{id}/analyse/POST/responses/200/content/application\/x-ndjson`. + case application_x_hyphen_ndjson(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_ndjson`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_ndjson`. + /// - SeeAlso: `.application_x_hyphen_ndjson`. + internal var application_x_hyphen_ndjson: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_ndjson(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiExternalEngineAnalyse.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiExternalEngineAnalyse.Output.Ok.Headers = .init(), + body: Operations.apiExternalEngineAnalyse.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// Stream of analysis output + /// + /// - Remark: Generated from `#/paths//api/external-engine/{id}/analyse/post(apiExternalEngineAnalyse)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiExternalEngineAnalyse.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiExternalEngineAnalyse.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_ndjson + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-ndjson": + self = .application_x_hyphen_ndjson + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_ndjson: + return "application/x-ndjson" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_ndjson + ] + } + } + } + /// 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 enum apiExternalEngineAcquire { + internal static let id: Swift.String = "apiExternalEngineAcquire" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/work/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiExternalEngineAcquire.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiExternalEngineAcquire.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiExternalEngineAcquire.Input.Headers + /// - Remark: Generated from `#/paths/api/external-engine/work/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/work/POST/requestBody/json`. + internal struct jsonPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/external-engine/work/POST/requestBody/json/providerSecret`. + internal var providerSecret: Swift.String? + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - providerSecret: + internal init(providerSecret: Swift.String? = nil) { + self.providerSecret = providerSecret + } + internal enum CodingKeys: String, CodingKey { + case providerSecret + } + } + /// - Remark: Generated from `#/paths/api/external-engine/work/POST/requestBody/content/application\/json`. + case json(Operations.apiExternalEngineAcquire.Input.Body.jsonPayload) + } + internal var body: Operations.apiExternalEngineAcquire.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + /// - body: + internal init( + headers: Operations.apiExternalEngineAcquire.Input.Headers = .init(), + body: Operations.apiExternalEngineAcquire.Input.Body + ) { + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/work/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/work/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiExternalEngineAcquire.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/external-engine/work/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/work/POST/responses/200/content/json`. + internal struct jsonPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/external-engine/work/POST/responses/200/content/json/id`. + internal var id: Swift.String + /// - Remark: Generated from `#/paths/api/external-engine/work/POST/responses/200/content/json/work`. + internal var work: Components.Schemas.ExternalEngineWork + /// - Remark: Generated from `#/paths/api/external-engine/work/POST/responses/200/content/json/engine`. + internal var engine: Components.Schemas.ExternalEngine + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - id: + /// - work: + /// - engine: + internal init( + id: Swift.String, + work: Components.Schemas.ExternalEngineWork, + engine: Components.Schemas.ExternalEngine + ) { + self.id = id + self.work = work + self.engine = engine + } + internal enum CodingKeys: String, CodingKey { + case id + case work + case engine + } + } + /// - Remark: Generated from `#/paths/api/external-engine/work/POST/responses/200/content/application\/json`. + case json(Operations.apiExternalEngineAcquire.Output.Ok.Body.jsonPayload) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Operations.apiExternalEngineAcquire.Output.Ok.Body.jsonPayload { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiExternalEngineAcquire.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiExternalEngineAcquire.Output.Ok.Headers = .init(), + body: Operations.apiExternalEngineAcquire.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// Analysis has been requested + /// + /// - Remark: Generated from `#/paths//api/external-engine/work/post(apiExternalEngineAcquire)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiExternalEngineAcquire.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiExternalEngineAcquire.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct NoContent: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/work/POST/responses/204/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/work/POST/responses/204/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiExternalEngineAcquire.Output.NoContent.Headers + /// Creates a new `NoContent`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + internal init(headers: Operations.apiExternalEngineAcquire.Output.NoContent.Headers = .init()) { + self.headers = headers + } + } + /// No pending analysis + /// + /// - Remark: Generated from `#/paths//api/external-engine/work/post(apiExternalEngineAcquire)/responses/204`. + /// + /// HTTP response code: `204 noContent`. + case noContent(Operations.apiExternalEngineAcquire.Output.NoContent) + /// The associated value of the enum case if `self` is `.noContent`. + /// + /// - Throws: An error if `self` is not `.noContent`. + /// - SeeAlso: `.noContent`. + internal var noContent: Operations.apiExternalEngineAcquire.Output.NoContent { + get throws { + switch self { + case let .noContent(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "noContent", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiExternalEngineSubmit { + internal static let id: Swift.String = "apiExternalEngineSubmit" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/work/{id}/POST/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/work/{id}/POST/path/id`. + internal var id: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - id: + internal init(id: Swift.String) { + self.id = id + } + } + internal var path: Operations.apiExternalEngineSubmit.Input.Path + /// - Remark: Generated from `#/paths/api/external-engine/work/{id}/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/work/{id}/POST/requestBody/content/text\/plain`. + case plainText(OpenAPIRuntime.HTTPBody) + } + internal var body: Operations.apiExternalEngineSubmit.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - body: + internal init( + path: Operations.apiExternalEngineSubmit.Input.Path, + body: Operations.apiExternalEngineSubmit.Input.Body + ) { + self.path = path + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/work/{id}/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/external-engine/work/{id}/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiExternalEngineSubmit.Output.Ok.Headers + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + internal init(headers: Operations.apiExternalEngineSubmit.Output.Ok.Headers = .init()) { + self.headers = headers + } + } + /// Thanks + /// + /// - Remark: Generated from `#/paths//api/external-engine/work/{id}/post(apiExternalEngineSubmit)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiExternalEngineSubmit.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiExternalEngineSubmit.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// 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 enum oauth { + internal static let id: Swift.String = "oauth" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/oauth/GET/query`. + internal struct Query: Sendable, Hashable { + /// Must be `code`. + /// + /// - Remark: Generated from `#/paths/oauth/GET/query/response_type`. + internal var response_type: Swift.String + /// Arbitrary identifier that uniquely identifies your application. + /// + /// - Remark: Generated from `#/paths/oauth/GET/query/client_id`. + internal var client_id: Swift.String + /// The absolute URL that the user should be redirected to with the authorization result. + /// + /// - Remark: Generated from `#/paths/oauth/GET/query/redirect_uri`. + internal var redirect_uri: Swift.String + /// Must be `S256`. + /// + /// - Remark: Generated from `#/paths/oauth/GET/query/code_challenge_method`. + internal var code_challenge_method: Swift.String + /// Compute `BASE64URL(SHA256(code_verifier))`. + /// + /// - Remark: Generated from `#/paths/oauth/GET/query/code_challenge`. + internal var code_challenge: Swift.String + /// Space separated list of requested OAuth scopes, if any. + /// + /// - Remark: Generated from `#/paths/oauth/GET/query/scope`. + internal var scope: Swift.String? + /// Hint that you want the user to log in with a specific Lichess username. + /// + /// - Remark: Generated from `#/paths/oauth/GET/query/username`. + internal var username: Swift.String? + /// Arbitrary state that will be returned verbatim with the authorization result. + /// + /// - Remark: Generated from `#/paths/oauth/GET/query/state`. + internal var state: Swift.String? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - response_type: Must be `code`. + /// - client_id: Arbitrary identifier that uniquely identifies your application. + /// - redirect_uri: The absolute URL that the user should be redirected to with the authorization result. + /// - code_challenge_method: Must be `S256`. + /// - code_challenge: Compute `BASE64URL(SHA256(code_verifier))`. + /// - scope: Space separated list of requested OAuth scopes, if any. + /// - username: Hint that you want the user to log in with a specific Lichess username. + /// - state: Arbitrary state that will be returned verbatim with the authorization result. + internal init( + response_type: Swift.String, + client_id: Swift.String, + redirect_uri: Swift.String, + code_challenge_method: Swift.String, + code_challenge: Swift.String, + scope: Swift.String? = nil, + username: Swift.String? = nil, + state: Swift.String? = nil + ) { + self.response_type = response_type + self.client_id = client_id + self.redirect_uri = redirect_uri + self.code_challenge_method = code_challenge_method + self.code_challenge = code_challenge + self.scope = scope + self.username = username + self.state = state + } + } + internal var query: Operations.oauth.Input.Query + /// Creates a new `Input`. + /// + /// - Parameters: + /// - query: + internal init(query: Operations.oauth.Input.Query) { + self.query = query + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// Creates a new `Ok`. + internal init() {} + } + /// Authorization prompt will be displayed to the user. + /// + /// - Remark: Generated from `#/paths//oauth/get(oauth)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.oauth.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.oauth.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// 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 enum apiToken { + internal static let id: Swift.String = "apiToken" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/token/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiToken.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.apiToken.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.apiToken.Input.Headers + /// - Remark: Generated from `#/paths/api/token/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/token/POST/requestBody/urlEncodedForm`. + internal struct urlEncodedFormPayload: Codable, Hashable, Sendable { + /// Must be `authorization_code`. + /// + /// - Remark: Generated from `#/paths/api/token/POST/requestBody/urlEncodedForm/grant_type`. + internal var grant_type: Swift.String? + /// The authorization code that was sent in the `code` parameter to your `redirect_uri`. + /// + /// - Remark: Generated from `#/paths/api/token/POST/requestBody/urlEncodedForm/code`. + internal var code: Swift.String? + /// A `code_challenge` was used to request the authorization code. This must be the `code_verifier` it was derived from. + /// + /// - Remark: Generated from `#/paths/api/token/POST/requestBody/urlEncodedForm/code_verifier`. + internal var code_verifier: Swift.String? + /// Must match the `redirect_uri` used to request the authorization code. + /// + /// - Remark: Generated from `#/paths/api/token/POST/requestBody/urlEncodedForm/redirect_uri`. + internal var redirect_uri: Swift.String? + /// Must match the `client_id` used to request the authorization code. + /// + /// - Remark: Generated from `#/paths/api/token/POST/requestBody/urlEncodedForm/client_id`. + internal var client_id: Swift.String? + /// Creates a new `urlEncodedFormPayload`. + /// + /// - Parameters: + /// - grant_type: Must be `authorization_code`. + /// - code: The authorization code that was sent in the `code` parameter to your `redirect_uri`. + /// - code_verifier: A `code_challenge` was used to request the authorization code. This must be the `code_verifier` it was derived from. + /// - redirect_uri: Must match the `redirect_uri` used to request the authorization code. + /// - client_id: Must match the `client_id` used to request the authorization code. + internal init( + grant_type: Swift.String? = nil, + code: Swift.String? = nil, + code_verifier: Swift.String? = nil, + redirect_uri: Swift.String? = nil, + client_id: Swift.String? = nil + ) { + self.grant_type = grant_type + self.code = code + self.code_verifier = code_verifier + self.redirect_uri = redirect_uri + self.client_id = client_id + } + internal enum CodingKeys: String, CodingKey { + case grant_type + case code + case code_verifier + case redirect_uri + case client_id + } + } + /// - Remark: Generated from `#/paths/api/token/POST/requestBody/content/application\/x-www-form-urlencoded`. + case urlEncodedForm(Operations.apiToken.Input.Body.urlEncodedFormPayload) + } + internal var body: Operations.apiToken.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + /// - body: + internal init( + headers: Operations.apiToken.Input.Headers = .init(), + body: Operations.apiToken.Input.Body + ) { + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/token/POST/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/token/POST/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiToken.Output.Ok.Headers + /// - Remark: Generated from `#/paths/api/token/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/token/POST/responses/200/content/application\/json`. + case json(OpenAPIRuntime.OpenAPIValueContainer) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: OpenAPIRuntime.OpenAPIValueContainer { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiToken.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiToken.Output.Ok.Headers = .init(), + body: Operations.apiToken.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// Access token successfully obtained. + /// + /// - Remark: Generated from `#/paths//api/token/post(apiToken)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.apiToken.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.apiToken.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + internal struct BadRequest: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/token/POST/responses/400/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/token/POST/responses/400/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiToken.Output.BadRequest.Headers + /// - Remark: Generated from `#/paths/api/token/POST/responses/400/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/token/POST/responses/400/content/application\/json`. + case json(Components.Schemas.OAuthError) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.OAuthError { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.apiToken.Output.BadRequest.Body + /// Creates a new `BadRequest`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.apiToken.Output.BadRequest.Headers = .init(), + body: Operations.apiToken.Output.BadRequest.Body + ) { + self.headers = headers + self.body = body + } + } + /// Failed to obtain access token. + /// + /// - Remark: Generated from `#/paths//api/token/post(apiToken)/responses/400`. + /// + /// HTTP response code: `400 badRequest`. + case badRequest(Operations.apiToken.Output.BadRequest) + /// The associated value of the enum case if `self` is `.badRequest`. + /// + /// - Throws: An error if `self` is not `.badRequest`. + /// - SeeAlso: `.badRequest`. + internal var badRequest: Operations.apiToken.Output.BadRequest { + get throws { + switch self { + case let .badRequest(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "badRequest", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum apiTokenDelete { + internal static let id: Swift.String = "apiTokenDelete" + internal struct Input: Sendable, Hashable { + /// Creates a new `Input`. + internal init() {} + } + @frozen internal enum Output: Sendable, Hashable { + internal struct NoContent: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/token/DELETE/responses/204/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/token/DELETE/responses/204/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.apiTokenDelete.Output.NoContent.Headers + /// Creates a new `NoContent`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + internal init(headers: Operations.apiTokenDelete.Output.NoContent.Headers = .init()) { + self.headers = headers + } + } + /// Access token revoked. + /// + /// - Remark: Generated from `#/paths//api/token/delete(apiTokenDelete)/responses/204`. + /// + /// HTTP response code: `204 noContent`. + case noContent(Operations.apiTokenDelete.Output.NoContent) + /// The associated value of the enum case if `self` is `.noContent`. + /// + /// - Throws: An error if `self` is not `.noContent`. + /// - SeeAlso: `.noContent`. + internal var noContent: Operations.apiTokenDelete.Output.NoContent { + get throws { + switch self { + case let .noContent(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "noContent", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + } + /// 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 enum tokenTest { + internal static let id: Swift.String = "tokenTest" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/token/test/POST/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.tokenTest.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.tokenTest.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.tokenTest.Input.Headers + /// - Remark: Generated from `#/paths/api/token/test/POST/requestBody`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/token/test/POST/requestBody/content/text\/plain`. + case plainText(OpenAPIRuntime.HTTPBody) + } + internal var body: Operations.tokenTest.Input.Body + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + /// - body: + internal init( + headers: Operations.tokenTest.Input.Headers = .init(), + body: Operations.tokenTest.Input.Body + ) { + self.headers = headers + self.body = body + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/token/test/POST/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/api/token/test/POST/responses/200/content/json`. + internal struct jsonPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/token/test/POST/responses/200/content/json/additionalProperties`. + @frozen internal enum additionalPropertiesPayload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/token/test/POST/responses/200/content/json/additionalProperties/case1`. + internal struct Case1Payload: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/paths/api/token/test/POST/responses/200/content/json/additionalProperties/case1/userId`. + internal var userId: Swift.String? + /// Comma-separated list of scopes. Empty string if the token has no scopes. + /// + /// - Remark: Generated from `#/paths/api/token/test/POST/responses/200/content/json/additionalProperties/case1/scopes`. + internal var scopes: Swift.String? + /// Unix-timestampe in milliseconds or null if the token never expires. + /// + /// - Remark: Generated from `#/paths/api/token/test/POST/responses/200/content/json/additionalProperties/case1/expires`. + internal var expires: Swift.Int? + /// Creates a new `Case1Payload`. + /// + /// - Parameters: + /// - userId: + /// - scopes: Comma-separated list of scopes. Empty string if the token has no scopes. + /// - expires: Unix-timestampe in milliseconds or null if the token never expires. + internal init( + userId: Swift.String? = nil, + scopes: Swift.String? = nil, + expires: Swift.Int? = nil + ) { + self.userId = userId + self.scopes = scopes + self.expires = expires + } + internal enum CodingKeys: String, CodingKey { + case userId + case scopes + case expires + } + } + /// - Remark: Generated from `#/paths/api/token/test/POST/responses/200/content/json/additionalProperties/case1`. + case case1(Operations.tokenTest.Output.Ok.Body.jsonPayload.additionalPropertiesPayload.Case1Payload) + /// - Remark: Generated from `#/paths/api/token/test/POST/responses/200/content/json/additionalProperties/case2`. + case case2(OpenAPIRuntime.OpenAPIValueContainer) + internal init(from decoder: any Decoder) throws { + var errors: [any Error] = [] + do { + self = .case1(try .init(from: decoder)) + return + } catch { + errors.append(error) + } + do { + self = .case2(try .init(from: decoder)) + return + } catch { + errors.append(error) + } + throw Swift.DecodingError.failedToDecodeOneOfSchema( + type: Self.self, + codingPath: decoder.codingPath, + errors: errors + ) + } + internal func encode(to encoder: any Encoder) throws { + switch self { + case let .case1(value): + try value.encode(to: encoder) + case let .case2(value): + try value.encode(to: encoder) + } + } + } + /// A container of undocumented properties. + internal var additionalProperties: [String: Operations.tokenTest.Output.Ok.Body.jsonPayload.additionalPropertiesPayload] + /// Creates a new `jsonPayload`. + /// + /// - Parameters: + /// - additionalProperties: A container of undocumented properties. + internal init(additionalProperties: [String: Operations.tokenTest.Output.Ok.Body.jsonPayload.additionalPropertiesPayload] = .init()) { + self.additionalProperties = additionalProperties + } + internal init(from decoder: any Decoder) throws { + additionalProperties = try decoder.decodeAdditionalProperties(knownKeys: []) + } + internal func encode(to encoder: any Encoder) throws { + try encoder.encodeAdditionalProperties(additionalProperties) + } + } + /// - Remark: Generated from `#/paths/api/token/test/POST/responses/200/content/application\/json`. + case json(Operations.tokenTest.Output.Ok.Body.jsonPayload) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Operations.tokenTest.Output.Ok.Body.jsonPayload { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.tokenTest.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - body: Received HTTP response body + internal init(body: Operations.tokenTest.Output.Ok.Body) { + self.body = body + } + } + /// The representation of the OAuth tokens. + /// + /// - Remark: Generated from `#/paths//api/token/test/post(tokenTest)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.tokenTest.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.tokenTest.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum openingExplorerMaster { + internal static let id: Swift.String = "openingExplorerMaster" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/masters/GET/query`. + internal struct Query: Sendable, Hashable { + /// FEN of the root position + /// + /// - Remark: Generated from `#/paths/masters/GET/query/fen`. + internal var fen: Swift.String? + /// Comma separated sequence of legal moves in UCI notation. + /// Play additional moves starting from `fen`. + /// Required to find an opening name, if `fen` is not an exact match + /// for a named position. + /// + /// + /// - Remark: Generated from `#/paths/masters/GET/query/play`. + internal var play: Swift.String? + /// Include only games from this year or later + /// + /// - Remark: Generated from `#/paths/masters/GET/query/since`. + internal var since: Swift.Double? + /// Include only games from this year or earlier + /// + /// - Remark: Generated from `#/paths/masters/GET/query/until`. + internal var until: Swift.Double? + /// Number of most common moves to display + /// + /// - Remark: Generated from `#/paths/masters/GET/query/moves`. + internal var moves: Swift.Double? + /// Number of top games to display + /// + /// - Remark: Generated from `#/paths/masters/GET/query/topGames`. + internal var topGames: Swift.Double? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - fen: FEN of the root position + /// - play: Comma separated sequence of legal moves in UCI notation. + /// - since: Include only games from this year or later + /// - until: Include only games from this year or earlier + /// - moves: Number of most common moves to display + /// - topGames: Number of top games to display + internal init( + fen: Swift.String? = nil, + play: Swift.String? = nil, + since: Swift.Double? = nil, + until: Swift.Double? = nil, + moves: Swift.Double? = nil, + topGames: Swift.Double? = nil + ) { + self.fen = fen + self.play = play + self.since = since + self.until = until + self.moves = moves + self.topGames = topGames + } + } + internal var query: Operations.openingExplorerMaster.Input.Query + /// - Remark: Generated from `#/paths/masters/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.openingExplorerMaster.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.openingExplorerMaster.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.openingExplorerMaster.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - query: + /// - headers: + internal init( + query: Operations.openingExplorerMaster.Input.Query = .init(), + headers: Operations.openingExplorerMaster.Input.Headers = .init() + ) { + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/masters/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/masters/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.openingExplorerMaster.Output.Ok.Headers + /// - Remark: Generated from `#/paths/masters/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/masters/GET/responses/200/content/application\/json`. + case json(Components.Schemas.OpeningExplorerJson) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.OpeningExplorerJson { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.openingExplorerMaster.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.openingExplorerMaster.Output.Ok.Headers = .init(), + body: Operations.openingExplorerMaster.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// Opening statistics and game references for the position. + /// + /// - Remark: Generated from `#/paths//masters/get(openingExplorerMaster)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.openingExplorerMaster.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.openingExplorerMaster.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum openingExplorerLichess { + internal static let id: Swift.String = "openingExplorerLichess" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/lichess/GET/query`. + internal struct Query: Sendable, Hashable { + /// Variant + /// + /// - Remark: Generated from `#/paths/lichess/GET/query/variant`. + internal var variant: Components.Schemas.VariantKey? + /// FEN or EPD of the root position + /// + /// - Remark: Generated from `#/paths/lichess/GET/query/fen`. + internal var fen: Swift.String? + /// Comma separated sequence of legal moves in UCI notation. + /// Play additional moves starting from `fen`. + /// Required to find an opening name, if `fen` is not an exact match + /// for a named position. + /// + /// + /// - Remark: Generated from `#/paths/lichess/GET/query/play`. + internal var play: Swift.String? + /// Comma separated list of game speeds to filter by + /// + /// - Remark: Generated from `#/paths/lichess/GET/query/speeds`. + internal var speeds: [Components.Schemas.Speed]? + /// Comma separated list of ratings groups to filter by. + /// Each group ranges from its value to the next higher + /// group in the enum (`0` from 0 to 999, `1000` from 1000 to 1199, + /// ..., `2500` from 2500 to any rating above). + /// + /// + /// - Remark: Generated from `#/paths/lichess/GET/query/ratings`. + internal var ratings: [Swift.Double]? + /// Include only games from this month or later + /// + /// - Remark: Generated from `#/paths/lichess/GET/query/since`. + internal var since: Swift.String? + /// Include only games from this month or earlier + /// + /// - Remark: Generated from `#/paths/lichess/GET/query/until`. + internal var until: Swift.String? + /// Number of most common moves to display + /// + /// - Remark: Generated from `#/paths/lichess/GET/query/moves`. + internal var moves: Swift.Double? + /// Number of top games to display + /// + /// - Remark: Generated from `#/paths/lichess/GET/query/topGames`. + internal var topGames: Swift.Double? + /// Number of recent games to display + /// + /// - Remark: Generated from `#/paths/lichess/GET/query/recentGames`. + internal var recentGames: Swift.Double? + /// Optionally retrieve history + /// + /// - Remark: Generated from `#/paths/lichess/GET/query/history`. + internal var history: Swift.Bool? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - variant: Variant + /// - fen: FEN or EPD of the root position + /// - play: Comma separated sequence of legal moves in UCI notation. + /// - speeds: Comma separated list of game speeds to filter by + /// - ratings: Comma separated list of ratings groups to filter by. + /// - since: Include only games from this month or later + /// - until: Include only games from this month or earlier + /// - moves: Number of most common moves to display + /// - topGames: Number of top games to display + /// - recentGames: Number of recent games to display + /// - history: Optionally retrieve history + internal init( + variant: Components.Schemas.VariantKey? = nil, + fen: Swift.String? = nil, + play: Swift.String? = nil, + speeds: [Components.Schemas.Speed]? = nil, + ratings: [Swift.Double]? = nil, + since: Swift.String? = nil, + until: Swift.String? = nil, + moves: Swift.Double? = nil, + topGames: Swift.Double? = nil, + recentGames: Swift.Double? = nil, + history: Swift.Bool? = nil + ) { + self.variant = variant + self.fen = fen + self.play = play + self.speeds = speeds + self.ratings = ratings + self.since = since + self.until = until + self.moves = moves + self.topGames = topGames + self.recentGames = recentGames + self.history = history + } + } + internal var query: Operations.openingExplorerLichess.Input.Query + /// - Remark: Generated from `#/paths/lichess/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.openingExplorerLichess.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.openingExplorerLichess.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.openingExplorerLichess.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - query: + /// - headers: + internal init( + query: Operations.openingExplorerLichess.Input.Query = .init(), + headers: Operations.openingExplorerLichess.Input.Headers = .init() + ) { + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/lichess/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/lichess/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.openingExplorerLichess.Output.Ok.Headers + /// - Remark: Generated from `#/paths/lichess/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/lichess/GET/responses/200/content/application\/json`. + case json(Components.Schemas.OpeningExplorerJson) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.OpeningExplorerJson { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.openingExplorerLichess.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.openingExplorerLichess.Output.Ok.Headers = .init(), + body: Operations.openingExplorerLichess.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// Opening statistics and game references for the position. + /// + /// - Remark: Generated from `#/paths//lichess/get(openingExplorerLichess)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.openingExplorerLichess.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.openingExplorerLichess.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// 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 enum openingExplorerPlayer { + internal static let id: Swift.String = "openingExplorerPlayer" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/player/GET/query`. + internal struct Query: Sendable, Hashable { + /// Username or ID of the player + /// + /// - Remark: Generated from `#/paths/player/GET/query/player`. + internal var player: Swift.String? + /// Variant + /// + /// - Remark: Generated from `#/paths/player/GET/query/variant`. + internal var variant: Components.Schemas.VariantKey? + /// FEN of the root position + /// + /// - Remark: Generated from `#/paths/player/GET/query/fen`. + internal var fen: Swift.String? + /// Comma separated sequence of legal moves in UCI notation. + /// Play additional moves starting from `fen`. + /// Required to find an opening name, if `fen` is not an exact match + /// for a named position. + /// + /// + /// - Remark: Generated from `#/paths/player/GET/query/play`. + internal var play: Swift.String? + /// Comma separated list of game speeds to look for + /// + /// - Remark: Generated from `#/paths/player/GET/query/speeds`. + internal var speeds: [Components.Schemas.Speed]? + /// - Remark: Generated from `#/paths/player/GET/query/modesPayload`. + @frozen internal enum modesPayloadPayload: String, Codable, Hashable, Sendable { + case casual = "casual" + case rated = "rated" + } + /// - Remark: Generated from `#/paths/player/GET/query/modes`. + internal typealias modesPayload = [Operations.openingExplorerPlayer.Input.Query.modesPayloadPayload] + /// Comma separated list of modes + /// + /// - Remark: Generated from `#/paths/player/GET/query/modes`. + internal var modes: Operations.openingExplorerPlayer.Input.Query.modesPayload? + /// Include only games from this month or later + /// + /// - Remark: Generated from `#/paths/player/GET/query/since`. + internal var since: Swift.String? + /// Include only games from this month or earlier + /// + /// - Remark: Generated from `#/paths/player/GET/query/until`. + internal var until: Swift.String? + /// Number of most common moves to display + /// + /// - Remark: Generated from `#/paths/player/GET/query/moves`. + internal var moves: Swift.Double? + /// Number of recent games to display + /// + /// - Remark: Generated from `#/paths/player/GET/query/recentGames`. + internal var recentGames: Swift.Double? + /// Creates a new `Query`. + /// + /// - Parameters: + /// - player: Username or ID of the player + /// - variant: Variant + /// - fen: FEN of the root position + /// - play: Comma separated sequence of legal moves in UCI notation. + /// - speeds: Comma separated list of game speeds to look for + /// - modes: Comma separated list of modes + /// - since: Include only games from this month or later + /// - until: Include only games from this month or earlier + /// - moves: Number of most common moves to display + /// - recentGames: Number of recent games to display + internal init( + player: Swift.String? = nil, + variant: Components.Schemas.VariantKey? = nil, + fen: Swift.String? = nil, + play: Swift.String? = nil, + speeds: [Components.Schemas.Speed]? = nil, + modes: Operations.openingExplorerPlayer.Input.Query.modesPayload? = nil, + since: Swift.String? = nil, + until: Swift.String? = nil, + moves: Swift.Double? = nil, + recentGames: Swift.Double? = nil + ) { + self.player = player + self.variant = variant + self.fen = fen + self.play = play + self.speeds = speeds + self.modes = modes + self.since = since + self.until = until + self.moves = moves + self.recentGames = recentGames + } + } + internal var query: Operations.openingExplorerPlayer.Input.Query + /// - Remark: Generated from `#/paths/player/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.openingExplorerPlayer.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.openingExplorerPlayer.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.openingExplorerPlayer.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - query: + /// - headers: + internal init( + query: Operations.openingExplorerPlayer.Input.Query = .init(), + headers: Operations.openingExplorerPlayer.Input.Headers = .init() + ) { + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/player/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/player/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.openingExplorerPlayer.Output.Ok.Headers + /// - Remark: Generated from `#/paths/player/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/player/GET/responses/200/content/application\/nd-json`. + case application_nd_hyphen_json(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_nd_hyphen_json`. + /// + /// - Throws: An error if `self` is not `.application_nd_hyphen_json`. + /// - SeeAlso: `.application_nd_hyphen_json`. + internal var application_nd_hyphen_json: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_nd_hyphen_json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.openingExplorerPlayer.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.openingExplorerPlayer.Output.Ok.Headers = .init(), + body: Operations.openingExplorerPlayer.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// Opening statistics and game references for the position. + /// + /// - Remark: Generated from `#/paths//player/get(openingExplorerPlayer)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.openingExplorerPlayer.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.openingExplorerPlayer.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_nd_hyphen_json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/nd-json": + self = .application_nd_hyphen_json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_nd_hyphen_json: + return "application/nd-json" + } + } + internal static var allCases: [Self] { + [ + .application_nd_hyphen_json + ] + } + } + } + /// 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 enum openingExplorerMasterGame { + internal static let id: Swift.String = "openingExplorerMasterGame" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/master/pgn/{gameId}/GET/path`. + internal struct Path: Sendable, Hashable { + /// - Remark: Generated from `#/paths/master/pgn/{gameId}/GET/path/gameId`. + internal var gameId: Swift.String + /// Creates a new `Path`. + /// + /// - Parameters: + /// - gameId: + internal init(gameId: Swift.String) { + self.gameId = gameId + } + } + internal var path: Operations.openingExplorerMasterGame.Input.Path + /// - Remark: Generated from `#/paths/master/pgn/{gameId}/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.openingExplorerMasterGame.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.openingExplorerMasterGame.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.openingExplorerMasterGame.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - path: + /// - headers: + internal init( + path: Operations.openingExplorerMasterGame.Input.Path, + headers: Operations.openingExplorerMasterGame.Input.Headers = .init() + ) { + self.path = path + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/master/pgn/{gameId}/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/master/pgn/{gameId}/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.openingExplorerMasterGame.Output.Ok.Headers + /// - Remark: Generated from `#/paths/master/pgn/{gameId}/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/master/pgn/{gameId}/GET/responses/200/content/application\/x-chess-pgn`. + case application_x_hyphen_chess_hyphen_pgn(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.application_x_hyphen_chess_hyphen_pgn`. + /// + /// - Throws: An error if `self` is not `.application_x_hyphen_chess_hyphen_pgn`. + /// - SeeAlso: `.application_x_hyphen_chess_hyphen_pgn`. + internal var application_x_hyphen_chess_hyphen_pgn: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .application_x_hyphen_chess_hyphen_pgn(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.openingExplorerMasterGame.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.openingExplorerMasterGame.Output.Ok.Headers = .init(), + body: Operations.openingExplorerMasterGame.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The PGN representation of the game. + /// + /// - Remark: Generated from `#/paths//master/pgn/{gameId}/get(openingExplorerMasterGame)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.openingExplorerMasterGame.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.openingExplorerMasterGame.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case application_x_hyphen_chess_hyphen_pgn + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/x-chess-pgn": + self = .application_x_hyphen_chess_hyphen_pgn + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .application_x_hyphen_chess_hyphen_pgn: + return "application/x-chess-pgn" + } + } + internal static var allCases: [Self] { + [ + .application_x_hyphen_chess_hyphen_pgn + ] + } + } + } + /// 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 enum tablebaseStandard { + internal static let id: Swift.String = "tablebaseStandard" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/standard/GET/query`. + internal struct Query: Sendable, Hashable { + /// FEN of the position. Underscores allowed. + /// + /// - Remark: Generated from `#/paths/standard/GET/query/fen`. + internal var fen: Swift.String + /// Creates a new `Query`. + /// + /// - Parameters: + /// - fen: FEN of the position. Underscores allowed. + internal init(fen: Swift.String) { + self.fen = fen + } + } + internal var query: Operations.tablebaseStandard.Input.Query + /// - Remark: Generated from `#/paths/standard/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.tablebaseStandard.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.tablebaseStandard.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.tablebaseStandard.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - query: + /// - headers: + internal init( + query: Operations.tablebaseStandard.Input.Query, + headers: Operations.tablebaseStandard.Input.Headers = .init() + ) { + self.query = query + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/standard/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/standard/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.tablebaseStandard.Output.Ok.Headers + /// - Remark: Generated from `#/paths/standard/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/standard/GET/responses/200/content/application\/json`. + case json(Components.Schemas.TablebaseJson) + /// The associated value of the enum case if `self` is `.json`. + /// + /// - Throws: An error if `self` is not `.json`. + /// - SeeAlso: `.json`. + internal var json: Components.Schemas.TablebaseJson { + get throws { + switch self { + case let .json(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.tablebaseStandard.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.tablebaseStandard.Output.Ok.Headers = .init(), + body: Operations.tablebaseStandard.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The tablebase information for the position in standard chess. + /// + /// - Remark: Generated from `#/paths//standard/get(tablebaseStandard)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.tablebaseStandard.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.tablebaseStandard.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case json + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "application/json": + self = .json + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .json: + return "application/json" + } + } + internal static var allCases: [Self] { + [ + .json + ] + } + } + } + /// Tablebase lookup for Atomic chess + /// + /// **Endpoint: <https://tablebase.lichess.ovh>** + /// + /// + /// - Remark: HTTP `GET /atomic`. + /// - Remark: Generated from `#/paths//atomic/get(tablebaseAtomic)`. + internal enum tablebaseAtomic { + internal static let id: Swift.String = "tablebaseAtomic" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/atomic/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.tablebaseAtomic.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.tablebaseAtomic.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.tablebaseAtomic.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + internal init(headers: Operations.tablebaseAtomic.Input.Headers = .init()) { + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/atomic/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/atomic/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.tablebaseAtomic.Output.Ok.Headers + /// - Remark: Generated from `#/paths/atomic/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/atomic/GET/responses/200/content/text\/plain`. + case plainText(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.plainText`. + /// + /// - Throws: An error if `self` is not `.plainText`. + /// - SeeAlso: `.plainText`. + internal var plainText: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .plainText(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.tablebaseAtomic.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.tablebaseAtomic.Output.Ok.Headers = .init(), + body: Operations.tablebaseAtomic.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The tablebase information for the position in atomic chess. + /// + /// - Remark: Generated from `#/paths//atomic/get(tablebaseAtomic)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.tablebaseAtomic.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.tablebaseAtomic.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case plainText + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "text/plain": + self = .plainText + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .plainText: + return "text/plain" + } + } + internal static var allCases: [Self] { + [ + .plainText + ] + } + } + } + /// Tablebase lookup for Antichess + /// + /// **Endpoint: <https://tablebase.lichess.ovh>** + /// + /// + /// - Remark: HTTP `GET /antichess`. + /// - Remark: Generated from `#/paths//antichess/get(antichessAtomic)`. + internal enum antichessAtomic { + internal static let id: Swift.String = "antichessAtomic" + internal struct Input: Sendable, Hashable { + /// - Remark: Generated from `#/paths/antichess/GET/header`. + internal struct Headers: Sendable, Hashable { + internal var accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.antichessAtomic.AcceptableContentType>] + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - accept: + internal init(accept: [OpenAPIRuntime.AcceptHeaderContentType<Operations.antichessAtomic.AcceptableContentType>] = .defaultValues()) { + self.accept = accept + } + } + internal var headers: Operations.antichessAtomic.Input.Headers + /// Creates a new `Input`. + /// + /// - Parameters: + /// - headers: + internal init(headers: Operations.antichessAtomic.Input.Headers = .init()) { + self.headers = headers + } + } + @frozen internal enum Output: Sendable, Hashable { + internal struct Ok: Sendable, Hashable { + /// - Remark: Generated from `#/paths/antichess/GET/responses/200/headers`. + internal struct Headers: Sendable, Hashable { + /// - Remark: Generated from `#/paths/antichess/GET/responses/200/headers/Access-Control-Allow-Origin`. + internal var Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? + /// Creates a new `Headers`. + /// + /// - Parameters: + /// - Access_hyphen_Control_hyphen_Allow_hyphen_Origin: + internal init(Access_hyphen_Control_hyphen_Allow_hyphen_Origin: Swift.String? = nil) { + self.Access_hyphen_Control_hyphen_Allow_hyphen_Origin = Access_hyphen_Control_hyphen_Allow_hyphen_Origin + } + } + /// Received HTTP response headers + internal var headers: Operations.antichessAtomic.Output.Ok.Headers + /// - Remark: Generated from `#/paths/antichess/GET/responses/200/content`. + @frozen internal enum Body: Sendable, Hashable { + /// - Remark: Generated from `#/paths/antichess/GET/responses/200/content/text\/plain`. + case plainText(OpenAPIRuntime.HTTPBody) + /// The associated value of the enum case if `self` is `.plainText`. + /// + /// - Throws: An error if `self` is not `.plainText`. + /// - SeeAlso: `.plainText`. + internal var plainText: OpenAPIRuntime.HTTPBody { + get throws { + switch self { + case let .plainText(body): + return body + } + } + } + } + /// Received HTTP response body + internal var body: Operations.antichessAtomic.Output.Ok.Body + /// Creates a new `Ok`. + /// + /// - Parameters: + /// - headers: Received HTTP response headers + /// - body: Received HTTP response body + internal init( + headers: Operations.antichessAtomic.Output.Ok.Headers = .init(), + body: Operations.antichessAtomic.Output.Ok.Body + ) { + self.headers = headers + self.body = body + } + } + /// The tablebase information for the position in antichess. + /// + /// - Remark: Generated from `#/paths//antichess/get(antichessAtomic)/responses/200`. + /// + /// HTTP response code: `200 ok`. + case ok(Operations.antichessAtomic.Output.Ok) + /// The associated value of the enum case if `self` is `.ok`. + /// + /// - Throws: An error if `self` is not `.ok`. + /// - SeeAlso: `.ok`. + internal var ok: Operations.antichessAtomic.Output.Ok { + get throws { + switch self { + case let .ok(response): + return response + default: + try throwUnexpectedResponseStatus( + expectedStatus: "ok", + response: self + ) + } + } + } + /// Undocumented response. + /// + /// A response with a code that is not documented in the OpenAPI document. + case undocumented(statusCode: Swift.Int, OpenAPIRuntime.UndocumentedPayload) + } + @frozen internal enum AcceptableContentType: AcceptableProtocol { + case plainText + case other(Swift.String) + internal init?(rawValue: Swift.String) { + switch rawValue.lowercased() { + case "text/plain": + self = .plainText + default: + self = .other(rawValue) + } + } + internal var rawValue: Swift.String { + switch self { + case let .other(string): + return string + case .plainText: + return "text/plain" + } + } + internal static var allCases: [Self] { + [ + .plainText + ] + } + } + } +} diff --git a/Sources/LichessClient/LichessClient+Broadcasts.swift b/Sources/LichessClient/LichessClient+Broadcasts.swift new file mode 100644 index 0000000..93f8df7 --- /dev/null +++ b/Sources/LichessClient/LichessClient+Broadcasts.swift @@ -0,0 +1,110 @@ +// +// LichessClient+Broadcasts.swift +// +// +// Created by Navan Chauhan on 4/24/24. +// + +import Foundation +import OpenAPIRuntime + +extension LichessClient { + public struct TournamentResponse: Codable, Identifiable { + public let id: String + public let tour: Tournament + public let rounds: [Round] + + public init(from decoder: Decoder) throws { + let container: KeyedDecodingContainer<LichessClient.TournamentResponse.CodingKeys> = + try decoder.container(keyedBy: LichessClient.TournamentResponse.CodingKeys.self) + self.tour = try container.decode( + LichessClient.Tournament.self, forKey: LichessClient.TournamentResponse.CodingKeys.tour) + self.rounds = try container.decode( + [LichessClient.Round].self, forKey: LichessClient.TournamentResponse.CodingKeys.rounds) + self.id = tour.id + } + } + + public struct Tournament: Codable { + public let id: String + public let name: String + public let slug: String + public let description: String + public let markup: String? + public let url: String? + } + + public struct Round: Codable, Identifiable { + public let id: String + public let name: String + public let slug: String + public let startsAt: Date // UNIX Epoch? + public let finished: Bool? + public let ongoing: Bool? + + } + + public struct Player: Codable { + public let userId: String + public let name: String + public let color: String + } + + public func broadcastIndex(nb: Int = 20) async throws -> AsyncThrowingMapSequence< + JSONLinesDeserializationSequence<HTTPBody>, LichessClient.TournamentResponse + > { + let response = try await underlyingClient.broadcastIndex(query: .init(nb: nb)) + switch response { + case .ok(let okResponse): + let tournaments = try okResponse.body.application_x_hyphen_ndjson.asDecodedJSONLines( + of: TournamentResponse.self) + return tournaments + case .undocumented(let statusCode, _): + throw LichessClientError.undocumentedResponse(statusCode: statusCode) + } + } + + public func broadcastRound( + broadcastTournamentSlug: String = "-", broadcastRoundSlug: String = "-", + broadcastRoundId: String + ) async throws { + let response = try await underlyingClient.broadcastRoundGet( + path: .init( + broadcastTournamentSlug: broadcastTournamentSlug, + broadcastRoundSlug: broadcastRoundSlug, + broadcastRoundId: broadcastRoundId + )) + switch response { + case .ok(let okResponse): + print(okResponse.body, try okResponse.body.json) + // TODO: Return + case .undocumented(let statusCode, _): + throw LichessClientError.undocumentedResponse(statusCode: statusCode) + } + } + + public func getBroadcastRoundPGN(broadcastRoundId: String) async throws -> HTTPBody { + let response = try await underlyingClient.broadcastRoundPgn( + path: .init( + broadcastRoundId: broadcastRoundId + )) + + switch response { + case .ok(let okResponse): + return try okResponse.body.application_x_hyphen_chess_hyphen_pgn + case .undocumented(let statusCode, _): + throw LichessClientError.undocumentedResponse(statusCode: statusCode) + } + } + + public func broadcastStreamRoundPgn(broadcastRoundId: String) async throws -> HTTPBody { + let response = try await underlyingClient.broadcastStreamRoundPgn( + path: .init(broadcastRoundId: broadcastRoundId)) + switch response { + case .ok(let okResponse): + return try okResponse.body.application_x_hyphen_chess_hyphen_pgn + case .undocumented(let statusCode, _): + throw LichessClientError.undocumentedResponse(statusCode: statusCode) + } + } +} diff --git a/Sources/LichessClient/LichessClient+Tablebase.swift b/Sources/LichessClient/LichessClient+Tablebase.swift new file mode 100644 index 0000000..a06c1c7 --- /dev/null +++ b/Sources/LichessClient/LichessClient+Tablebase.swift @@ -0,0 +1,142 @@ +// +// LichessClient+Tablebase.swift +// +// +// Created by Navan Chauhan on 4/23/24. +// + +import Foundation + +extension LichessClient { + public struct TablebaseLookup: Codable { + public let dtz: Int? + public let precise_dtz: Int? + public let dtm: Int? + public let checkmate: Bool? + public let stalemate: Bool? + public let variant_win: Bool? + public let variant_loss: Bool? + public let insufficient_material: Bool? + public let category: TablebaseCategory? + public var moves: [TablebaseMove]? + } + + public struct TablebaseMove: Codable { + public let uci: String? + public let san: String? + public let dtz: Int? + public let precise_dtz: Int? + public let dtm: Int? + public let zeroing: Bool? + public let checkmate: Bool? + public let stalemate: Bool? + public let variant_win: Bool? + public let variant_loss: Bool? + public let insufficient_material: Bool? + public let category: TablebaseCategory? + } + + public enum TablebaseCategory: Codable { + case win + case unknown + case maybe_hyphen_win + case cursed_hyphen_win + case draw + case blessed_hyphen_loss + case maybe_hyphen_loss + case loss + } + + func convertCategoryTablebaseJson(payload: Components.Schemas.TablebaseJson.categoryPayload?) + -> TablebaseCategory? + { + guard let payload = payload else { return nil } + switch payload { + case .win: + return .win + case .unknown: + return .unknown + case .maybe_hyphen_win: + return .maybe_hyphen_win + case .cursed_hyphen_win: + return .cursed_hyphen_win + case .draw: + return .draw + case .blessed_hyphen_loss: + return .blessed_hyphen_loss + case .maybe_hyphen_loss: + return .maybe_hyphen_loss + case .loss: + return .loss + } + } + + func convertCategoryTablebaseJsonMoves(payload: Components.Schemas.Move.categoryPayload?) + -> TablebaseCategory? + { + guard let payload = payload else { return nil } + switch payload { + case .win: + return .win + case .unknown: + return .unknown + case .maybe_hyphen_win: + return .maybe_hyphen_win + case .cursed_hyphen_win: + return .cursed_hyphen_win + case .draw: + return .draw + case .blessed_hyphen_loss: + return .blessed_hyphen_loss + case .maybe_hyphen_loss: + return .maybe_hyphen_loss + case .loss: + return .loss + } + } + + public func getStandardTablebase(fen: String) async throws -> TablebaseLookup { + let response = try await underlyingTablebaseClient.tablebaseStandard(query: .init(fen: fen)) + switch response { + case .ok(let okResponse): + switch okResponse.body { + case .json(let tablebaseJson): + var tablebaseLookup = TablebaseLookup( + dtz: tablebaseJson.dtz, precise_dtz: tablebaseJson.precise_dtz, dtm: tablebaseJson.dtm, + checkmate: tablebaseJson.checkmate, stalemate: tablebaseJson.stalemate, + variant_win: tablebaseJson.variant_win, variant_loss: tablebaseJson.variant_win, + insufficient_material: tablebaseJson.insufficient_material, + category: convertCategoryTablebaseJson(payload: tablebaseJson.category), moves: []) + + guard let moves = tablebaseJson.moves else { + return tablebaseLookup + } + var tablebaseMoves: [TablebaseMove] = [] + for move in moves { + let tablebaseMove = TablebaseMove( + uci: move.uci, san: move.san, dtz: move.dtz, precise_dtz: move.precise_dtz, + dtm: move.dtm, zeroing: move.zeroing, checkmate: move.checkmate, + stalemate: move.stalemate, variant_win: move.variant_win, + variant_loss: move.variant_loss, insufficient_material: move.insufficient_material, + category: convertCategoryTablebaseJsonMoves(payload: move.category)) + tablebaseMoves.append(tablebaseMove) + } + tablebaseLookup.moves = tablebaseMoves + return tablebaseLookup + + } + case .undocumented(let statusCode, _): + throw LichessClientError.undocumentedResponse(statusCode: statusCode) + } + } + + public func getAtomicTablebase(fen: String) { + fatalError("getAtomicTablebase(fen: String) has not been implemented yet. Please file an issue") + } + + public func getAntichessTablebase(fen: String) { + fatalError( + "getAntichessTablebase(fen: String) has not been implemented yet. Please file an issue") + } + +} diff --git a/Sources/LichessClient/LichessClient.swift b/Sources/LichessClient/LichessClient.swift new file mode 100644 index 0000000..d398538 --- /dev/null +++ b/Sources/LichessClient/LichessClient.swift @@ -0,0 +1,29 @@ +import Foundation +import OpenAPIRuntime +import OpenAPIURLSession + +public struct LichessClient { + // Lichess has a separate endpoint for its tablebase server + internal let underlyingClient: any APIProtocol + internal let underlyingTablebaseClient: any APIProtocol + + internal init(underlyingClient: any APIProtocol, underlyingTablebaseClient: any APIProtocol) { + self.underlyingClient = underlyingClient + self.underlyingTablebaseClient = underlyingTablebaseClient + } + + public init() { + self.init( + underlyingClient: Client( + serverURL: URL(string: "https://lichess.org")!, transport: URLSessionTransport()), + underlyingTablebaseClient: Client( + serverURL: URL(string: "https://tablebase.lichess.ovh")!, transport: URLSessionTransport()) + ) + } + + enum LichessClientError: Error { + case undocumentedResponse(statusCode: Int) + case parsingError(error: Error) + } + +} diff --git a/Sources/LichessClient/openapi-generator-config.yaml b/Sources/LichessClient/openapi-generator-config.yaml new file mode 100644 index 0000000..569d3a6 --- /dev/null +++ b/Sources/LichessClient/openapi-generator-config.yaml @@ -0,0 +1,3 @@ +generate: + - types + - client diff --git a/Sources/LichessClient/openapi.json b/Sources/LichessClient/openapi.json new file mode 100644 index 0000000..5af0042 --- /dev/null +++ b/Sources/LichessClient/openapi.json @@ -0,0 +1,15619 @@ +{ + "openapi": "3.1.0", + "info": { + "version": "2.0.0", + "title": "Lichess.org API reference", + "contact": { + "name": "Lichess.org API", + "url": "https://lichess.org/api", + "email": "contact@lichess.org" + }, + "x-logo": { + "url": "https://lichess1.org/assets/logo/lichess-pad12.svg" + }, + "license": { + "name": "AGPL-3.0-or-later", + "url": "https://www.gnu.org/licenses/agpl-3.0.txt" + }, + "description": "# Introduction\nWelcome to the reference for the Lichess API! Lichess is free/libre,\nopen-source chess server powered by volunteers and donations.\n- Get help in the [Lichess Discord channel](https://discord.gg/lichess)\n- API demo app with OAuth2 login and gameplay: [source](https://github.com/lichess-org/api-demo) / [demo](https://lichess-org.github.io/api-demo/)\n- API UI app with OAuth2 login and endpoint forms: [source](https://github.com/lichess-org/api-ui) / [website](https://lichess.org/api/ui)\n- [Contribute to this documentation on Github](https://github.com/lichess-org/api)\n- Check out [Lichess widgets to embed in your website](https://lichess.org/developers)\n- [Download all Lichess rated games](https://database.lichess.org/)\n- [Download all Lichess puzzles with themes, ratings and votes](https://database.lichess.org/#puzzles)\n- [Download all evaluated positions](https://database.lichess.org/#evals)\n\n## Endpoint\nAll requests go to `https://lichess.org` (unless otherwise specified).\n\n## Clients\n- [Python general API](https://github.com/lichess-org/berserk)\n- [MicroPython general API](https://github.com/mkomon/uberserk)\n- [Python general API - async](https://pypi.org/project/async-lichess-sdk)\n- [Python Lichess Bot](https://github.com/lichess-bot-devs/lichess-bot)\n- [Python Board API for Certabo](https://github.com/haklein/certabo-lichess)\n- [Java general API](https://github.com/tors42/chariot)\n- [JavaScript & TypeScript general API](https://github.com/devjiwonchoi/equine)\n\n## Rate limiting\nAll requests are rate limited using various strategies,\nto ensure the API remains responsive for everyone.\nOnly make one request at a time.\nIf you receive an HTTP response with a [429 status](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#429),\nplease wait a full minute before resuming API usage.\n\n## Streaming with ND-JSON\nSome 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.\n\nHere's a [JavaScript utility function](https://gist.github.com/ornicar/a097406810939cf7be1df8ea30e94f3e) to help reading NDJSON streamed responses.\n\n## Authentication\n### Which authentication method is right for me?\n[Read about the Lichess API authentication methods and code examples](https://github.com/lichess-org/api/blob/master/example/README.md)\n\n### Personal Access Token\nPersonal API access tokens allow you to quickly interact with Lichess API without going through an OAuth flow.\n- [Generate a personal access token](https://lichess.org/account/oauth/token)\n- `curl https://lichess.org/api/account -H \"Authorization: Bearer {token}\"`\n- [NodeJS example](https://github.com/lichess-org/api/tree/master/example/oauth-personal-token)\n\n### Authorization Code Flow with PKCE\nThe authorization code flow with PKCE allows your users to **login with Lichess**.\nLichess supports unregistered and public clients (no client authentication, choose any unique client id).\nThe only accepted code challenge method is `S256`.\nAccess tokens are long-lived (expect one year), unless they are revoked.\nRefresh tokens are not supported.\n\nSee the [documentation for the OAuth endpoints](#tag/OAuth) or\nthe [PKCE RFC](https://datatracker.ietf.org/doc/html/rfc7636#section-4) for a precise protocol description.\n\n- [Demo app](https://lichess-org.github.io/api-demo/)\n- [Minimal client-side example](https://github.com/lichess-org/api/tree/master/example/oauth-app)\n- [Flask/Python example](https://github.com/lakinwecker/lichess-oauth-flask)\n- [Java example](https://github.com/tors42/lichess-oauth-pkce-app)\n- [NodeJS Passport strategy to login with Lichess OAuth2](https://www.npmjs.com/package/passport-lichess)\n\n#### Real life examples\n- [PyChess](https://github.com/gbtami/pychess-variants) ([source code](https://github.com/gbtami/pychess-variants))\n- [Lichess4545](https://www.lichess4545.com/) ([source code](https://github.com/cyanfish/heltour))\n- [English Chess Federation](https://ecf.octoknight.com/)\n- [Rotherham Online Chess](https://rotherhamonlinechess.azurewebsites.net/tournaments)\n\n### Token format\nAccess tokens and authorization codes match `^[A-Za-z0-9_]+$`.\nThe length of tokens can be increased without notice. Make sure your application can handle at least 512 characters.\nBy convention tokens have a recognizable prefix, but do not rely on this.\n" + }, + "servers": [ + { + "url": "https://lichess.org" + } + ], + "tags": [ + { + "name": "Account", + "description": "Read and write account information and preferences.\n<https://lichess.org/account/preferences/game-display>\n" + }, + { + "name": "Users", + "description": "Access registered users on Lichess.\n<https://lichess.org/player>\n\n- Each user blog exposes an atom (RSS) feed, like <https://lichess.org/@/thibault/blog.atom>\n- User blogs mashup feed: https://lichess.org/blog/community.atom\n- User blogs mashup feed for a language: https://lichess.org/blog/community/fr.atom\n" + }, + { + "name": "Relations", + "description": "Access relations between users.\n" + }, + { + "name": "Games", + "description": "Access games played on Lichess.\n<https://lichess.org/games>\n" + }, + { + "name": "TV", + "description": "Access Lichess TV channels and games.\n<https://lichess.org/tv> & <https://lichess.org/games>\n" + }, + { + "name": "Puzzles", + "description": "Access Lichess [puzzle history and dashboard](https://lichess.org/training).\n\nOur collection of puzzles is in the public domain, you can [download it here](https://database.lichess.org/#puzzles).\nFor a list of our puzzle themes with their description, check out the [theme translation file](https://github.com/ornicar/lila/blob/master/translation/source/puzzleTheme.xml).\nThe daily puzzle can be [posted in your slack workspace](https://lichess.org/daily-puzzle-slack).\n" + }, + { + "name": "Teams", + "description": "Access and manage Lichess teams and their members.\n<https://lichess.org/team>\n" + }, + { + "name": "Board", + "description": "Play on Lichess with physical boards and third-party clients.\n Works with normal Lichess accounts. Engine play or assistance is [forbidden](https://lichess.org/page/fair-play).\n\n\n### Features\n - [Stream incoming chess moves](#operation/boardGameStream)\n - [Play chess moves](#operation/boardGameMove)\n - [Read](#operation/boardGameStream) and [write](#operation/boardGameChatPost) in the player and spectator chats\n - [Receive](#operation/apiStreamEvent), [create](#operation/challengeCreate) and [accept](#operation/challengeAccept) (or [decline](#operation/challengeDecline)) challenges\n - [Abort](#operation/boardGameAbort) and [resign](#operation/boardGameResign) games\n - Compatible with normal Lichess accounts\n\n \n### Restrictions\n - Engine assistance, or any kind of outside help, is [forbidden](https://lichess.org/page/fair-play)\n - Time controls: [Rapid, Classical and Correspondence](https://lichess.org/faq#time-controls) only.\n For direct challenges and games vs AI, Blitz is also possible.\n\n### Links\n - [Announcement](https://lichess.org/blog/XlRW5REAAB8AUJJ-/welcome-lichess-boards)\n - [Implementation example](https://github.com/lichess-org/api-demo) and [live demo](https://lichess-org.github.io/api-demo/)\n\n - [Certabo support](https://github.com/haklein/certabo-lichess)\n - [Lichs (play from command-line)](https://github.com/Cqsi/lichs)\n - [Lichess discord bot](https://top.gg/bot/707287095911120968)\n - [cli-chess](https://github.com/trevorbayless/cli-chess/)" + }, + { + "name": "Bot", + "description": "Play on Lichess as a bot. Allows engine play.\n Read the [blog post announcement of lichess bots](https://lichess.org/blog/WvDNticAAMu_mHKP/welcome-lichess-bots).\n\n Only works with [Bot accounts](#operation/botAccountUpgrade).\n\n\n### Features\n - [Stream incoming chess moves](#operation/botGameStream)\n - [Play chess moves](#operation/botGameMove)\n - [Read](#operation/botGameStream) and [write](#operation/botGameChat) in the player and spectator chats\n - [Receive](#operation/apiStreamEvent), [create](#operation/challengeCreate) and [accept](#operation/challengeAccept) (or [decline](#operation/challengeDecline)) challenges\n - [Abort](#operation/botGameAbort) and [resign](#operation/botGameResign) games\n - Engine assistance is [allowed](https://lichess.org/page/fair-play)\n\n### Restrictions\n - Bots can only play challenge games: pools and tournaments are off-limits\n - Bots cannot play UltraBullet (¼+0) because it requires making too many requests. But 0+1 and ½+0 are allowed.\n - Bots must follow [Lichess TOS](https://lichess.org/terms-of-service) specifically Sandbagging, Constant Aborting, Boosting, etc\n - Bot devs are advised to make their Bots play casual only when testing their Bots logic and to avoid breaking Lichess TOS.\n\n### Integrations\n - [Python3 lichess-bot](https://github.com/lichess-bot-devs/lichess-bot) (official)\n - [Python3 lichess UCI bot](https://github.com/Torom/BotLi)\n - [JavaScript bot-o-tron](https://github.com/tailuge/bot-o-tron)\n - [Golang lichess-bot](https://github.com/dolegi/lichess-bot)\n - [Electronic Chessboard](http://www.oliviermercier.com/res/projects/chessboard/) - Yours? Please make [an issue or pull request](https://github.com/lichess-org/api).\n\n### Links\n - [Announcement](https://lichess.org/blog/WvDNticAAMu_mHKP/welcome-lichess-bots)\n - Join the [Lichess Bots team](https://lichess.org/team/lichess-bots) with your bot account\n - [Get help in the discord channel](https://discord.gg/quwueFd)\n - Watch [Lichess Bot TV](https://lichess.org/tv/bot)" + }, + { + "name": "Challenges", + "description": "Send and receive challenges to play.\n\nTo create a lot of challenges, consider [bulk pairing](#operation/bulkPairingCreate) instead.\n" + }, + { + "name": "Bulk pairings", + "description": "Create many games for other players.\n\nThese endpoints are intended for tournament organisers.\n" + }, + { + "name": "Arena tournaments", + "description": "Access Arena tournaments played on Lichess.\n[Official Arena tournaments](https://lichess.org/tournament) are maintained by Lichess,\nbut you can [create your own Arena tournaments](https://lichess.org/tournament/new) as well.\n" + }, + { + "name": "Swiss tournaments", + "description": "Access Swiss tournaments played on Lichess.\n[Read more about Swiss tournaments.](https://lichess.org/swiss).\n" + }, + { + "name": "Simuls", + "description": "Access simuls played on Lichess.\n<https://lichess.org/simul>\n" + }, + { + "name": "Studies", + "description": "Access Lichess studies.\n<https://lichess.org/study>\n" + }, + { + "name": "Messaging", + "description": "Private messages with other players.\n<https://lichess.org/inbox>\n" + }, + { + "name": "Broadcasts", + "description": "Relay chess events on Lichess.\n[Official broadcasts](https://lichess.org/broadcast) are maintained by Lichess,\nbut you can [create your own broadcasts](https://lichess.org/broadcast/new) to cover any live game or chess event.\nYou will need to publish PGN on a public URL so that Lichess can pull updates from it.\nAlternatively, you can push PGN updates to Lichess using [this API endpoint](#tag/Broadcasts/operation/broadcastPush).\n\nBroadcasts are organized in tournaments, which have several rounds, which have several games.\nYou must first create a tournament, then you can add rounds to them.\n" + }, + { + "name": "Analysis", + "description": "Access Lichess cloud evaluations database.\n<https://lichess.org/analysis>\n" + }, + { + "name": "External engine", + "description": "**This API is in alpha and subject to change.**\n\nUse or provide external engine analysis.\n\nExternal engines can provide analysis on pages like the\n[analysis board](https://lichess.org/analysis), running as a service\noutside of the browser, or even on a different machine.\n" + }, + { + "name": "Opening Explorer", + "description": "Lookup positions from the [Lichess opening explorer](https://lichess.org/analysis#explorer).\n\nRuns <https://github.com/niklasf/lila-openingexplorer>.\n\n**The endpoint hostname is not lichess.org but explorer.lichess.ovh.**\n" + }, + { + "name": "Tablebase", + "description": "Lookup positions from the [Lichess tablebase server](https://lichess.org/blog/W3WeMyQAACQAdfAL/7-piece-syzygy-tablebases-are-complete).\n\n**The endpoint hostname is not lichess.org but tablebase.lichess.ovh.**\n" + }, + { + "name": "OAuth", + "description": "Obtaining and revoking OAuth tokens.\n\n[Read about the Lichess API authentication methods and code examples](https://github.com/lichess-org/api/blob/master/example/README.md).\n" + } + ], + "paths": { + "/api/users/status": { + "get": { + "operationId": "apiUsersStatus", + "summary": "Get real-time users status", + "description": "Read the `online`, `playing` and `streaming` flags of several users.\nThis API is very fast and cheap on lichess side.\nSo you can call it quite often (like once every 5 seconds).\nUse it to track players and know when they're connected on lichess and playing games.\n", + "tags": [ + "Users" + ], + "security": [], + "parameters": [ + { + "in": "query", + "name": "ids", + "required": true, + "description": "User IDs separated by commas. Up to 100 IDs.", + "schema": { + "type": "string" + }, + "example": "aliquantus,chess-network,lovlas" + }, + { + "in": "query", + "name": "withGameIds", + "required": false, + "description": "Also return the ID of the game being played, if any, for each player, in a `playingId` field.\nDefaults to `false` to preserve server resources.\n", + "schema": { + "type": "boolean" + }, + "example": true + } + ], + "responses": { + "200": { + "description": "The list of users and their respective statuses.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "title": { + "type": "string" + }, + "online": { + "type": "boolean" + }, + "playing": { + "type": "boolean" + }, + "streaming": { + "type": "boolean" + }, + "patron": { + "type": "boolean" + } + }, + "required": [ + "id", + "name" + ] + }, + "example": [ + { + "id": "aliquantus", + "name": "Aliquantus" + }, + { + "id": "chess-network", + "name": "Chess-Network", + "title": "NM", + "online": true, + "playing": true, + "streaming": true, + "patron": true + } + ] + } + } + } + } + } + } + }, + "/api/player": { + "get": { + "operationId": "player", + "summary": "Get all top 10", + "tags": [ + "Users" + ], + "security": [], + "description": "Get the top 10 players for each speed and variant.\nSee <https://lichess.org/player>.\n", + "responses": { + "200": { + "description": "The list of variants with their respective top players.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Top10s" + } + } + } + } + } + } + }, + "/api/player/top/{nb}/{perfType}": { + "get": { + "operationId": "playerTopNbPerfType", + "summary": "Get one leaderboard", + "tags": [ + "Users" + ], + "security": [], + "description": "Get the leaderboard for a single speed or variant (a.k.a. `perfType`).\nThere is no leaderboard for correspondence or puzzles.\nSee <https://lichess.org/player/top/200/bullet>.\n", + "parameters": [ + { + "in": "path", + "name": "nb", + "description": "How many users to fetch", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 200, + "example": 100 + }, + "required": true + }, + { + "in": "path", + "name": "perfType", + "description": "The speed or variant", + "schema": { + "type": "string", + "example": "bullet", + "enum": [ + "ultraBullet", + "bullet", + "blitz", + "rapid", + "classical", + "chess960", + "crazyhouse", + "antichess", + "atomic", + "horde", + "kingOfTheHill", + "racingKings", + "threeCheck" + ] + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The list of top players for the variant.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/vnd.lichess.v3+json": { + "schema": { + "$ref": "#/components/schemas/Leaderboard" + } + } + } + } + } + } + }, + "/api/user/{username}": { + "get": { + "operationId": "apiUser", + "summary": "Get user public data", + "description": "Read public data of a user.\n", + "tags": [ + "Users" + ], + "security": [ + { + "OAuth2": [] + } + ], + "parameters": [ + { + "in": "path", + "name": "username", + "schema": { + "type": "string" + }, + "required": true + }, + { + "in": "query", + "name": "trophies", + "description": "Include user trophies", + "schema": { + "type": "boolean", + "default": false + } + } + ], + "responses": { + "200": { + "description": "The information of the user.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserExtended" + } + } + } + } + } + } + }, + "/api/user/{username}/rating-history": { + "get": { + "operationId": "apiUserRatingHistory", + "summary": "Get rating history of a user", + "description": "Read rating history of a user, for all perf types.\nThere is at most one entry per day.\nFormat of an entry is `[year, month, day, rating]`.\n`month` starts at zero (January).\n", + "tags": [ + "Users" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "username", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The rating history of the user.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RatingHistory" + } + } + } + } + } + } + }, + "/api/user/{username}/perf/{perf}": { + "get": { + "operationId": "apiUserPerf", + "summary": "Get performance statistics of a user", + "description": "Read performance statistics of a user, for a single performance.\nSimilar to the [performance pages on the website](https://lichess.org/@/thibault/perf/bullet).\n", + "tags": [ + "Users" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "username", + "schema": { + "type": "string" + }, + "required": true + }, + { + "in": "path", + "name": "perf", + "schema": { + "$ref": "#/components/schemas/PerfType" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The performance statistics of the user", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PerfStat" + } + } + } + } + } + } + }, + "/api/user/{username}/activity": { + "get": { + "operationId": "apiUserActivity", + "summary": "Get user activity", + "description": "Read data to generate the activity feed of a user.\n", + "tags": [ + "Users" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "username", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The activity feed of the user.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "example": "https://gist.github.com/ornicar/0ee2d2427cb74ed1a35e86f5ba09fabc" + } + } + } + } + } + }, + "/api/puzzle/daily": { + "get": { + "operationId": "apiPuzzleDaily", + "summary": "Get the daily puzzle", + "description": "Get the daily Lichess puzzle in JSON format.\nAlternatively, you can [post it in your slack workspace](https://lichess.org/daily-puzzle-slack).\n", + "tags": [ + "Puzzles" + ], + "security": [], + "responses": { + "200": { + "description": "The daily puzzle.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PuzzleAndGame" + } + } + } + } + } + } + }, + "/api/puzzle/{id}": { + "get": { + "operationId": "apiPuzzleId", + "summary": "Get a puzzle by its ID", + "description": "Get a single Lichess puzzle in JSON format.", + "tags": [ + "Puzzles" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "description": "The puzzle ID", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The requested puzzle.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PuzzleAndGame" + } + } + } + } + } + } + }, + "/api/puzzle/activity": { + "get": { + "operationId": "apiPuzzleActivity", + "summary": "Get your puzzle activity", + "description": "Download your puzzle activity in [ndjson](#section/Introduction/Streaming-with-ND-JSON) format.\nPuzzle activity is sorted by reverse chronological order (most recent first)\nWe recommend streaming the response, for it can be very long.\n", + "tags": [ + "Puzzles" + ], + "security": [ + { + "OAuth2": [ + "puzzle:read" + ] + } + ], + "parameters": [ + { + "in": "query", + "name": "max", + "description": "How many entries to download. Leave empty to download all activity.", + "schema": { + "type": "integer", + "minimum": 1 + } + }, + { + "in": "query", + "name": "before", + "description": "Download entries before this timestamp. Defaults to now. Use `before` and `max` for pagination.", + "schema": { + "type": "integer", + "minimum": 1356998400070 + } + } + ], + "responses": { + "200": { + "description": "The puzzle activity of the logged in user.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/x-ndjson": { + "schema": { + "$ref": "#/components/schemas/PuzzleRoundJson" + } + } + } + } + } + } + }, + "/api/puzzle/dashboard/{days}": { + "get": { + "operationId": "apiPuzzleDashboard", + "summary": "Get your puzzle dashboard", + "description": "Download your [puzzle dashboard](https://lichess.org/training/dashboard/30/dashboard) as JSON.\nAlso includes all puzzle themes played, with aggregated results.\nAllows re-creating the [improvement/strengths](https://lichess.org/training/dashboard/30/improvementAreas) interfaces.\n", + "tags": [ + "Puzzles" + ], + "security": [ + { + "OAuth2": [ + "puzzle:read" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "days", + "required": true, + "description": "How many days to look back when aggregating puzzle results. 30 is sensible.", + "schema": { + "type": "integer", + "minimum": 1 + } + } + ], + "responses": { + "200": { + "description": "The puzzle dashboard of the logged in user.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PuzzleDashboardJson" + } + } + } + } + } + } + }, + "/api/storm/dashboard/{username}": { + "get": { + "operationId": "apiStormDashboard", + "summary": "Get the storm dashboard of a player", + "description": "Download the [storm dashboard](https://lichess.org/storm/dashboard/mrbasso) of any player as JSON.\nContains the aggregated highscores, and the history of storm runs aggregated by days.\nUse `?days=0` if you only care about the highscores.\n", + "tags": [ + "Puzzles" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "username", + "description": "Username of the player", + "schema": { + "type": "string" + }, + "required": true + }, + { + "in": "query", + "name": "days", + "description": "How many days of history to return", + "schema": { + "type": "integer", + "minimum": 0, + "maximum": 365, + "default": 30 + } + } + ], + "responses": { + "200": { + "description": "The storm dashboard of a player.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StormDashboardJson" + } + } + } + } + } + } + }, + "/api/racer": { + "post": { + "operationId": "racerPost", + "summary": "Create and join a puzzle race", + "description": "Create a new private [puzzle race](https://lichess.org/racer).\nThe Lichess user who creates the race must join the race page,\nand manually start the race when enough players have joined.\n- <https://lichess.org/racer>\n", + "tags": [ + "Puzzles" + ], + "security": [ + { + "OAuth2": [ + "racer:write" + ] + } + ], + "responses": { + "200": { + "description": "The new puzzle race.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PuzzleRaceJson" + } + } + } + } + } + } + }, + "/api/users": { + "post": { + "operationId": "apiUsers", + "summary": "Get users by ID", + "tags": [ + "Users" + ], + "security": [], + "description": "Get up to 300 users by their IDs. Users are returned in the same order as the IDs.\nThe method is `POST` to allow a longer list of IDs to be sent in the request body.\nPlease do not try to download all the Lichess users with this endpoint, or any other endpoint.\nAn API is not a way to fully export a website. We do not provide a full download of the Lichess users.\nThis endpoint is limited to 8,000 users every 10 minutes, and 120,000 every day.\n", + "requestBody": { + "description": "User IDs separated by commas.", + "required": true, + "content": { + "text/plain": { + "schema": { + "type": "string" + }, + "example": "aliquantus,chess-network,lovlas" + } + } + }, + "responses": { + "200": { + "description": "The list of users.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + } + } + } + } + } + } + } + }, + "/api/account": { + "get": { + "operationId": "accountMe", + "summary": "Get my profile", + "description": "Public information about the logged in user.\n", + "tags": [ + "Account" + ], + "security": [ + { + "OAuth2": [] + } + ], + "responses": { + "200": { + "description": "The public information about the logged in user.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserExtended" + } + } + } + } + } + } + }, + "/api/account/email": { + "get": { + "operationId": "accountEmail", + "summary": "Get my email address", + "description": "Read the email address of the logged in user.\n", + "tags": [ + "Account" + ], + "security": [ + { + "OAuth2": [ + "email:read" + ] + } + ], + "responses": { + "200": { + "description": "The email address of the logged in user.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "email": { + "type": "string" + } + }, + "example": { + "email": "abathur@mail.org" + } + } + } + } + } + } + } + }, + "/api/account/preferences": { + "get": { + "operationId": "account", + "summary": "Get my preferences", + "description": "Read the preferences of the logged in user.\n- <https://lichess.org/account/preferences/game-display>\n- <https://github.com/ornicar/lila/blob/master/modules/pref/src/main/Pref.scala>\n", + "tags": [ + "Account" + ], + "security": [ + { + "OAuth2": [ + "preference:read" + ] + } + ], + "responses": { + "200": { + "description": "The preferences of the logged in user.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "prefs": { + "$ref": "#/components/schemas/UserPreferences" + }, + "language": { + "type": "string", + "example": "en-GB" + } + } + } + } + } + } + } + } + }, + "/api/account/kid": { + "get": { + "operationId": "accountKid", + "summary": "Get my kid mode status", + "description": "Read the kid mode status of the logged in user.\n- <https://lichess.org/account/kid>\n", + "tags": [ + "Account" + ], + "security": [ + { + "OAuth2": [ + "preference:read" + ] + } + ], + "responses": { + "200": { + "description": "The kid mode status of the logged in user.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "kid": { + "type": "boolean" + } + }, + "example": { + "kid": false + } + } + } + } + } + } + }, + "post": { + "operationId": "accountKidPost", + "summary": "Set my kid mode status", + "description": "Set the kid mode status of the logged in user.\n- <https://lichess.org/account/kid>\n", + "tags": [ + "Account" + ], + "security": [ + { + "OAuth2": [ + "preference:write" + ] + } + ], + "parameters": [ + { + "in": "query", + "name": "v", + "required": true, + "description": "Kid mode status", + "schema": { + "type": "boolean" + }, + "example": true + } + ], + "responses": { + "200": { + "description": "The kid mode status was set successfully for the logged in user.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + } + } + } + }, + "/api/timeline": { + "get": { + "operationId": "timeline", + "summary": "Get my timeline", + "description": "Get the timeline events of the logged in user.\n", + "tags": [ + "Account" + ], + "security": [ + { + "OAuth2": [] + } + ], + "parameters": [ + { + "in": "query", + "name": "since", + "description": "Show events since this timestamp.", + "schema": { + "type": "integer", + "minimum": 1356998400070 + } + }, + { + "in": "query", + "name": "nb", + "description": "Max number of events to fetch.", + "schema": { + "type": "integer", + "default": 15, + "minimum": 1, + "maximum": 30 + } + } + ], + "responses": { + "200": { + "description": "The events in the timeline of the logged in user.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Timeline" + } + } + } + } + } + } + }, + "/game/export/{gameId}": { + "get": { + "operationId": "gamePgn", + "summary": "Export one game", + "description": "Download one game in either PGN or JSON format.\nOngoing 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.\n", + "tags": [ + "Games" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "gameId", + "description": "The game ID (8 characters).", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "moves", + "description": "Include the PGN moves.", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "pgnInJson", + "description": "Include the full PGN within the JSON response, in a `pgn` field.", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "tags", + "description": "Include the PGN tags.", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "clocks", + "description": "Include clock status when available.\nEither as PGN comments: `2. exd5 { [%clk 1:01:27] } e5 { [%clk 1:01:28] }`\nOr in a `clocks` JSON field, as centisecond integers, depending on the response type.\n", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "evals", + "description": "Include analysis evaluations and comments, when available.\nEither as PGN comments: `12. Bxf6 { [%eval 0.23] } a3 { [%eval -1.09] }`\nOr in an `analysis` JSON field, depending on the response type.\n", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "accuracy", + "description": "Include [accuracy percent](https://lichess.org/page/accuracy) of each player, when available.\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "opening", + "description": "Include the opening name.\nExample: `[Opening \"King's Gambit Accepted, King's Knight Gambit\"]`\n", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "division", + "description": "Plies which mark the beginning of the middlegame and endgame.\nOnly available in JSON\n", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "literate", + "description": "Insert textual annotations in the PGN about the opening, analysis variations, mistakes, and game termination.\nExample: `5... g4? { (-0.98 → 0.60) Mistake. Best move was h6. } (5... h6 6. d4 Ne7 7. g3 d5 8. exd5 fxg3 9. hxg3 c6 10. dxc6)`\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "players", + "description": "URL of a text file containing real names and ratings, to replace Lichess usernames and ratings in the PGN.\nExample: <https://gist.githubusercontent.com/ornicar/6bfa91eb61a2dcae7bcd14cce1b2a4eb/raw/768b9f6cc8a8471d2555e47ba40fb0095e5fba37/gistfile1.txt>\n", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The game representation.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/x-chess-pgn": { + "schema": { + "$ref": "#/components/schemas/GamePgn" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/GameJson" + } + } + } + } + } + } + }, + "/api/user/{username}/current-game": { + "get": { + "operationId": "apiUserCurrentGame", + "summary": "Export ongoing game of a user", + "description": "Download the ongoing game, or the last game played, of a user.\nAvailable in either PGN or JSON format.\nOngoing 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.\n", + "tags": [ + "Games" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "username", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "moves", + "description": "Include the PGN moves.", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "pgnInJson", + "description": "Include the full PGN within the JSON response, in a `pgn` field.", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "tags", + "description": "Include the PGN tags.", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "clocks", + "description": "Include clock status when available.\nEither as PGN comments: `2. exd5 { [%clk 1:01:27] } e5 { [%clk 1:01:28] }`\nOr in a `clocks` JSON field, as centisecond integers, depending on the response type.\n", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "evals", + "description": "Include analysis evaluations and comments, when available.\nEither as PGN comments: `12. Bxf6 { [%eval 0.23] } a3 { [%eval -1.09] }`\nOr in an `analysis` JSON field, depending on the response type.\n", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "accuracy", + "description": "Include [accuracy percent](https://lichess.org/page/accuracy) of each player, when available.\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "opening", + "description": "Include the opening name.\nExample: `[Opening \"King's Gambit Accepted, King's Knight Gambit\"]`\n", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "division", + "description": "Plies which mark the beginning of the middlegame and endgame.\nOnly available in JSON\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "literate", + "description": "Insert textual annotations in the PGN about the opening, analysis variations, mistakes, and game termination.\nExample: `5... g4? { (-0.98 → 0.60) Mistake. Best move was h6. } (5... h6 6. d4 Ne7 7. g3 d5 8. exd5 fxg3 9. hxg3 c6 10. dxc6)`\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "players", + "description": "URL of a text file containing real names and ratings, to replace Lichess usernames and ratings in the PGN.\nExample: <https://gist.githubusercontent.com/ornicar/6bfa91eb61a2dcae7bcd14cce1b2a4eb/raw/768b9f6cc8a8471d2555e47ba40fb0095e5fba37/gistfile1.txt>\n", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The ongoing (or last) game of a user.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/x-chess-pgn": { + "schema": { + "$ref": "#/components/schemas/GamePgn" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/GameJson" + } + } + } + } + } + } + }, + "/api/games/user/{username}": { + "get": { + "operationId": "apiGamesUser", + "summary": "Export games of a user", + "description": "Download all games of any user in PGN or [ndjson](#section/Introduction/Streaming-with-ND-JSON) format.\nGames are sorted by reverse chronological order (most recent first).\nWe recommend streaming the response, for it can be very long.\n<https://lichess.org/@/german11> for instance has more than 500,000 games.\nThe game stream is throttled, depending on who is making the request:\n - Anonymous request: 20 games per second\n - [OAuth2 authenticated](#section/Introduction/Authentication) request: 30 games per second\n - Authenticated, downloading your own games: 60 games per second\n", + "tags": [ + "Games" + ], + "security": [ + { + "OAuth2": [] + } + ], + "parameters": [ + { + "in": "path", + "name": "username", + "description": "The user name.", + "schema": { + "type": "string" + }, + "required": true + }, + { + "in": "query", + "name": "since", + "description": "Download games played since this timestamp. Defaults to account creation date.", + "schema": { + "type": "integer", + "minimum": 1356998400070 + } + }, + { + "in": "query", + "name": "until", + "description": "Download games played until this timestamp. Defaults to now.", + "schema": { + "type": "integer", + "minimum": 1356998400070 + } + }, + { + "in": "query", + "name": "max", + "description": "How many games to download. Leave empty to download all games.", + "schema": { + "type": "integer", + "minimum": 1 + } + }, + { + "in": "query", + "name": "vs", + "description": "[Filter] Only games played against this opponent", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "rated", + "description": "[Filter] Only rated (`true`) or casual (`false`) games", + "schema": { + "type": "boolean" + } + }, + { + "in": "query", + "name": "perfType", + "description": "[Filter] Only games in these speeds or variants.\n \nMultiple perf types can be specified, separated by a comma.\n \nExample: blitz,rapid,classical", + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/PerfType" + }, + { + "default": null + } + ] + } + }, + { + "in": "query", + "name": "color", + "description": "[Filter] Only games played as this color.", + "schema": { + "type": "string", + "enum": [ + "white", + "black" + ] + } + }, + { + "in": "query", + "name": "analysed", + "description": "[Filter] Only games with or without a computer analysis available", + "schema": { + "type": "boolean" + } + }, + { + "in": "query", + "name": "moves", + "description": "Include the PGN moves.", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "pgnInJson", + "description": "Include the full PGN within the JSON response, in a `pgn` field. The response type must be set to `application/x-ndjson` by the request `Accept` header.", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "tags", + "description": "Include the PGN tags.", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "clocks", + "description": "Include clock status when available.\nEither as PGN comments: `2. exd5 { [%clk 1:01:27] } e5 { [%clk 1:01:28] }`\nOr in a `clocks` JSON field, as centisecond integers, depending on the response type.\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "evals", + "description": "Include analysis evaluations and comments, when available.\nEither as PGN comments: `12. Bxf6 { [%eval 0.23] } a3 { [%eval -1.09] }`\nOr in an `analysis` JSON field, depending on the response type.\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "accuracy", + "description": "Include [accuracy percent](https://lichess.org/page/accuracy) of each player, when available.\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "opening", + "description": "Include the opening name.\nExample: `[Opening \"King's Gambit Accepted, King's Knight Gambit\"]`\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "division", + "description": "Plies which mark the beginning of the middlegame and endgame.\nOnly available in JSON\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "ongoing", + "description": "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.", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "finished", + "description": "Include finished games. Set to `false` to only get ongoing games.", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "literate", + "description": "Insert textual annotations in the PGN about the opening, analysis variations, mistakes, and game termination.\nExample: `5... g4? { (-0.98 → 0.60) Mistake. Best move was h6. } (5... h6 6. d4 Ne7 7. g3 d5 8. exd5 fxg3 9. hxg3 c6 10. dxc6)`\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "lastFen", + "description": "Include the FEN notation of the last position of the game.\nThe response type must be set to `application/x-ndjson` by the request `Accept` header.\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "players", + "description": "URL of a text file containing real names and ratings, to replace Lichess usernames and ratings in the PGN.\nExample: <https://gist.githubusercontent.com/ornicar/6bfa91eb61a2dcae7bcd14cce1b2a4eb/raw/768b9f6cc8a8471d2555e47ba40fb0095e5fba37/gistfile1.txt>\n", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "sort", + "description": "Sort order of the games.", + "schema": { + "type": "string", + "default": "dateDesc", + "enum": [ + "dateAsc", + "dateDesc" + ] + } + } + ], + "responses": { + "200": { + "description": "The games of the user.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/x-chess-pgn": { + "schema": { + "$ref": "#/components/schemas/GamePgn" + } + }, + "application/x-ndjson": { + "schema": { + "$ref": "#/components/schemas/GameJson" + } + } + } + } + } + } + }, + "/api/games/export/_ids": { + "post": { + "operationId": "gamesExportIds", + "summary": "Export games by IDs", + "description": "Download games by IDs in PGN or [ndjson](#section/Introduction/Streaming-with-ND-JSON) format, depending on the request `Accept` header.\nGames are sorted by reverse chronological order (most recent first)\nThe method is `POST` so a longer list of IDs can be sent in the request body.\n300 IDs can be submitted.\nOngoing 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.\n", + "tags": [ + "Games" + ], + "security": [], + "requestBody": { + "description": "Game IDs separated by commas. Up to 300.", + "required": true, + "content": { + "text/plain": { + "schema": { + "type": "string" + }, + "example": "TJxUmbWK,4OtIh2oh,ILwozzRZ" + } + } + }, + "parameters": [ + { + "in": "query", + "name": "moves", + "description": "Include the PGN moves.", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "pgnInJson", + "description": "Include the full PGN within the JSON response, in a `pgn` field.", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "tags", + "description": "Include the PGN tags.", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "clocks", + "description": "Include clock status when available.\nEither as PGN comments: `2. exd5 { [%clk 1:01:27] } e5 { [%clk 1:01:28] }`\nOr in a `clocks` JSON field, as centisecond integers, depending on the response type.\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "evals", + "description": "Include analysis evaluations and comments, when available.\nEither as PGN comments: `12. Bxf6 { [%eval 0.23] } a3 { [%eval -1.09] }`\nOr in an `analysis` JSON field, depending on the response type.\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "accuracy", + "description": "Include [accuracy percent](https://lichess.org/page/accuracy) of each player, when available.\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "opening", + "description": "Include the opening name.\nExample: `[Opening \"King's Gambit Accepted, King's Knight Gambit\"]`\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "division", + "description": "Plies which mark the beginning of the middlegame and endgame.\nOnly available in JSON\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "literate", + "description": "Insert textual annotations in the PGN about the opening, analysis variations, mistakes, and game termination.\nExample: `5... g4? { (-0.98 → 0.60) Mistake. Best move was h6. } (5... h6 6. d4 Ne7 7. g3 d5 8. exd5 fxg3 9. hxg3 c6 10. dxc6)`\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "players", + "description": "URL of a text file containing real names and ratings, to replace Lichess usernames and ratings in the PGN.\nExample: <https://gist.githubusercontent.com/ornicar/6bfa91eb61a2dcae7bcd14cce1b2a4eb/raw/768b9f6cc8a8471d2555e47ba40fb0095e5fba37/gistfile1.txt>\n", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The representation of the games.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/x-chess-pgn": { + "schema": { + "$ref": "#/components/schemas/GamePgn" + } + }, + "application/x-ndjson": { + "schema": { + "$ref": "#/components/schemas/GameJson" + } + } + } + } + } + } + }, + "/api/stream/games-by-users": { + "post": { + "operationId": "gamesByUsers", + "summary": "Stream games of users", + "description": "Stream the games played between a list of users, in real time.\nOnly games where **both players** are part of the list are included.\nThe stream emits an event each time a game is started or finished.\nTo also get all current ongoing games at the beginning of the stream, use the `withCurrentGames` flag.\nGames are streamed as [ndjson](#section/Introduction/Streaming-with-ND-JSON).\nMaximum number of users: 300.\nThe method is `POST` so a longer list of IDs can be sent in the request body.\n", + "tags": [ + "Games" + ], + "security": [], + "requestBody": { + "description": "Up to 300 user IDs separated by commas.\nExample: `aliquantus,chess-network,lovlas`\n", + "required": true, + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + } + }, + "parameters": [ + { + "in": "query", + "name": "withCurrentGames", + "description": "Include the already started games at the beginning of the stream.", + "schema": { + "type": "boolean", + "default": false + } + } + ], + "responses": { + "200": { + "description": "The stream of the games played between the users.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/x-ndjson": { + "schema": { + "$ref": "#/components/schemas/GameStream" + } + } + } + } + } + } + }, + "/api/stream/games/{streamId}": { + "post": { + "operationId": "gamesByIds", + "summary": "Stream games by IDs", + "description": "Creates a stream of games from an arbitrary streamId, and a list of game IDs.\nThe stream first outputs the games that already exists, then emits an event each time a game is started or finished.\nGames are streamed as [ndjson](#section/Introduction/Streaming-with-ND-JSON).\nMaximum number of games: 500 for anonymous requests, or 1000 for [OAuth2 authenticated](#section/Introduction/Authentication) requests.\nWhile the stream is open, it is possible to [add new game IDs to watch](#operation/gamesByIdsAdd).\n", + "tags": [ + "Games" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "streamId", + "schema": { + "type": "string", + "description": "Arbitrary stream ID that you can later use to add game IDs to the stream.", + "example": "myAppName-someRandomId" + }, + "required": true + } + ], + "requestBody": { + "description": "Up to 500 or 1000 game IDs separated by commas.\nExample: `gameId01,gameId02,gameId03`\n", + "required": true, + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + } + }, + "responses": { + "200": { + "description": "The stream of the games matching the requested IDs.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/x-ndjson": { + "schema": { + "$ref": "#/components/schemas/GameStream" + } + } + } + } + } + } + }, + "/api/stream/games/{streamId}/add": { + "post": { + "operationId": "gamesByIdsAdd", + "summary": "Add game IDs to stream", + "description": "Add new game IDs for [an existing stream](#operation/gamesByIds) to watch.\nThe stream will immediately outputs the games that already exists, then emit an event each time a game is started or finished.\n", + "tags": [ + "Games" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "streamId", + "schema": { + "type": "string", + "description": "The stream ID you used to [create the stream](#operation/gamesByIds).", + "example": "myAppName-someRandomId" + }, + "required": true + } + ], + "requestBody": { + "description": "Up to 500 or 1000 game IDs separated by commas.\nExample: `gameId04,gameId05,gameId06`\n", + "required": true, + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + } + }, + "responses": { + "200": { + "description": "The game IDs have been added to the stream.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + } + } + } + }, + "/api/account/playing": { + "get": { + "operationId": "apiAccountPlaying", + "summary": "Get my ongoing games", + "description": "Get the ongoing games of the current user.\nReal-time and correspondence games are included.\nThe most urgent games are listed first.\n", + "tags": [ + "Games" + ], + "security": [ + { + "OAuth2": [] + } + ], + "parameters": [ + { + "in": "query", + "name": "nb", + "description": "Max number of games to fetch", + "schema": { + "type": "integer", + "default": 9, + "minimum": 1, + "maximum": 50 + } + } + ], + "responses": { + "200": { + "description": "The ongoing games of the logged in user.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "example": { + "nowPlaying": [ + { + "gameId": "rCRw1AuO", + "fullId": "rCRw1AuOvonq", + "color": "black", + "fen": "r1bqkbnr/pppp2pp/2n1pp2/8/8/3PP3/PPPB1PPP/RN1QKBNR w KQkq - 2 4", + "hasMoved": true, + "isMyTurn": false, + "lastMove": "b8c6", + "opponent": { + "id": "philippe", + "rating": 1790, + "username": "Philippe" + }, + "perf": "correspondence", + "rated": false, + "secondsLeft": 1209600, + "source": "friend", + "speed": "correspondence", + "variant": { + "key": "standard", + "name": "Standard" + } + } + ] + } + } + } + } + } + } + } + }, + "/api/stream/game/{id}": { + "get": { + "operationId": "streamGame", + "summary": "Stream moves of a game", + "description": "Stream positions and moves of any ongoing game, in [ndjson](#section/Introduction/Streaming-with-ND-JSON).\nA description of the game is sent as a first message.\nThen a message is sent each time a move is played.\nFinally a description of the game is sent when it finishes, and the stream is closed.\nOngoing 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.\nNo more than 8 game streams can be opened at the same time from the same IP address.\n", + "tags": [ + "Games" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "example": "LuGQwhBb" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The stream of the game moves.", + "content": { + "application/x-ndjson": { + "schema": { + "$ref": "#/components/schemas/MoveStream" + } + } + } + } + } + } + }, + "/api/import": { + "post": { + "operationId": "gameImport", + "summary": "Import one game", + "description": "Import a game from PGN. See <https://lichess.org/paste>.\nRate limiting: 200 games per hour for OAuth requests, 100 games per hour for anonymous requests.\nTo broadcast ongoing games, consider [pushing to a broadcast instead](#operation/broadcastPush).\nTo analyse a position or a line, just construct an analysis board URL:\n[https://lichess.org/analysis/pgn/e4_e5_Nf3_Nc6_Bc4_Bc5_Bxf7+](https://lichess.org/analysis/pgn/e4_e5_Nf3_Nc6_Bc4_Bc5_Bxf7+)\n", + "tags": [ + "Games" + ], + "security": [ + { + "OAuth2": [] + } + ], + "requestBody": { + "description": "A single game to import", + "required": true, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "pgn": { + "type": "string", + "description": "The PGN. It can contain only one game. Most standard tags are supported." + } + } + } + } + } + }, + "responses": { + "200": { + "description": "The game was successfully imported.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "example": { + "id": "R6iLjwz5", + "url": "https://lichess.org/R6iLjwz5" + } + } + } + } + } + } + } + }, + "/api/games/export/imports": { + "get": { + "operationId": "apiImportedGamesUser", + "summary": "Export your imported games", + "description": "Download all games imported by you. Games are exported in PGN format.", + "tags": [ + "Games" + ], + "security": [ + { + "OAuth2": [] + } + ], + "responses": { + "200": { + "description": "Imported games in PGN format", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/x-chess-pgn": { + "schema": { + "$ref": "#/components/schemas/GamePgn" + } + } + } + } + } + } + }, + "/api/tv/channels": { + "get": { + "operationId": "tvChannels", + "summary": "Get current TV games", + "description": "Get basic info about the best games being played for each speed and variant,\nbut also computer games and bot games.\nSee [lichess.org/tv](https://lichess.org/tv).\n", + "tags": [ + "TV" + ], + "security": [], + "responses": { + "200": { + "description": "The list of games being played for each speed and variant.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "example": { + "bot": { + "user": { + "id": "leelachess", + "name": "LeelaChess", + "title": "BOT" + }, + "rating": 2660, + "gameId": "Zznv9MIl", + "color": "black" + }, + "blitz": { + "user": { + "id": "lekkerkortook", + "name": "LekkerKortOok" + }, + "rating": 2603, + "gameId": "hTJ4v7Mp", + "color": "black" + }, + "racingKings": { + "user": { + "id": "chesslo21", + "name": "chesslo21" + }, + "rating": 2123, + "gameId": "lgCDl5Of", + "color": "white" + }, + "ultraBullet": { + "user": { + "id": "farmville", + "name": "Farmville" + }, + "rating": 2338, + "gameId": "NEY6OQ32", + "color": "white" + }, + "bullet": { + "user": { + "id": "nurmibrah", + "name": "nurmiBrah" + }, + "rating": 2499, + "gameId": "5LgyE516", + "color": "black" + }, + "classical": { + "user": { + "id": "holden_m_j_thomas", + "name": "Holden_M_J_Thomas" + }, + "rating": 1806, + "gameId": "k3oLby6N", + "color": "white" + }, + "threeCheck": { + "user": { + "id": "pepellou", + "name": "pepellou", + "patron": true + }, + "rating": 1978, + "gameId": "Og5RCvmu", + "color": "black" + }, + "antichess": { + "user": { + "id": "maria-bakkar", + "name": "maria-bakkar" + }, + "rating": 2103, + "gameId": "toCr41yx", + "color": "black" + }, + "computer": { + "user": { + "id": "oh_my_goat_im_so_bat", + "name": "oh_my_goat_Im_so_bat" + }, + "rating": 2314, + "gameId": "TkI4qZxu", + "color": "black" + }, + "horde": { + "user": { + "id": "habitualchess", + "name": "HabitualChess" + }, + "rating": 1803, + "gameId": "oMofN63H", + "color": "white" + }, + "rapid": { + "user": { + "id": "denpayd", + "name": "DenpaYD" + }, + "rating": 2289, + "gameId": "IcWOl8ee" + }, + "atomic": { + "user": { + "id": "meetyourdemise", + "name": "MeetYourDemise" + }, + "rating": 2210, + "gameId": "tvMxtCMN", + "color": "white" + }, + "crazyhouse": { + "user": { + "id": "mathace", + "name": "mathace" + }, + "rating": 2397, + "gameId": "i3gTZlUb", + "color": "black" + }, + "chess960": { + "user": { + "id": "voja_7", + "name": "voja_7" + }, + "rating": 1782, + "gameId": "lrXLcedu", + "color": "white" + }, + "kingOfTheHill": { + "user": { + "id": "nadime", + "name": "Nadime" + }, + "rating": 1500, + "gameId": "DsQn8aEV", + "color": "white" + }, + "topRated": { + "user": { + "id": "lekkerkortook", + "name": "LekkerKortOok" + }, + "rating": 2603, + "gameId": "hTJ4v7Mp", + "color": "black" + } + } + } + } + } + } + } + } + }, + "/api/tv/feed": { + "get": { + "operationId": "tvFeed", + "summary": "Stream current TV game", + "description": "Stream positions and moves of the current [TV game](https://lichess.org/tv) in [ndjson](#section/Introduction/Streaming-with-ND-JSON).\nA summary of the game is sent as a first message, and when the featured game changes.\nTry it with `curl https://lichess.org/api/tv/feed`.\n", + "tags": [ + "TV" + ], + "security": [], + "responses": { + "200": { + "description": "The stream of the current TV game.", + "content": { + "application/x-ndjson": { + "schema": { + "$ref": "#/components/schemas/TvFeed" + }, + "examples": { + "first line": { + "$ref": "#/components/examples/tvFeedFirst" + }, + "subsequent lines": { + "$ref": "#/components/examples/tvFeedFen" + } + } + } + } + } + } + } + }, + "/api/tv/{channel}/feed": { + "get": { + "operationId": "tvChannelFeed", + "summary": "Stream current TV game of a TV channel", + "description": "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).\nA summary of the game is sent as a first message, and when the featured game changes.\nTry it with `curl https://lichess.org/api/tv/rapid/feed`.\n", + "tags": [ + "TV" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "channel", + "description": "The name of the channel in camel case.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The stream of the current TV game of a TV channel.", + "content": { + "application/x-ndjson": { + "schema": { + "$ref": "#/components/schemas/TvFeed" + }, + "examples": { + "first line": { + "$ref": "#/components/examples/tvFeedFirst" + }, + "subsequent lines": { + "$ref": "#/components/examples/tvFeedFen" + } + } + } + } + } + } + } + }, + "/api/tv/{channel}": { + "get": { + "operationId": "tvChannelGames", + "summary": "Get best ongoing games of a TV channel", + "description": "Get a list of ongoing games for a given TV channel. Similar to [lichess.org/games](https://lichess.org/games).\nAvailable in PGN or [ndjson](#section/Introduction/Streaming-with-ND-JSON) format, depending on the request `Accept` header.\n", + "tags": [ + "TV" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "channel", + "description": "The name of the channel in camel case.", + "schema": { + "type": "string" + }, + "required": true + }, + { + "in": "query", + "name": "nb", + "description": "Number of games to fetch.", + "schema": { + "type": "number", + "default": 10, + "minimum": 1, + "maximum": 30 + } + }, + { + "in": "query", + "name": "moves", + "description": "Include the PGN moves.", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "pgnInJson", + "description": "Include the full PGN within the JSON response, in a `pgn` field.", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "tags", + "description": "Include the PGN tags.", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "clocks", + "description": "Include clock status when available.\nEither as PGN comments: `2. exd5 { [%clk 1:01:27] } e5 { [%clk 1:01:28] }`\nOr in a `clocks` JSON field, as centisecond integers, depending on the response type.\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "opening", + "description": "Include the opening name.\nExample: `[Opening \"King's Gambit Accepted, King's Knight Gambit\"]`\n", + "schema": { + "type": "boolean", + "default": false + } + } + ], + "responses": { + "200": { + "description": "The representation of the games.", + "content": { + "application/x-chess-pgn": { + "schema": { + "$ref": "#/components/schemas/GamePgn" + } + }, + "application/x-ndjson": { + "schema": { + "$ref": "#/components/schemas/GameJson" + } + } + } + } + } + } + }, + "/api/tournament": { + "get": { + "operationId": "apiTournament", + "summary": "Get current tournaments", + "description": "Get recently finished, ongoing, and upcoming tournaments.\nThis API is used to display the [Lichess tournament schedule](https://lichess.org/tournament).\n", + "tags": [ + "Arena tournaments" + ], + "security": [], + "responses": { + "200": { + "description": "The list of current tournaments.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ArenaTournaments" + } + } + } + } + } + }, + "post": { + "operationId": "apiTournamentPost", + "summary": "Create a new Arena tournament", + "description": "Create a public or private Arena tournament.\nThis endpoint mirrors the form on <https://lichess.org/tournament/new>.\nYou can create up to 12 public tournaments per day, or 24 private tournaments.\nA team battle can be created by specifying the `teamBattleByTeam` argument.\nAdditional restrictions:\n - clockTime + clockIncrement > 0\n - 15s and 0+1 variant tournaments cannot be rated\n - Clock time in comparison to tournament length must be reasonable: 3 <= (minutes * 60) / (96 * clockTime + 48 * clockIncrement + 15) <= 150\n", + "tags": [ + "Arena tournaments" + ], + "security": [ + { + "OAuth2": [ + "tournament:write" + ] + } + ], + "requestBody": { + "description": "Parameters of the tournament", + "required": true, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The tournament name. Leave empty to get a random Grandmaster name", + "minLength": 2, + "maxLength": 30 + }, + "clockTime": { + "type": "number", + "description": "Clock initial time in minutes", + "example": 2, + "enum": [ + 0, + 0.25, + 0.5, + 0.75, + 1, + 1.5, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 10, + 15, + 20, + 25, + 30, + 40, + 50, + 60 + ] + }, + "clockIncrement": { + "type": "integer", + "description": "Clock increment in seconds", + "example": 1, + "enum": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 10, + 15, + 20, + 25, + 30, + 40, + 50, + 60 + ] + }, + "minutes": { + "type": "integer", + "description": "How long the tournament lasts, in minutes", + "example": 60, + "enum": [ + 20, + 25, + 30, + 35, + 40, + 45, + 50, + 55, + 60, + 70, + 80, + 90, + 100, + 110, + 120, + 150, + 180, + 210, + 240, + 270, + 300, + 330, + 360, + 420, + 480, + 540, + 600, + 720 + ] + }, + "waitMinutes": { + "type": "integer", + "description": "How long to wait before starting the tournament, from now, in minutes", + "default": 5, + "enum": [ + 1, + 2, + 3, + 5, + 10, + 15, + 20, + 30, + 45, + 60 + ] + }, + "startDate": { + "type": "integer", + "description": "Timestamp (in milliseconds) to start the tournament at a given date and time. Overrides the `waitMinutes` setting" + }, + "variant": { + "$ref": "#/components/schemas/VariantKey" + }, + "rated": { + "type": "boolean", + "description": "Games are rated and impact players ratings", + "default": true + }, + "position": { + "$ref": "#/components/schemas/FromPositionFEN" + }, + "berserkable": { + "type": "boolean", + "description": "Whether the players can use berserk. Only allowed if clockIncrement <= clockTime * 2", + "default": true + }, + "streakable": { + "type": "boolean", + "description": "After 2 wins, consecutive wins grant 4 points instead of 2.", + "default": true + }, + "hasChat": { + "type": "boolean", + "description": "Whether the players can discuss in a chat", + "default": true + }, + "description": { + "type": "string", + "description": "Anything you want to tell players about the tournament" + }, + "password": { + "type": "string", + "description": "Make the tournament private, and restrict access with a password.\nYou can also [generate user-specific entry codes](https://github.com/lichess-org/api/tree/master/example/tournament-entry-code)\nbased on this password.\n" + }, + "teamBattleByTeam": { + "type": "string", + "description": "Set the ID of a team you lead to create a team battle.\nThe other teams can be added using the [team battle edit endpoint](#operation/apiTournamentTeamBattlePost).\n" + }, + "conditions.teamMember.teamId": { + "type": "string", + "description": "Restrict entry to members of a team.\nThe teamId is the last part of a team URL, e.g. `https://lichess.org/team/coders` has teamId = `coders`.\nLeave empty to let everyone join the tournament.\nDo not use this to create team battles, use `teamBattleByTeam` instead.\n" + }, + "conditions.minRating.rating": { + "type": "integer", + "description": "Minimum rating to join. Leave empty to let everyone join the tournament.", + "enum": [ + 1000, + 1100, + 1200, + 1300, + 1400, + 1500, + 1600, + 1700, + 1800, + 1900, + 2000, + 2100, + 2200, + 2300, + 2400, + 2500, + 2600 + ] + }, + "conditions.maxRating.rating": { + "type": "integer", + "description": "Maximum rating to join. Based on best rating reached in the last 7 days. Leave empty to let everyone join the tournament.", + "enum": [ + 2200, + 2100, + 2000, + 1900, + 1800, + 1700, + 1600, + 1500, + 1400, + 1300, + 1200, + 1100, + 1000, + 900, + 800 + ] + }, + "conditions.nbRatedGame.nb": { + "type": "integer", + "description": "Minimum number of rated games required to join.", + "enum": [ + 0, + 5, + 10, + 15, + 20, + 30, + 40, + 50, + 75, + 100, + 150, + 200 + ] + }, + "conditions.allowList": { + "type": "string", + "description": "Predefined list of usernames that are allowed to join, separated by commas.\nIf this list is non-empty, then usernames absent from this list will be forbidden to join.\nAdding `%titled` to the list additionally allows any titled player to join.\nExample: `thibault,german11,%titled`\n" + } + }, + "required": [ + "clockTime", + "clockIncrement", + "minutes" + ] + } + } + } + }, + "responses": { + "200": { + "description": "The Arena tournament has been successfully created.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ArenaTournamentVariantIsKey" + } + } + } + }, + "400": { + "description": "The creation of the Arena tournament failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/tournament/{id}": { + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The tournament ID.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "get": { + "operationId": "tournament", + "summary": "Get info about an Arena tournament", + "description": "Get detailed info about recently finished, current, or upcoming tournament's duels, player standings, and other info.\n", + "tags": [ + "Arena tournaments" + ], + "security": [], + "parameters": [ + { + "in": "query", + "name": "page", + "description": "Specify which page of player standings to view.", + "schema": { + "type": "number", + "example": 1, + "default": 1, + "minimum": 1, + "maximum": 200 + } + } + ], + "responses": { + "200": { + "description": "The information of the Arena tournament.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ArenaTournamentVariantIsKey" + } + } + } + } + } + }, + "post": { + "operationId": "apiTournamentUpdate", + "summary": "Update an Arena tournament", + "description": "Update an Arena tournament.\nBe mindful not to make important changes to ongoing tournaments.\nCan be used to update a team battle.\nAdditional restrictions:\n - clockTime + clockIncrement > 0\n - 15s and 0+1 variant tournaments cannot be rated\n - Clock time in comparison to tournament length must be reasonable: 3 <= (minutes * 60) / (96 * clockTime + 48 * clockIncrement + 15) <= 150\n", + "tags": [ + "Arena tournaments" + ], + "security": [ + { + "OAuth2": [ + "tournament:write" + ] + } + ], + "requestBody": { + "description": "Parameters of the tournament", + "required": true, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The tournament name. Leave empty to get a random Grandmaster name", + "minLength": 2, + "maxLength": 30 + }, + "clockTime": { + "type": "number", + "description": "Clock initial time in minutes", + "example": 2, + "enum": [ + 0, + 0.25, + 0.5, + 0.75, + 1, + 1.5, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 10, + 15, + 20, + 25, + 30, + 40, + 50, + 60 + ] + }, + "clockIncrement": { + "type": "integer", + "description": "Clock increment in seconds", + "example": 1, + "enum": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 10, + 15, + 20, + 25, + 30, + 40, + 50, + 60 + ] + }, + "minutes": { + "type": "integer", + "description": "How long the tournament lasts, in minutes", + "example": 60, + "enum": [ + 20, + 25, + 30, + 35, + 40, + 45, + 50, + 55, + 60, + 70, + 80, + 90, + 100, + 110, + 120, + 150, + 180, + 210, + 240, + 270, + 300, + 330, + 360, + 420, + 480, + 540, + 600, + 720 + ] + }, + "waitMinutes": { + "type": "integer", + "description": "How long to wait before starting the tournament, from now, in minutes", + "default": 5, + "enum": [ + 1, + 2, + 3, + 5, + 10, + 15, + 20, + 30, + 45, + 60 + ] + }, + "startDate": { + "type": "integer", + "description": "Timestamp (in milliseconds) to start the tournament at a given date and time. Overrides the `waitMinutes` setting" + }, + "variant": { + "$ref": "#/components/schemas/VariantKey" + }, + "rated": { + "type": "boolean", + "description": "Games are rated and impact players ratings", + "default": true + }, + "position": { + "$ref": "#/components/schemas/FromPositionFEN" + }, + "berserkable": { + "type": "boolean", + "description": "Whether the players can use berserk. Only allowed if clockIncrement <= clockTime * 2", + "default": true + }, + "streakable": { + "type": "boolean", + "description": "After 2 wins, consecutive wins grant 4 points instead of 2.", + "default": true + }, + "hasChat": { + "type": "boolean", + "description": "Whether the players can discuss in a chat", + "default": true + }, + "description": { + "type": "string", + "description": "Anything you want to tell players about the tournament" + }, + "password": { + "type": "string", + "description": "Make the tournament private, and restrict access with a password" + }, + "conditions.minRating.rating": { + "type": "integer", + "description": "Minimum rating to join. Leave empty to let everyone join the tournament.", + "enum": [ + 1000, + 1100, + 1200, + 1300, + 1400, + 1500, + 1600, + 1700, + 1800, + 1900, + 2000, + 2100, + 2200, + 2300, + 2400, + 2500, + 2600 + ] + }, + "conditions.maxRating.rating": { + "type": "integer", + "description": "Maximum rating to join. Based on best rating reached in the last 7 days. Leave empty to let everyone join the tournament.", + "enum": [ + 2200, + 2100, + 2000, + 1900, + 1800, + 1700, + 1600, + 1500, + 1400, + 1300, + 1200, + 1100, + 1000, + 900, + 800 + ] + }, + "conditions.nbRatedGame.nb": { + "type": "integer", + "description": "Minimum number of rated games required to join.", + "enum": [ + 0, + 5, + 10, + 15, + 20, + 30, + 40, + 50, + 75, + 100, + 150, + 200 + ] + }, + "conditions.allowList": { + "type": "string", + "description": "Predefined list of usernames that are allowed to join, separated by commas.\nIf this list is non-empty, then usernames absent from this list will be forbidden to join.\nAdding `%titled` to the list additionally allows any titled player to join.\nExample: `thibault,german11,%titled`\n" + } + }, + "required": [ + "clockTime", + "clockIncrement", + "minutes" + ] + } + } + } + }, + "responses": { + "200": { + "description": "The Arena tournament was successfully updated.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ArenaTournamentVariantIsKey" + } + } + } + }, + "400": { + "description": "The update of the Arena tournament failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/tournament/{id}/join": { + "post": { + "operationId": "apiTournamentJoin", + "summary": "Join an Arena tournament", + "description": "Join an Arena tournament, possibly with a password and/or a team.\nAlso unpauses if you had previously [paused](#operation/apiTournamentWithdraw) the tournament.\n", + "tags": [ + "Arena tournaments" + ], + "security": [ + { + "OAuth2": [ + "tournament:write" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The tournament ID.", + "schema": { + "type": "string", + "example": "hL7vMrFQ" + }, + "required": true + } + ], + "requestBody": { + "description": "You may need these depending on the tournament to join", + "required": true, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "password": { + "type": "string", + "description": "The tournament password, if one is required.\nCan also be a [user-specific entry code](https://github.com/lichess-org/api/tree/master/example/tournament-entry-code)\ngenerated and shared by the organizer.\n" + }, + "team": { + "type": "string", + "description": "The team to join the tournament with, for team battle tournaments" + }, + "pairMeAsap": { + "type": "boolean", + "default": false, + "description": "If the tournament is started, attempt to pair the user,\neven if they are not connected to the tournament page.\nThis expires after one minute, to avoid pairing a user who is long gone.\nYou may call \"join\" again to extend the waiting.\n" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "The tournament was successfully joined.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + }, + "400": { + "description": "Joining the tournament failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/tournament/{id}/withdraw": { + "post": { + "operationId": "apiTournamentWithdraw", + "summary": "Pause or leave an Arena tournament", + "description": "Leave a future Arena tournament, or take a break on an ongoing Arena tournament.\nIt's possible to join again later. Points and streaks are preserved.\n", + "tags": [ + "Arena tournaments" + ], + "security": [ + { + "OAuth2": [ + "tournament:write" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The tournament ID.", + "schema": { + "type": "string", + "example": "hL7vMrFQ" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The tournament was successfully paused or left.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + }, + "400": { + "description": "Pausing/leaving the tournament failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/tournament/{id}/terminate": { + "post": { + "operationId": "apiTournamentTerminate", + "summary": "Terminate an Arena tournament", + "description": "Terminate an Arena tournament\n", + "tags": [ + "Arena tournaments" + ], + "security": [ + { + "OAuth2": [ + "tournament:write" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The tournament ID.", + "schema": { + "type": "string", + "example": "hL7vMrFQ" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The tournament was successfully terminated.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + }, + "400": { + "description": "Terminating the tournament failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/tournament/team-battle/{id}": { + "post": { + "operationId": "apiTournamentTeamBattlePost", + "summary": "Update a team battle", + "description": "Set the teams and number of leaders of a team battle.\nTo update the other attributes of a team battle, use the [tournament update endpoint](#operation/apiTournamentUpdate).\n", + "tags": [ + "Arena tournaments" + ], + "security": [ + { + "OAuth2": [ + "tournament:write" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The tournament ID (8 characters)..", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "teams": { + "type": "string", + "description": "All team IDs of the team battle, separated by commas.\nMake sure to always send the full list.\nTeams that are not in the list will be removed from the team battle.\nExample: `coders,zhigalko_sergei-fan-club,hhSwTKZv`\n" + }, + "nbLeaders": { + "type": "integer", + "description": "Number team leaders per team." + } + }, + "required": [ + "teams", + "nbLeaders" + ] + } + } + } + }, + "responses": { + "200": { + "description": "The team battle tournament was successfully updated.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ArenaTournamentVariantIsKey" + } + } + } + }, + "400": { + "description": "The update of the team battle tournament failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/tournament/{id}/games": { + "get": { + "operationId": "gamesByTournament", + "summary": "Export games of an Arena tournament", + "description": "Download games of a tournament in PGN or [ndjson](#section/Introduction/Streaming-with-ND-JSON) format.\nGames are sorted by reverse chronological order (most recent first).\nThe game stream is throttled, depending on who is making the request:\n - Anonymous request: 20 games per second\n - [OAuth2 authenticated](#section/Introduction/Authentication) request: 30 games per second\n", + "tags": [ + "Arena tournaments" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The tournament ID.", + "schema": { + "type": "string" + }, + "required": true + }, + { + "in": "query", + "name": "player", + "description": "Only games of a particular player. Leave empty to fetch games of all players.", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "moves", + "description": "Include the PGN moves.", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "pgnInJson", + "description": "Include the full PGN within the JSON response, in a `pgn` field.", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "tags", + "description": "Include the PGN tags.", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "clocks", + "description": "Include clock status when available.\nEither as PGN comments: `2. exd5 { [%clk 1:01:27] } e5 { [%clk 1:01:28] }`\nOr in a `clocks` JSON field, as centisecond integers, depending on the response type.\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "evals", + "description": "Include analysis evaluations and comments, when available.\nEither as PGN comments: `12. Bxf6 { [%eval 0.23] } a3 { [%eval -1.09] }`\nOr in an `analysis` JSON field, depending on the response type.\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "accuracy", + "description": "Include [accuracy percent](https://lichess.org/page/accuracy) of each player, when available.\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "opening", + "description": "Include the opening name.\nExample: `[Opening \"King's Gambit Accepted, King's Knight Gambit\"]`\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "division", + "description": "Plies which mark the beginning of the middlegame and endgame.\nOnly available in JSON\n", + "schema": { + "type": "boolean", + "default": false + } + } + ], + "responses": { + "200": { + "description": "The list of games of an Arena tournament.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/x-chess-pgn": { + "schema": { + "$ref": "#/components/schemas/GamePgn" + } + }, + "application/x-ndjson": { + "schema": { + "$ref": "#/components/schemas/GameJson" + } + } + } + } + } + } + }, + "/api/tournament/{id}/results": { + "get": { + "operationId": "resultsByTournament", + "summary": "Get results of an Arena tournament", + "description": "Players of an Arena tournament, with their score and performance, sorted by rank (best first).\n**Players are streamed as [ndjson](#section/Introduction/Streaming-with-ND-JSON)**, i.e. one JSON object per line.\nIf called on an ongoing tournament, results can be inconsistent\ndue to ranking changes while the players are being streamed.\nUse on finished tournaments for guaranteed consistency.\n", + "tags": [ + "Arena tournaments" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The tournament ID.", + "schema": { + "type": "string" + }, + "required": true + }, + { + "in": "query", + "name": "nb", + "description": "Max number of players to fetch", + "schema": { + "type": "integer", + "minimum": 1 + } + }, + { + "in": "query", + "name": "sheet", + "description": "Add a `sheet` field to the player document.\nIt's an expensive server computation that slows down the stream.\n", + "schema": { + "type": "boolean", + "default": false + } + } + ], + "responses": { + "200": { + "description": "The results of the Arena tournament.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/x-ndjson": { + "schema": { + "example": { + "rank": 4, + "score": 389, + "rating": 2618, + "username": "opperwezen", + "title": "IM", + "performance": 2423, + "team": "coders" + } + } + } + } + } + } + } + }, + "/api/tournament/{id}/teams": { + "get": { + "operationId": "teamsByTournament", + "summary": "Get team standing of a team battle", + "description": "Teams of a team battle tournament, with top players, sorted by rank (best first).\n", + "tags": [ + "Arena tournaments" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The tournament ID.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The list of teams of a team battle tournament, with their respective top players.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "example": { + "id": "CdPg1ey4", + "teams": [ + { + "rank": 1, + "id": "cat-lovers", + "score": 842, + "players": [ + { + "user": { + "name": "lizen69", + "id": "lizen69" + }, + "score": 54 + }, + { + "user": { + "name": "lizen249", + "id": "lizen249" + } + } + ] + } + ] + } + } + } + } + } + } + } + }, + "/api/user/{username}/tournament/created": { + "get": { + "operationId": "apiUserNameTournamentCreated", + "summary": "Get tournaments created by a user", + "description": "Get all tournaments created by a given user.\nTournaments are sorted by reverse chronological order of start date (last starting first).\nTournaments are streamed as [ndjson](#section/Introduction/Streaming-with-ND-JSON).\n", + "tags": [ + "Arena tournaments" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "username", + "description": "The user whose created tournaments to fetch", + "schema": { + "type": "string" + }, + "required": true + }, + { + "in": "query", + "name": "status", + "description": "Include tournaments in the given status: \"Created\" (10), \"Started\" (20), \"Finished\" (30)\nYou can add this parameter more than once to include tournaments in different statuses.\nExample: `?status=10&status=20`\n", + "schema": { + "type": "integer", + "enum": [ + 10, + 20, + 30 + ] + }, + "required": false + } + ], + "responses": { + "200": { + "description": "The list of tournaments created by the user.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/x-ndjson": { + "schema": { + "$ref": "#/components/schemas/ArenaTournament" + } + } + } + } + } + } + }, + "/api/swiss/new/{teamId}": { + "post": { + "operationId": "apiSwissNew", + "summary": "Create a new Swiss tournament", + "description": "Create a Swiss tournament for your team.\nThis endpoint mirrors the Swiss tournament form from your team pagee.\nYou can create up to 12 tournaments per day.\nAdditional restrictions:\n - clock.limit + clock.increment > 0\n - 15s and 0+1 variant tournaments cannot be rated\n", + "tags": [ + "Swiss tournaments" + ], + "security": [ + { + "OAuth2": [ + "tournament:write" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "teamId", + "description": "ID of the team", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "description": "Parameters of the tournament", + "required": true, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The tournament name. Leave empty to get a random Grandmaster name", + "minLength": 2, + "maxLength": 30 + }, + "clock.limit": { + "type": "number", + "description": "Clock initial time in seconds", + "example": 300, + "enum": [ + 0, + 15, + 30, + 45, + 60, + 90, + 120, + 180, + 240, + 300, + 360, + 420, + 480, + 600, + 900, + 1200, + 1500, + 1800, + 2400, + 3000, + 3600, + 4200, + 4800, + 5400, + 6000, + 6600, + 7200, + 7800, + 8400, + 9000, + 9600, + 10200, + 10800 + ] + }, + "clock.increment": { + "type": "integer", + "description": "Clock increment in seconds", + "example": 1, + "minimum": 0, + "maximum": 120 + }, + "nbRounds": { + "type": "integer", + "description": "Maximum number of rounds to play", + "minimum": 3, + "maximum": 100 + }, + "startsAt": { + "type": "integer", + "description": "Timestamp in milliseconds to start the tournament at a given date and time. By default, it starts 10 minutes after creation." + }, + "roundInterval": { + "type": "integer", + "description": "How long to wait between each round, in seconds.\nSet to 99999999 to manually schedule each round from the tournament UI.\nIf empty or -1, a sensible value is picked automatically.\n", + "enum": [ + -1, + 5, + 10, + 20, + 30, + 45, + 60, + 120, + 180, + 300, + 600, + 900, + 1200, + 1800, + 2700, + 3600, + 86400, + 172800, + 604800, + 99999999 + ] + }, + "variant": { + "$ref": "#/components/schemas/VariantKey" + }, + "position": { + "$ref": "#/components/schemas/FromPositionFEN" + }, + "description": { + "type": "string", + "description": "Anything you want to tell players about the tournament" + }, + "rated": { + "type": "boolean", + "description": "Games are rated and impact players ratings", + "default": true + }, + "password": { + "type": "string", + "description": "Make the tournament private and restrict access with a password." + }, + "forbiddenPairings": { + "type": "string", + "description": "Usernames of players that must not play together.\nTwo usernames per line, separated by a space.\n" + }, + "manualPairings": { + "type": "string", + "description": "Manual pairings for the next round.\nTwo usernames per line, separated by a space. Example:\n```\nPlayerA PlayerB\nPlayerC PlayerD\n```\nTo give a bye (1 point) to a player instead of a pairing, add a line like so:\n```\nPlayerE 1\n```\nMissing players will be considered absent and get zero points.\n" + }, + "chatFor": { + "type": "number", + "description": "Who can read and write in the chat.\n- 0 = No-one\n- 10 = Only team leaders\n- 20 = Only team members\n- 30 = All Lichess players\n", + "default": 20 + }, + "conditions.minRating.rating": { + "type": "integer", + "description": "Minimum rating to join. Leave empty to let everyone join the tournament.", + "enum": [ + 1000, + 1100, + 1200, + 1300, + 1400, + 1500, + 1600, + 1700, + 1800, + 1900, + 2000, + 2100, + 2200, + 2300, + 2400, + 2500, + 2600 + ] + }, + "conditions.maxRating.rating": { + "type": "integer", + "description": "Maximum rating to join. Based on best rating reached in the last 7 days. Leave empty to let everyone join the tournament.", + "enum": [ + 2200, + 2100, + 2000, + 1900, + 1800, + 1700, + 1600, + 1500, + 1400, + 1300, + 1200, + 1100, + 1000, + 900, + 800 + ] + }, + "conditions.nbRatedGame.nb": { + "type": "integer", + "description": "Minimum number of rated games required to join.", + "minimum": 0, + "maximum": 200 + }, + "conditions.playYourGames": { + "type": "boolean", + "description": "Only let players join if they have played their last swiss game.\nIf they failed to show up in a recent swiss event, they won't be able to enter yours.\nThis results in a better swiss experience for the players who actually show up.\n", + "default": false + }, + "conditions.allowList": { + "type": "string", + "description": "Predefined list of usernames that are allowed to join, separated by commas.\nIf this list is non-empty, then usernames absent from this list will be forbidden to join.\nAdding `%titled` to the list additionally allows any titled player to join.\nExample: `thibault,german11,%titled`\n" + } + }, + "required": [ + "clock.limit", + "clock.increment", + "nbRounds" + ] + } + } + } + }, + "responses": { + "200": { + "description": "The Swiss tournament was successfully created.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SwissTournament" + } + } + } + }, + "400": { + "description": "The creation of the Swiss tournament failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/swiss/{id}": { + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The Swiss tournament ID.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "get": { + "operationId": "swiss", + "summary": "Get info about a Swiss tournament", + "description": "Get detailed info about a Swiss tournament.\n", + "tags": [ + "Swiss tournaments" + ], + "security": [], + "responses": { + "200": { + "description": "The information of the Swiss tournament.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SwissTournament" + } + } + } + } + } + } + }, + "/api/swiss/{id}/edit": { + "post": { + "operationId": "apiSwissUpdate", + "summary": "Update a Swiss tournament", + "description": "Update a Swiss tournament.\nBe mindful not to make important changes to ongoing tournaments.\nAdditional restrictions:\n - clock.limit + clock.increment > 0\n - 15s and 0+1 variant tournaments cannot be rated\n", + "tags": [ + "Swiss tournaments" + ], + "security": [ + { + "OAuth2": [ + "tournament:write" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The tournament ID.", + "schema": { + "type": "string", + "example": "hL7vMrFQ" + }, + "required": true + } + ], + "requestBody": { + "description": "Parameters of the tournament", + "required": true, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The tournament name. Leave empty to get a random Grandmaster name", + "minLength": 2, + "maxLength": 30 + }, + "clock.limit": { + "type": "number", + "description": "Clock initial time in seconds", + "example": 300, + "enum": [ + 0, + 15, + 30, + 45, + 60, + 90, + 120, + 180, + 240, + 300, + 360, + 420, + 480, + 600, + 900, + 1200, + 1500, + 1800, + 2400, + 3000, + 3600, + 4200, + 4800, + 5400, + 6000, + 6600, + 7200, + 7800, + 8400, + 9000, + 9600, + 10200, + 10800 + ] + }, + "clock.increment": { + "type": "integer", + "description": "Clock increment in seconds", + "example": 1, + "minimum": 0, + "maximum": 120 + }, + "nbRounds": { + "type": "integer", + "description": "Maximum number of rounds to play", + "minimum": 3, + "maximum": 100 + }, + "startsAt": { + "type": "integer", + "description": "Timestamp in milliseconds to start the tournament at a given date and time. By default, it starts 10 minutes after creation." + }, + "roundInterval": { + "type": "integer", + "description": "How long to wait between each round, in seconds.\nSet to 99999999 to manually schedule each round from the tournament UI, or [with the API](#tag/Swiss-tournaments/operation/apiSwissScheduleNextRound).\nIf empty or -1, a sensible value is picked automatically.\n", + "enum": [ + -1, + 5, + 10, + 20, + 30, + 45, + 60, + 120, + 180, + 300, + 600, + 900, + 1200, + 1800, + 2700, + 3600, + 86400, + 172800, + 604800, + 99999999 + ] + }, + "variant": { + "$ref": "#/components/schemas/VariantKey" + }, + "description": { + "type": "string", + "description": "Anything you want to tell players about the tournament" + }, + "rated": { + "type": "boolean", + "description": "Games are rated and impact players ratings", + "default": true + }, + "password": { + "type": "string", + "description": "Make the tournament private and restrict access with a password." + }, + "forbiddenPairings": { + "type": "string", + "description": "Usernames of players that must not play together.\nTwo usernames per line, separated by a space.\n" + }, + "manualPairings": { + "type": "string", + "description": "Manual pairings for the next round.\nTwo usernames per line, separated by a space.\nPresent players without a valid pairing will be given a bye, which is worth 1 point.\nForfeited players will get 0 points.\n" + }, + "chatFor": { + "type": "number", + "description": "Who can read and write in the chat.\n- 0 = No-one\n- 10 = Only team leaders\n- 20 = Only team members\n- 30 = All Lichess players\n", + "default": 20 + }, + "conditions.minRating.rating": { + "type": "integer", + "description": "Minimum rating to join. Leave empty to let everyone join the tournament.", + "enum": [ + 1000, + 1100, + 1200, + 1300, + 1400, + 1500, + 1600, + 1700, + 1800, + 1900, + 2000, + 2100, + 2200, + 2300, + 2400, + 2500, + 2600 + ] + }, + "conditions.maxRating.rating": { + "type": "integer", + "description": "Maximum rating to join. Based on best rating reached in the last 7 days. Leave empty to let everyone join the tournament.", + "enum": [ + 2200, + 2100, + 2000, + 1900, + 1800, + 1700, + 1600, + 1500, + 1400, + 1300, + 1200, + 1100, + 1000, + 900, + 800 + ] + }, + "conditions.nbRatedGame.nb": { + "type": "integer", + "description": "Minimum number of rated games required to join.", + "minimum": 0, + "maximum": 200 + }, + "conditions.playYourGames": { + "type": "boolean", + "description": "Only let players join if they have played their last swiss game.\nIf they failed to show up in a recent swiss event, they won't be able to enter yours.\nThis results in a better swiss experience for the players who actually show up.\n", + "default": false + }, + "conditions.allowList": { + "type": "string", + "description": "Predefined list of usernames that are allowed to join, separated by commas.\nIf this list is non-empty, then usernames absent from this list will be forbidden to join.\nAdding `%titled` to the list additionally allows any titled player to join.\nExample: `thibault,german11,%titled`\n" + } + }, + "required": [ + "clock.limit", + "clock.increment", + "nbRounds" + ] + } + } + } + }, + "responses": { + "200": { + "description": "The Swiss tournament was successfully updated.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SwissTournament" + } + } + } + }, + "400": { + "description": "Updating the swiss failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "This user cannot update this Swiss.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SwissUnauthorisedEdit" + } + } + } + } + } + } + }, + "/api/swiss/{id}/schedule-next-round": { + "post": { + "operationId": "apiSwissScheduleNextRound", + "summary": "Manually schedule the next round", + "description": "Manually schedule the next round date and time of a Swiss tournament.\nThis sets the `roundInterval` field to `99999999`, i.e. manual scheduling.\nAll further rounds will need to be manually scheduled, unless the `roundInterval` field is changed back to automatic scheduling.\n", + "tags": [ + "Swiss tournaments" + ], + "security": [ + { + "OAuth2": [ + "tournament:write" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The tournament ID.", + "schema": { + "type": "string", + "example": "hL7vMrFQ" + }, + "required": true + } + ], + "requestBody": { + "description": "Parameters of the tournament", + "required": true, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "date": { + "type": "integer", + "description": "Timestamp in milliseconds to start the next round at a given date and time." + } + } + } + } + } + }, + "responses": { + "204": { + "description": "The Swiss tournament was successfully updated.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + } + }, + "400": { + "description": "Updating the swiss failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "401": { + "description": "This user cannot update this Swiss.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SwissUnauthorisedEdit" + } + } + } + } + } + } + }, + "/api/swiss/{id}/join": { + "post": { + "operationId": "apiSwissJoin", + "summary": "Join a Swiss tournament", + "description": "Join a Swiss tournament, possibly with a password.\n", + "tags": [ + "Swiss tournaments" + ], + "security": [ + { + "OAuth2": [ + "tournament:write" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The tournament ID.", + "schema": { + "type": "string", + "example": "hL7vMrFQ" + }, + "required": true + } + ], + "requestBody": { + "description": "You may need these depending on the tournament to join", + "required": true, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "password": { + "type": "string", + "description": "The tournament password, if one is required" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "The tournament was successfully joined.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + }, + "400": { + "description": "Joining the tournament failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/swiss/{id}/withdraw": { + "post": { + "operationId": "apiSwissWithdraw", + "summary": "Pause or leave a swiss tournament", + "description": "Leave a future Swiss tournament, or take a break on an ongoing Swiss tournament.\nIt's possible to join again later. Points are preserved.\n", + "tags": [ + "Swiss tournaments" + ], + "security": [ + { + "OAuth2": [ + "tournament:write" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The tournament ID.", + "schema": { + "type": "string", + "example": "hL7vMrFQ" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The tournament was successfully paused or left.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + } + } + } + }, + "/api/swiss/{id}/terminate": { + "post": { + "operationId": "apiSwissTerminate", + "summary": "Terminate a Swiss tournament", + "description": "Terminate a Swiss tournament\n", + "tags": [ + "Swiss tournaments" + ], + "security": [ + { + "OAuth2": [ + "tournament:write" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The Swiss tournament ID.", + "schema": { + "type": "string", + "example": "W5FrxusN" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The Swiss tournament was successfully terminated.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + }, + "400": { + "description": "Terminating the Swiss tournament failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/swiss/{id}.trf": { + "get": { + "operationId": "swissTrf", + "summary": "Export TRF of a Swiss tournament", + "description": "Download a tournament in the Tournament Report File format, the FIDE standard.\nDocumentation: <https://www.fide.com/FIDE/handbook/C04Annex2_TRF16.pdf>\nExample: <https://lichess.org/swiss/j8rtJ5GL.trf>\n", + "tags": [ + "Swiss tournaments" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The tournament ID.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The TRF representation of a Swiss tournament.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + } + } + } + } + }, + "/api/swiss/{id}/games": { + "get": { + "operationId": "gamesBySwiss", + "summary": "Export games of a Swiss tournament", + "description": "Download games of a swiss tournament in PGN or [ndjson](#section/Introduction/Streaming-with-ND-JSON) format.\nGames are sorted by reverse chronological order (last round first).\nThe game stream is throttled, depending on who is making the request:\n - Anonymous request: 20 games per second\n - [OAuth2 authenticated](#section/Introduction/Authentication) request: 30 games per second\n", + "tags": [ + "Swiss tournaments" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The tournament ID.", + "schema": { + "type": "string" + }, + "required": true + }, + { + "in": "query", + "name": "player", + "description": "Only the games played by a given player", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "moves", + "description": "Include the PGN moves.", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "pgnInJson", + "description": "Include the full PGN within the JSON response, in a `pgn` field.", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "tags", + "description": "Include the PGN tags.", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "clocks", + "description": "Include clock status when available.\nEither as PGN comments: `2. exd5 { [%clk 1:01:27] } e5 { [%clk 1:01:28] }`\nOr in a `clocks` JSON field, as centisecond integers, depending on the response type.\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "evals", + "description": "Include analysis evaluations and comments, when available.\nEither as PGN comments: `12. Bxf6 { [%eval 0.23] } a3 { [%eval -1.09] }`\nOr in an `analysis` JSON field, depending on the response type.\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "accuracy", + "description": "Include [accuracy percent](https://lichess.org/page/accuracy) of each player, when available.\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "opening", + "description": "Include the opening name.\nExample: `[Opening \"King's Gambit Accepted, King's Knight Gambit\"]`\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "division", + "description": "Plies which mark the beginning of the middlegame and endgame.\nOnly available in JSON\n", + "schema": { + "type": "boolean", + "default": false + } + } + ], + "responses": { + "200": { + "description": "The list of games of a Swiss tournament.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/x-chess-pgn": { + "schema": { + "$ref": "#/components/schemas/GamePgn" + } + }, + "application/x-ndjson": { + "schema": { + "$ref": "#/components/schemas/GameJson" + } + } + } + } + } + } + }, + "/api/swiss/{id}/results": { + "get": { + "operationId": "resultsBySwiss", + "summary": "Get results of a swiss tournament", + "description": "Players of a swiss tournament, with their score and performance, sorted by rank (best first).\nPlayers are streamed as [ndjson](#section/Introduction/Streaming-with-ND-JSON).\nIf called on an ongoing tournament, results can be inconsistent\ndue to ranking changes while the players are being streamed.\nUse on finished tournaments for guaranteed consistency.\n", + "tags": [ + "Swiss tournaments" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "id", + "description": "The tournament ID.", + "schema": { + "type": "string" + }, + "required": true + }, + { + "in": "query", + "name": "nb", + "description": "Max number of players to fetch", + "schema": { + "type": "integer", + "minimum": 1 + } + } + ], + "responses": { + "200": { + "description": "The results of a Swiss tournament.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/x-ndjson": { + "schema": { + "example": { + "rank": 4, + "points": 8.5, + "tieBreak": 77, + "rating": 2618, + "username": "opperwezen", + "title": "IM", + "performance": 2423 + } + } + } + } + } + } + } + }, + "/api/team/{teamId}/swiss": { + "get": { + "operationId": "apiTeamSwiss", + "summary": "Get team swiss tournaments", + "description": "Get all swiss tournaments of a team.\nTournaments are sorted by reverse chronological order of start date (last starting first).\nTournaments are streamed as [ndjson](#section/Introduction/Streaming-with-ND-JSON).\n", + "tags": [ + "Teams", + "Swiss tournaments" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "teamId", + "schema": { + "type": "string" + }, + "required": true, + "example": "coders" + }, + { + "in": "query", + "name": "max", + "description": "How many tournaments to download.", + "schema": { + "type": "integer", + "minimum": 1, + "default": 100 + } + } + ], + "responses": { + "200": { + "description": "The list of Swiss tournaments of a team.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/nd-json": { + "schema": { + "$ref": "#/components/schemas/SwissTournament" + } + } + } + } + } + } + }, + "/api/study/{studyId}/{chapterId}.pgn": { + "get": { + "operationId": "studyChapterPgn", + "summary": "Export one study chapter", + "description": "Download one study chapter in PGN format.\n", + "tags": [ + "Studies" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "studyId", + "description": "The study ID (8 characters).", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "chapterId", + "description": "The chapter ID (8 characters).", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "clocks", + "description": "Include clock comments in the PGN moves, when available.\nExample: `2. exd5 { [%clk 1:01:27] } e5 { [%clk 1:01:28] }`\n", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "comments", + "description": "Include analysis and annotator comments in the PGN moves, when available.\nExample: `12. Bxf6 { [%eval 0.23] } a3 { White is in a pickle. }`\n", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "variations", + "description": "Include non-mainline moves, when available.\nExample: `4. d4 Bb4+ (4... Nc6 5. Nf3 Bb4+ 6. Bd2 (6. Nbd2 O-O 7. O-O) 6... Bd6) 5. Nd2`\n", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "source", + "description": "Add a `Source` PGN tag with the study chapter URL.\nExample: `[Source \"https://lichess.org/study/4NBHImfM/1Tk4IyTz\"]`\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "orientation", + "description": "Add a `Orientation` PGN tag with the chapter predefined orientation.\nExample: `[Orientation \"white\"]`\n", + "schema": { + "type": "boolean", + "default": false + } + } + ], + "responses": { + "200": { + "description": "The chapter of the study.", + "content": { + "application/x-chess-pgn": { + "schema": { + "$ref": "#/components/schemas/StudyPgn" + } + } + } + } + } + } + }, + "/api/study/{studyId}.pgn": { + "get": { + "operationId": "studyAllChaptersPgn", + "summary": "Export all chapters", + "description": "Download all chapters of a study in PGN format.\n", + "tags": [ + "Studies" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "studyId", + "description": "The study ID (8 characters).", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "clocks", + "description": "Include clock comments in the PGN moves, when available.\nExample: `2. exd5 { [%clk 1:01:27] } e5 { [%clk 1:01:28] }`\n", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "comments", + "description": "Include analysis and annotator comments in the PGN moves, when available.\nExample: `12. Bxf6 { [%eval 0.23] } a3 { White is in a pickle. }`\n", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "variations", + "description": "Include non-mainline moves, when available.\nExample: `4. d4 Bb4+ (4... Nc6 5. Nf3 Bb4+ 6. Bd2 (6. Nbd2 O-O 7. O-O) 6... Bd6) 5. Nd2`\n", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "source", + "description": "Add a `Source` PGN tag with the study chapter URL.\nExample: `[Source \"https://lichess.org/study/4NBHImfM/1Tk4IyTz\"]`\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "orientation", + "description": "Add a `Orientation` PGN tag with the chapter predefined orientation.\nExample: `[Orientation \"white\"]`\n", + "schema": { + "type": "boolean", + "default": false + } + } + ], + "responses": { + "200": { + "description": "The PGN representation of the study.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + }, + "Last-Modified": { + "schema": { + "type": "string", + "example": "Tue, 25 Apr 2023 13:23:09 GMT" + } + } + }, + "content": { + "application/x-chess-pgn": { + "schema": { + "$ref": "#/components/schemas/StudyPgn" + } + } + } + } + } + }, + "head": { + "operationId": "studyAllChaptersHead", + "summary": "Study metadata", + "description": "Only get the study headers, including `Last-Modified`.\n", + "tags": [ + "Studies" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "studyId", + "description": "The study ID (8 characters).", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The study headers.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + }, + "Last-Modified": { + "schema": { + "type": "string", + "example": "Tue, 25 Apr 2023 13:23:09 GMT" + } + } + } + } + } + } + }, + "/api/study/{studyId}/import-pgn": { + "post": { + "operationId": "apiStudyImportPGN", + "summary": "Import PGN into a study", + "description": "Imports arbitrary PGN into an existing [study](https://lichess.org/study). Creates a new chapter in the study.\nIf the PGN contains multiple games (separated by 2 or more newlines)\nthen multiple chapters will be created within the study.\nNote that a study can contain at most 64 chapters.\n", + "tags": [ + "Studies" + ], + "security": [ + { + "OAuth2": [ + "study:write" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "studyId", + "description": "ID of the study", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "description": "Parameters of the import", + "required": true, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the new chapter.\nIf multiple chapters are created, the names will be infered from the PGN tags.\n", + "minLength": 1, + "maxLength": 100 + }, + "pgn": { + "type": "string", + "description": "PGN to import. Can contain multiple games separated by 2 or more newlines.\n" + }, + "orientation": { + "type": "string", + "description": "Default board orientation.", + "enum": [ + "white", + "black" + ], + "default": "white" + }, + "variant": { + "$ref": "#/components/schemas/VariantKey" + } + }, + "required": [ + "name", + "pgn" + ] + } + } + } + }, + "responses": { + "200": { + "description": "The chapters that were created.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StudyImportPgnChapters" + } + } + } + }, + "400": { + "description": "The creation of the chapter(s) failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/study/by/{username}/export.pgn": { + "get": { + "operationId": "studyExportAllPgn", + "summary": "Export all studies of a user", + "description": "Download all chapters of all studies of a user in PGN format.\nIf authenticated, then all public, unlisted, and private studies are included.\nIf not, only public (non-unlisted) studies are included.\n", + "tags": [ + "Studies" + ], + "security": [ + { + "OAuth2": [ + "study:read" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "username", + "description": "The user whose studies we export", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "clocks", + "description": "Include clock comments in the PGN moves, when available.\nExample: `2. exd5 { [%clk 1:01:27] } e5 { [%clk 1:01:28] }`\n", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "comments", + "description": "Include analysis and annotator comments in the PGN moves, when available.\nExample: `12. Bxf6 { [%eval 0.23] } a3 { White is in a pickle. }`\n", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "variations", + "description": "Include non-mainline moves, when available.\nExample: `4. d4 Bb4+ (4... Nc6 5. Nf3 Bb4+ 6. Bd2 (6. Nbd2 O-O 7. O-O) 6... Bd6) 5. Nd2`\n", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "in": "query", + "name": "source", + "description": "Add a `Source` PGN tag with the study chapter URL.\nExample: `[Source \"https://lichess.org/study/4NBHImfM/1Tk4IyTz\"]`\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "orientation", + "description": "Add a `Orientation` PGN tag with the chapter predefined orientation.\nExample: `[Orientation \"white\"]`\n", + "schema": { + "type": "boolean", + "default": false + } + } + ], + "responses": { + "200": { + "description": "The studies of the user.", + "content": { + "application/x-chess-pgn": { + "schema": { + "$ref": "#/components/schemas/StudyPgn" + } + } + } + } + } + } + }, + "/api/study/by/{username}": { + "get": { + "operationId": "studyListMetadata", + "summary": "List studies of a user", + "description": "Get metadata (name and dates) of all studies of a user.\nIf authenticated, then all public, unlisted, and private studies are included.\nIf not, only public (non-unlisted) studies are included.\nStudies are streamed as [ndjson](#section/Introduction/Streaming-with-ND-JSON).\n", + "tags": [ + "Studies" + ], + "security": [ + { + "OAuth2": [ + "study:read" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "username", + "description": "The user whose studies we list", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The list of studies.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/x-ndjson": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/StudyMetadata" + } + } + } + } + } + } + } + }, + "/api/study/{studyId}/{chapterId}": { + "delete": { + "operationId": "apiStudyStudyIdChapterIdDelete", + "summary": "Delete a study chapter", + "tags": [ + "Studies" + ], + "security": [ + { + "OAuth2": [ + "study:write" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "studyId", + "description": "The study ID (8 characters).", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "chapterId", + "description": "The chapter ID (8 characters).", + "required": true, + "schema": { + "type": "string" + } + } + ], + "description": "Delete a chapter of a study you own. This is definitive.\nA study must have at least one chapter; so if you delete the last chapter,\nan empty one will be automatically created to replace it.\n", + "responses": { + "204": { + "description": "Chapter successfully deleted", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + } + } + } + } + }, + "/api/broadcast": { + "get": { + "operationId": "broadcastIndex", + "summary": "Get official broadcasts", + "description": "Get all incoming, ongoing, and finished official broadcasts.\nThe broadcasts are sorted by start date, most recent first.\nBroadcasts are streamed as [ndjson](#section/Introduction/Streaming-with-ND-JSON).\n", + "tags": [ + "Broadcasts" + ], + "security": [], + "parameters": [ + { + "in": "query", + "name": "nb", + "description": "Max number of broadcasts to fetch", + "schema": { + "type": "integer", + "default": 20, + "minimum": 1 + } + } + ], + "responses": { + "200": { + "description": "The list of official broadcasts.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/x-ndjson": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BroadcastTour" + } + } + } + } + } + } + } + }, + "/broadcast/new": { + "post": { + "operationId": "broadcastTourCreate", + "summary": "Create a broadcast tournament", + "description": "Create a new broadcast tournament to relay external games.\nThis endpoint accepts the same form data as the [web form](https://lichess.org/broadcast/new).\n", + "tags": [ + "Broadcasts" + ], + "security": [ + { + "OAuth2": [ + "study:write" + ] + } + ], + "requestBody": { + "required": true, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/BroadcastForm" + } + } + } + }, + "responses": { + "200": { + "description": "The broadcast tournament was successfully created.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BroadcastTour" + } + } + } + }, + "400": { + "description": "The creation of the broadcast tournament failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/broadcast/{broadcastTournamentId}": { + "get": { + "operationId": "broadcastTourGet", + "summary": "Get a broadcast tournament", + "description": "Get information about a broadcast tournament.\n", + "tags": [ + "Broadcasts" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "broadcastTournamentId", + "description": "The broadcast tournament ID (8 characters).", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The information about the broadcast tournament.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BroadcastTour" + } + } + } + } + } + } + }, + "/broadcast/{broadcastTournamentId}/leaderboard": { + "get": { + "operationId": "broadcastLeaderboardGet", + "summary": "Get a broadcast leaderboard", + "description": "Get the leaderboard of a broadcast tournament, if available.\n", + "tags": [ + "Broadcasts" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "broadcastTournamentId", + "description": "The broadcast tournament ID (8 characters).", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The broadcast leaderboard players", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BroadcastLeaderboardEntry" + } + } + } + } + } + } + } + }, + "/broadcast/{broadcastTournamentId}/edit": { + "post": { + "operationId": "broadcastTourUpdate", + "summary": "Update your broadcast tournament", + "description": "Update information about a broadcast tournament that you created.\nThis endpoint accepts the same form data as the web form.\nAll fields must be populated with data. Missing fields will override the broadcast with empty data.\n", + "tags": [ + "Broadcasts" + ], + "security": [ + { + "OAuth2": [ + "study:write" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "broadcastTournamentId", + "description": "The broadcast ID (8 characters).", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/BroadcastForm" + } + } + } + }, + "responses": { + "200": { + "description": "The broadcast tournament was successfully edited.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + }, + "400": { + "description": "The edition of the broadcast tournament failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/broadcast/{broadcastTournamentId}/new": { + "post": { + "operationId": "broadcastRoundCreate", + "summary": "Create a broadcast round", + "description": "Create a new broadcast round to relay external games.\nThis endpoint accepts the same form data as the web form.\n", + "tags": [ + "Broadcasts" + ], + "security": [ + { + "OAuth2": [ + "study:write" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "broadcastTournamentId", + "description": "The broadcast tournament ID (8 characters).", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the broadcast round. Length must be between 3 and 80 characters.\nExample: `Round 1`\n" + }, + "syncUrl": { + "type": "string", + "description": "URL that Lichess will poll to get updates about the games. It must be publicly accessible from the Internet.\nExample: `https://myserver.org/myevent/round-10/games.pgn`\nIf the syncUrl is missing, then the broadcast needs to be fed by [pushing PGN to it](#operation/broadcastPush).\n" + }, + "syncUrlRound": { + "type": "string", + "description": "Required if `syncUrl` contains a livechesscloud link.\n" + }, + "startsAt": { + "type": "integer", + "description": "Timestamp in milliseconds of broadcast round start. Leave empty to manually start the broadcast round.\nExample: `1356998400070`\n", + "minimum": 1356998400070 + }, + "delay": { + "type": "integer", + "description": "Delay in seconds for movements to appear on the broadcast. Leave it empty if you don't need it.\nExample: `900` (15 min)\n", + "minimum": 0, + "maximum": 1800 + }, + "period": { + "type": "integer", + "description": "(Only for Admins) Waiting time for each poll.\n", + "minimum": 2, + "maximum": 60 + }, + "finished": { + "type": "boolean", + "description": "Mark whether the round has been completed.\n", + "default": false + } + }, + "required": [ + "name" + ] + } + } + } + }, + "responses": { + "200": { + "description": "The broadcast round was successfully created.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BroadcastRound" + } + } + } + }, + "400": { + "description": "The creation of the broadcast failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/broadcast/{broadcastTournamentSlug}/{broadcastRoundSlug}/{broadcastRoundId}": { + "get": { + "operationId": "broadcastRoundGet", + "summary": "Get a broadcast round", + "description": "Get information about a broadcast round.\n", + "tags": [ + "Broadcasts" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "broadcastTournamentSlug", + "description": "The broadcast tournament slug. Only used for SEO, the slug can be safely replaced by `-`. Only the `broadcastRoundId` is actually used.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "broadcastRoundSlug", + "description": "The broadcast round slug. Only used for SEO, the slug can be safely replaced by `-`. Only the `broadcastRoundId` is actually used.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "broadcastRoundId", + "description": "The broadcast Round ID (8 characters).", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The information about the broadcast round.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BroadcastRound" + } + } + } + } + } + } + }, + "/broadcast/round/{broadcastRoundId}/edit": { + "post": { + "operationId": "broadcastRoundUpdate", + "summary": "Update your broadcast round", + "description": "Update information about a broadcast round that you created.\nThis endpoint accepts the same form data as the web form.\nAll fields must be populated with data. Missing fields will override the broadcast with empty data.\nFor instance, if you omit `startDate`, then any pre-existing start date will be removed.\n", + "tags": [ + "Broadcasts" + ], + "security": [ + { + "OAuth2": [ + "study:write" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "broadcastRoundId", + "description": "The broadcast round ID (8 characters).", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the broadcast round. Length must be between 3 and 80 characters.\nExample: `Round 10`\n" + }, + "syncUrl": { + "type": "string", + "description": "URL that Lichess will poll to get updates about the games. It must be publicly accessible from the Internet.\nExample: `https://myserver.org/myevent/round-10/games.pgn`\n" + }, + "syncUrlRound": { + "type": "string", + "description": "Required if `syncUrl` contains a livechesscloud link.\n" + }, + "startsAt": { + "type": "integer", + "description": "Timestamp in milliseconds of broadcast start. Leave empty to manually start the broadcast.\nExample: `1356998400070`\n", + "minimum": 1356998400070 + }, + "delay": { + "type": "integer", + "description": "Delay in seconds for movements to appear on the broadcast. Leave it empty if you don't need it.\nExample: `900` (15 min)\n", + "minimum": 0, + "maximum": 1800 + }, + "period": { + "type": "integer", + "description": "(Only for Admins) Waiting time for each poll.\n", + "minimum": 2, + "maximum": 60 + }, + "finished": { + "type": "boolean", + "description": "Mark whether the round has been completed.\n", + "default": false + } + }, + "required": [ + "name" + ] + } + } + } + }, + "responses": { + "200": { + "description": "The broadcast round was successfully edited.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + }, + "400": { + "description": "The edition of the broadcast tournament failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/broadcast/round/{broadcastRoundId}/push": { + "post": { + "operationId": "broadcastPush", + "summary": "Push PGN to your broadcast round", + "description": "Update your broadcast with new PGN.\nOnly for broadcast without a source URL.\n", + "tags": [ + "Broadcasts" + ], + "security": [ + { + "OAuth2": [ + "study:write" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "broadcastRoundId", + "description": "The broadcast round ID (8 characters).", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "The PGN. It can contain up to 64 games, separated by a double new line.", + "required": true, + "content": { + "text/plain": { + "schema": { + "type": "string" + }, + "examples": { + "broadcastPgnPushRequest": { + "$ref": "#/components/examples/broadcastPgnPushRequest" + } + } + } + } + }, + "responses": { + "200": { + "description": "The broadcast was successfully updated.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BroadcastPgnPush" + }, + "examples": { + "broadcastPgnPushResponse": { + "$ref": "#/components/examples/broadcastPgnPushResponse" + } + } + } + } + }, + "400": { + "description": "There was a problem with the pushed PGN.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "error": { + "type": "string" + } + }, + "example": { + "error": "Cannot parse moves" + } + } + } + } + } + } + } + }, + "/api/stream/broadcast/round/{broadcastRoundId}.pgn": { + "get": { + "operationId": "broadcastStreamRoundPgn", + "summary": "Stream an ongoing broadcast tournament as PGN", + "description": "This streaming endpoint first sends all games of a broadcast tournament in PGN format.\nThen, it waits for new moves to be played. As soon as it happens, the entire PGN of the game is sent to the stream.\nThe stream will also send PGNs when games are added to the tournament.\nThis is the best way to get updates about an ongoing tournament. Streaming means no polling,\nand no pollings means no latency, and minimum impact on the server.\n", + "tags": [ + "Broadcasts" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "broadcastRoundId", + "description": "The broadcast round ID (8 characters).", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The PGN representation of the tournament games, then the PGNs of games as they are updated.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/x-chess-pgn": { + "schema": { + "$ref": "#/components/schemas/StudyPgn" + } + } + } + } + } + } + }, + "/api/broadcast/round/{broadcastRoundId}.pgn": { + "get": { + "operationId": "broadcastRoundPgn", + "summary": "Export one round as PGN", + "description": "Download all games of a single round of a broadcast tournament in PGN format.\nYou *could* poll this endpoint to get updates about a tournament, but it would be slow,\nand very inefficient.\nInstead, consider [streaming the tournament](#operation/broadcastStreamRoundPgn) to get\na new PGN every time a game is updated, in real-time.\n", + "tags": [ + "Broadcasts" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "broadcastRoundId", + "description": "The round ID (8 characters).", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The PGN representation of the round.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/x-chess-pgn": { + "schema": { + "$ref": "#/components/schemas/StudyPgn" + } + } + } + } + } + } + }, + "/api/broadcast/{broadcastTournamentId}.pgn": { + "get": { + "operationId": "broadcastAllRoundsPgn", + "summary": "Export all rounds as PGN", + "description": "Download all games of all rounds of a broadcast in PGN format.\nIf a `study:read` [OAuth token](#tag/OAuth) is provided,\nthe private rounds where the user is a contributor will be available.\nYou may want to [download only the games of a single round](#operation/broadcastRoundPgn) instead.\n", + "tags": [ + "Broadcasts" + ], + "security": [ + { + "OAuth2": [ + "study:read" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "broadcastTournamentId", + "description": "The broadcast tournament ID (8 characters).", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The PGN representation of the broadcast.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/x-chess-pgn": { + "schema": { + "$ref": "#/components/schemas/StudyPgn" + } + } + } + } + } + } + }, + "/api/broadcast/my-rounds": { + "get": { + "operationId": "broadcastMyRoundsGet", + "summary": "Get your broadcast rounds", + "description": "Stream all broadcast rounds you are a member of.\nAlso includes broadcasts rounds you did not create, but were invited to.\nAlso includes broadcasts rounds where you're a non-writing member. See the `writeable` flag in the response.\nRounds are ordered by rank, which is roughly chronological, most recent first, slightly pondered with popularity.\n", + "tags": [ + "Broadcasts" + ], + "security": [ + { + "OAuth2": [ + "study:read" + ] + } + ], + "parameters": [ + { + "in": "query", + "name": "nb", + "description": "How many rounds to get", + "schema": { + "type": "integer", + "minimum": 1, + "example": 20 + } + } + ], + "responses": { + "200": { + "description": "The broadcast rounds with their tournament and a `study.writeable` flag.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BroadcastMyRound" + } + } + } + } + } + } + }, + "/api/simul": { + "get": { + "operationId": "apiSimul", + "summary": "Get current simuls", + "description": "Get recently created, started, finished, simuls.\nCreated and finished simul lists are not exhaustives, only those with\nstrong enough host will be listed, the same filter is used to display simuls on https://lichess.org/simul.\nWhen [authenticated with OAuth2](#section/Introduction/Authentication), the pending list will be populated with your created, but unstarted simuls.\n", + "tags": [ + "Simuls" + ], + "security": [], + "responses": { + "200": { + "description": "The list of simuls.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "pending": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Simul" + } + }, + "created": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Simul" + } + }, + "started": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Simul" + } + }, + "finished": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Simul" + } + } + } + } + } + } + } + } + } + }, + "/api/team/{teamId}": { + "get": { + "operationId": "teamShow", + "summary": "Get a single team", + "description": "Public info about a team. Includes the list of publicly visible leaders.", + "tags": [ + "Teams" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "teamId", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The information about the team.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Team" + } + } + } + } + } + } + }, + "/api/team/all": { + "get": { + "operationId": "teamAll", + "summary": "Get popular teams", + "description": "Paginator of the most popular teams.\n", + "tags": [ + "Teams" + ], + "security": [], + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "number", + "example": 1, + "default": 1 + } + } + ], + "responses": { + "200": { + "description": "A paginated list of the most popular teams.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TeamPaginatorJson" + } + } + } + } + } + } + }, + "/api/team/of/{username}": { + "get": { + "operationId": "teamOfUsername", + "summary": "Teams of a player", + "description": "All the teams a player is a member of.\n", + "tags": [ + "Teams" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "username", + "schema": { + "type": "string", + "example": "thibault" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The list of teams the user is a member of.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Team" + } + } + } + } + } + } + } + }, + "/api/team/search": { + "get": { + "operationId": "teamSearch", + "summary": "Search teams", + "description": "Paginator of team search results for a keyword.\n", + "tags": [ + "Teams" + ], + "security": [], + "parameters": [ + { + "in": "query", + "name": "text", + "schema": { + "type": "string", + "example": "coders" + } + }, + { + "in": "query", + "name": "page", + "schema": { + "type": "number", + "example": 1, + "default": 1 + } + } + ], + "responses": { + "200": { + "description": "The paginated list of teams.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TeamPaginatorJson" + } + } + } + } + } + } + }, + "/api/team/{teamId}/users": { + "get": { + "operationId": "teamIdUsers", + "summary": "Get members of a team", + "description": "Members are sorted by reverse chronological order of joining the team (most recent first).\nOAuth is only required if the list of members is private.\nMembers are streamed as [ndjson](#section/Introduction/Streaming-with-ND-JSON).\n", + "tags": [ + "Teams" + ], + "security": [ + { + "OAuth2": [ + "team:read" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "teamId", + "schema": { + "type": "string", + "example": "coders" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The list of users in the team.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/x-ndjson": { + "schema": { + "$ref": "#/components/schemas/UserExtended" + } + } + } + } + } + } + }, + "/api/team/{teamId}/arena": { + "get": { + "operationId": "apiTeamArena", + "summary": "Get team Arena tournaments", + "description": "Get all Arena tournaments relevant to a team.\nTournaments are sorted by reverse chronological order of start date (last starting first).\nTournaments are streamed as [ndjson](#section/Introduction/Streaming-with-ND-JSON).\n", + "tags": [ + "Teams", + "Arena tournaments" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "teamId", + "description": "ID of the team", + "schema": { + "type": "string" + }, + "required": true + }, + { + "in": "query", + "name": "max", + "description": "How many tournaments to download.", + "schema": { + "type": "integer", + "minimum": 1, + "default": 100 + } + } + ], + "responses": { + "200": { + "description": "The list of Arena tournaments of a team.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/x-ndjson": { + "schema": { + "$ref": "#/components/schemas/ArenaTournament" + } + } + } + } + } + } + }, + "/team/{teamId}/join": { + "post": { + "operationId": "teamIdJoin", + "summary": "Join a team", + "description": "Join a team.\nIf the team requires a password but the `password` field is incorrect,\nthen the call fails with `403 Forbidden`.\nSimilarly, if the team join policy requires a confirmation but the\n`message` parameter is not given, then the call fails with\n`403 Forbidden`.\n", + "tags": [ + "Teams" + ], + "security": [ + { + "OAuth2": [ + "team:write" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "teamId", + "schema": { + "type": "string", + "example": "coders" + }, + "required": true + } + ], + "requestBody": { + "required": true, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Optional request message, if the team requires one." + }, + "password": { + "type": "string", + "description": "Optional password, if the team requires one." + } + } + } + } + } + }, + "responses": { + "200": { + "description": "The request to join a team was successfully sent.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + } + } + } + }, + "/team/{teamId}/quit": { + "post": { + "operationId": "teamIdQuit", + "summary": "Leave a team", + "description": "Leave a team.\n- <https://lichess.org/team>\n", + "tags": [ + "Teams" + ], + "security": [ + { + "OAuth2": [ + "team:write" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "teamId", + "schema": { + "type": "string", + "example": "coders" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The logged in user has successfully left the team.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + } + } + } + }, + "/api/team/{teamId}/requests": { + "get": { + "operationId": "teamRequests", + "summary": "Get join requests", + "description": "Get pending join requests of your team", + "tags": [ + "Teams" + ], + "security": [ + { + "OAuth2": [ + "team:read" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "teamId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "in": "query", + "name": "declined", + "description": "Get the declined join requests", + "schema": { + "type": "boolean", + "default": false + } + } + ], + "responses": { + "200": { + "description": "The list of pending join requests on your team", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TeamRequestWithUser" + }, + "example": [ + { + "request": { + "date": 1644232474472, + "message": "Hello, I would like to join the team!", + "teamId": "coders", + "userId": "neio" + }, + "user": { + "createdAt": 1338509698620, + "id": "neio", + "perfs": { + "blitz": { + "games": 70, + "prog": 81, + "prov": true, + "rating": 1729, + "rd": 124 + }, + "chess960": { + "games": 2, + "prog": 0, + "prov": true, + "rating": 1528, + "rd": 266 + } + }, + "playTime": { + "total": 152902, + "tv": 20800 + }, + "profile": { + "bio": "yuwnt uyn", + "country": "AL", + "firstName": "wyutn w[fuyt", + "lastName": "ywut wyufth" + }, + "seenAt": 1644232201429, + "title": "NM", + "username": "Neio" + } + } + ] + } + } + } + } + } + } + }, + "/api/team/{teamId}/request/{userId}/accept": { + "post": { + "operationId": "teamRequestAccept", + "summary": "Accept join request", + "description": "Accept someone's request to join your team", + "tags": [ + "Teams" + ], + "security": [ + { + "OAuth2": [ + "team:lead" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "teamId", + "schema": { + "type": "string", + "example": "coders" + }, + "required": true + }, + { + "in": "path", + "name": "userId", + "schema": { + "type": "string", + "example": "neio" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The member has been added to the team.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + } + } + } + }, + "/api/team/{teamId}/request/{userId}/decline": { + "post": { + "operationId": "teamRequestDecline", + "summary": "Decline join request", + "description": "Decline someone's request to join your team", + "tags": [ + "Teams" + ], + "security": [ + { + "OAuth2": [ + "team:lead" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "teamId", + "schema": { + "type": "string", + "example": "coders" + }, + "required": true + }, + { + "in": "path", + "name": "userId", + "schema": { + "type": "string", + "example": "neio" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The join request has been declined and is no longer pending.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + } + } + } + }, + "/api/team/{teamId}/kick/{userId}": { + "post": { + "operationId": "teamIdKickUserId", + "summary": "Kick a user from your team", + "description": "Kick a member out of one of your teams.\n- <https://lichess.org/team>\n", + "tags": [ + "Teams" + ], + "security": [ + { + "OAuth2": [ + "team:lead" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "teamId", + "schema": { + "type": "string", + "example": "coders" + }, + "required": true + }, + { + "in": "path", + "name": "userId", + "schema": { + "type": "string", + "example": "neio" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The member has been kicked from the team.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + } + } + } + }, + "/team/{teamId}/pm-all": { + "post": { + "operationId": "teamIdPmAll", + "summary": "Message all members", + "description": "Send a private message to all members of a team.\nYou must be a team leader with the \"Messages\" permission.\n", + "tags": [ + "Teams" + ], + "security": [ + { + "OAuth2": [ + "team:lead" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "teamId", + "schema": { + "type": "string", + "example": "coders" + }, + "required": true + } + ], + "requestBody": { + "required": true, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "The message to send to all your team members." + } + } + } + } + } + }, + "responses": { + "200": { + "description": "The message has successfully been sent to all team members.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + }, + "400": { + "description": "The sending of message to all team members has failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/streamer/live": { + "get": { + "operationId": "streamerLive", + "summary": "Get live streamers", + "description": "Get basic info about currently streaming users.\nThis API is very fast and cheap on lichess side.\nSo you can call it quite often (like once every 5 seconds).\n", + "tags": [ + "Users" + ], + "security": [], + "responses": { + "200": { + "description": "The list of live streamers and their respective information.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LightUser" + }, + "example": [ + { + "id": "chess-network", + "name": "Chess-Network", + "title": "NM", + "patron": true, + "stream": { + "service": "twitch", + "status": "Tuesday night 🐴 chess | lichess.org", + "lang": "en" + }, + "streamer": { + "name": "ChessNetwork", + "headline": "Chess with commentary, tournament competition, viewer interaction, and more.", + "description": "I'm a self-taught National Master in chess from Pennsylvania, USA who was introduced to the game by my father in 1988 at age 8. I've been playing since, enjoy teaching, and have been a broadcaster of all things chess since 2011. It's my hope your experience with this stream is both fun and educational. 😎 -Jerry", + "twitch": "https://twitch.tv/chessnetwork", + "youTube": "https://www.youtube.com/channel/UCCDOQrpqLqKVcTCKzqarxLg/live", + "image": "https://image.lichess1.org/display?h=350&op=thumbnail&path=orlandikill:streamer:orlandikill:wiw356Np.jpg&w=350&sig=9912e0c45e42f37e7cd2716af6bd41bb10497b0c" + } + } + ] + } + } + } + } + } + } + }, + "/api/crosstable/{user1}/{user2}": { + "get": { + "operationId": "apiCrosstable", + "summary": "Get crosstable", + "description": "Get total number of games, and current score, of any two users.\nIf the `matchup` flag is provided, and the users are currently playing, also gets the current match game number and scores.\n", + "tags": [ + "Users" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "user1", + "schema": { + "type": "string" + }, + "required": true + }, + { + "in": "path", + "name": "user2", + "schema": { + "type": "string" + }, + "required": true + }, + { + "in": "query", + "name": "matchup", + "description": "Whether to get the current match data, if any", + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "The crosstable of the two users.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Crosstable" + } + } + } + } + } + } + }, + "/api/player/autocomplete": { + "get": { + "operationId": "apiPlayerAutocomplete", + "summary": "Autocomplete usernames", + "description": "Provides autocompletion options for an incomplete username.\n", + "tags": [ + "Users" + ], + "security": [], + "parameters": [ + { + "in": "query", + "name": "term", + "description": "The beginning of a username", + "schema": { + "type": "string", + "minLength": 3 + }, + "required": true + }, + { + "in": "query", + "name": "object", + "description": "- `false` returns an array of usernames\n- `true` returns an object with matching users\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "in": "query", + "name": "friend", + "description": "Returns followed players matching `term` if any, else returns other players.\nRequires [OAuth](#tag/OAuth).\n", + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "An array of players which usernames start with the provided term.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "object", + "properties": { + "result": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LightUserOnline" + } + } + } + } + ] + } + } + } + } + } + } + }, + "/api/user/{username}/note": { + "post": { + "operationId": "writeNote", + "summary": "Add a note for a user", + "description": "Add a private note available only to you about this account.\n", + "tags": [ + "Users" + ], + "security": [ + { + "OAuth2": [] + } + ], + "parameters": [ + { + "in": "path", + "name": "username", + "schema": { + "type": "string", + "example": "thibault" + }, + "required": true + } + ], + "requestBody": { + "required": true, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "text": { + "description": "The contents of the note", + "type": "string" + } + }, + "required": [ + "text" + ] + } + } + } + }, + "responses": { + "200": { + "description": "The note was successfully added.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + } + } + }, + "get": { + "operationId": "readNote", + "summary": "Get notes for a user", + "description": "Get the private notes that you have added for a user.\n", + "tags": [ + "Users" + ], + "security": [ + { + "OAuth2": [] + } + ], + "parameters": [ + { + "in": "path", + "name": "username", + "schema": { + "type": "string", + "example": "thibault" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The list of notes you have added for this user", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UserNote" + }, + "example": [ + { + "from": { + "name": "thibault", + "patron": true, + "id": "thibault" + }, + "to": { + "name": "DrNykterstein", + "title": "GM", + "patron": true, + "id": "drnykterstein" + }, + "text": "This guy is good at chess", + "date": 1690585691898 + } + ] + } + } + } + } + } + } + }, + "/api/rel/following": { + "get": { + "operationId": "apiUserFollowing", + "summary": "Get users followed by the logged in user", + "description": "Users are streamed as [ndjson](#section/Introduction/Streaming-with-ND-JSON).\n", + "tags": [ + "Relations" + ], + "security": [ + { + "OAuth2": [ + "follow:read" + ] + } + ], + "responses": { + "200": { + "description": "The list of users followed by a user.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/x-ndjson": { + "schema": { + "$ref": "#/components/schemas/UserExtended" + } + } + } + } + } + } + }, + "/api/rel/follow/{username}": { + "post": { + "operationId": "followUser", + "summary": "Follow a player", + "description": "Follow a player, adding them to your list of Lichess friends.\n", + "tags": [ + "Relations" + ], + "security": [ + { + "OAuth2": [ + "follow:write" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "username", + "schema": { + "type": "string", + "example": "thibault" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The player was successfully added.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + } + } + } + }, + "/api/rel/unfollow/{username}": { + "post": { + "operationId": "unfollowUser", + "summary": "Unfollow a player", + "description": "Unfollow a player, removing them from your list of Lichess friends.\n", + "tags": [ + "Relations" + ], + "security": [ + { + "OAuth2": [ + "follow:write" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "username", + "schema": { + "type": "string", + "example": "thibault" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The player was successfully removed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + } + } + } + }, + "/api/stream/event": { + "get": { + "operationId": "apiStreamEvent", + "summary": "Stream incoming events", + "description": "\n Stream the events reaching a lichess user in real time as [ndjson](#section/Introduction/Streaming-with-ND-JSON).\n\n An empty line is sent every 6 seconds for keep alive purposes.\n\n Each non-empty line is a JSON object containing a `type` field. Possible values are:\n - `gameStart` Start of a game\n - `gameFinish` Completion of a game\n - `challenge` A player sends you a challenge or you challenge someone\n - `challengeCanceled` A player cancels their challenge to you\n - `challengeDeclined` The opponent declines your challenge\n \n When the stream opens, all current challenges and games are sent.", + "tags": [ + "Board", + "Bot" + ], + "security": [ + { + "OAuth2": [ + "challenge:read", + "bot:play", + "board:play" + ] + } + ], + "responses": { + "200": { + "description": "The stream of events reaching the logged in user.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/x-ndjson": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/GameStartEvent" + }, + { + "$ref": "#/components/schemas/GameFinishEvent" + }, + { + "$ref": "#/components/schemas/ChallengeEvent" + }, + { + "$ref": "#/components/schemas/ChallengeCanceledEvent" + }, + { + "$ref": "#/components/schemas/ChallengeDeclinedEvent" + } + ] + } + } + } + } + } + } + }, + "/api/board/seek": { + "post": { + "operationId": "apiBoardSeek", + "summary": "Create a seek", + "description": "\n Create a public seek, to start a game with a random player.\n\n ### Real-time seek\n\n Specify the `time` and `increment` clock values. The response is streamed but doesn't contain any information.\n\n **Keep the connection open to keep the seek active**.\n\n 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.\n When the seek is accepted, or expires, the server closes the connection.\n\n **Make sure to also have an [Event stream](#operation/apiStreamEvent) open**, to be notified when a game starts.\n We recommend opening the [Event stream](#operation/apiStreamEvent) first, then the seek stream. This way,\n you won't miss the game event if the seek is accepted immediately.\n\n ### Correspondence seek\n\n 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.", + "tags": [ + "Board" + ], + "security": [ + { + "OAuth2": [ + "board:play" + ] + } + ], + "requestBody": { + "description": "Parameters of the seek", + "required": true, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "rated": { + "type": "boolean", + "description": "Whether the game is rated and impacts players ratings.", + "example": true, + "default": false + }, + "time": { + "type": "number", + "description": "Clock initial time in minutes. Required for real-time seeks.", + "example": 15, + "minimum": 0, + "maximum": 180 + }, + "increment": { + "type": "integer", + "description": "Clock increment in seconds. Required for real-time seeks.", + "example": 15, + "minimum": 0, + "maximum": 180 + }, + "days": { + "type": "integer", + "description": "Days per turn. Required for correspondence seeks.", + "enum": [ + 1, + 2, + 3, + 5, + 7, + 10, + 14 + ] + }, + "variant": { + "$ref": "#/components/schemas/VariantKey" + }, + "color": { + "type": "string", + "description": "The color to play. Better left empty to automatically get 50% white.", + "enum": [ + "random", + "white", + "black" + ], + "default": "random" + }, + "ratingRange": { + "type": "string", + "description": "The rating range of potential opponents. Better left empty.\nExample: 1500-1800\n" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "The seek was successfully created.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "text/plain": { + "example": "" + } + } + }, + "400": { + "description": "The creation of the seek failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/board/game/stream/{gameId}": { + "get": { + "operationId": "boardGameStream", + "summary": "Stream Board game state", + "description": " Stream the state of a game being played with the Board API, as [ndjson](#section/Introduction/Streaming-with-ND-JSON).\n\nUse this endpoint to get updates about the game in real-time, with a single request.\n\nEach line is a JSON object containing a `type` field. Possible values are:\n - `gameFull` Full game data. All values are immutable, except for the `state` field.\n - `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.\n - `chatLine` Chat message sent by a user in the `room` \"player\" or \"spectator\".\n\n - `opponentGone` Whether the opponent has left the game, and how long before you can claim a win or draw.\n\n \nThe first line is always of type `gameFull`.\n\n \nThe server closes the stream when the game ends, or if the game has already ended.", + "tags": [ + "Board" + ], + "security": [ + { + "OAuth2": [ + "board:play" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "gameId", + "schema": { + "type": "string", + "example": "5IrD6Gzz" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The stream of the game.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/x-ndjson": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/GameFullEvent" + }, + { + "$ref": "#/components/schemas/GameStateEvent" + }, + { + "$ref": "#/components/schemas/ChatLineEvent" + }, + { + "$ref": "#/components/schemas/OpponentGone" + } + ] + } + } + } + }, + "404": { + "description": "The game was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotFound" + } + } + } + } + } + } + }, + "/api/board/game/{gameId}/move/{move}": { + "post": { + "operationId": "boardGameMove", + "summary": "Make a Board move", + "description": "Make a move in a game being played with the Board API.\nThe move can also contain a draw offer/agreement.\n", + "tags": [ + "Board" + ], + "security": [ + { + "OAuth2": [ + "board:play" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "gameId", + "schema": { + "type": "string", + "example": "5IrD6Gzz" + }, + "required": true + }, + { + "in": "path", + "name": "move", + "required": true, + "description": "The move to play, in UCI format", + "schema": { + "type": "string", + "example": "e2e4" + } + }, + { + "in": "query", + "name": "offeringDraw", + "description": "Whether to offer (or agree to) a draw", + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "The move was successfully made.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + }, + "400": { + "description": "The move failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/board/game/{gameId}/chat": { + "parameters": [ + { + "in": "path", + "name": "gameId", + "schema": { + "type": "string", + "example": "5IrD6Gzz" + }, + "required": true + } + ], + "post": { + "operationId": "boardGameChatPost", + "summary": "Write in the chat", + "description": "Post a message to the player or spectator chat, in a game being played with the Board API.\n", + "tags": [ + "Board" + ], + "security": [ + { + "OAuth2": [ + "board:play" + ] + } + ], + "requestBody": { + "required": true, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "room": { + "type": "string", + "enum": [ + "player", + "spectator" + ] + }, + "text": { + "type": "string", + "example": "Thank you for the game!" + } + }, + "required": [ + "room", + "text" + ] + } + } + } + }, + "responses": { + "200": { + "description": "The message was successfully posted in the chat.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + }, + "400": { + "description": "The posting of the message in the chat failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "operationId": "boardGameChatGet", + "summary": "Fetch the game chat", + "description": "Get the messages posted in the game chat\n", + "tags": [ + "Board" + ], + "security": [ + { + "OAuth2": [ + "board:play" + ] + } + ], + "responses": { + "200": { + "description": "The messages posted in the chat.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/x-ndjson": { + "schema": { + "$ref": "#/components/schemas/GameChat" + } + } + } + } + } + } + }, + "/api/board/game/{gameId}/abort": { + "post": { + "operationId": "boardGameAbort", + "summary": "Abort a game", + "description": "Abort a game being played with the Board API.\n", + "tags": [ + "Board" + ], + "security": [ + { + "OAuth2": [ + "board:play" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "gameId", + "schema": { + "type": "string", + "example": "5IrD6Gzz" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The game successfully aborted.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + }, + "400": { + "description": "The abortion of the game failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/board/game/{gameId}/resign": { + "post": { + "operationId": "boardGameResign", + "summary": "Resign a game", + "description": "Resign a game being played with the Board API.\n", + "tags": [ + "Board" + ], + "security": [ + { + "OAuth2": [ + "board:play" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "gameId", + "schema": { + "type": "string", + "example": "5IrD6Gzz" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The game was successfully resigned.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + }, + "400": { + "description": "The resigning from the game failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/board/game/{gameId}/draw/{accept}": { + "post": { + "operationId": "boardGameDraw", + "summary": "Handle draw offers", + "description": "Create/accept/decline draw offers.\n- `yes`: Offer a draw, or accept the opponent's draw offer.\n- `no`: Decline a draw offer from the opponent.\n", + "tags": [ + "Board" + ], + "security": [ + { + "OAuth2": [ + "board:play" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "gameId", + "schema": { + "type": "string", + "example": "5IrD6Gzz" + }, + "required": true + }, + { + "in": "path", + "name": "accept", + "schema": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "const": "yes" + } + ], + "example": "yes" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The draw offer was successfully sent.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + }, + "400": { + "description": "The draw offering failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/board/game/{gameId}/takeback/{accept}": { + "post": { + "operationId": "boardGameTakeback", + "summary": "Handle takeback offers", + "description": "Create/accept/decline takebacks.\n- `yes`: Propose a takeback, or accept the opponent's takeback offer.\n- `no`: Decline a takeback offer from the opponent.\n", + "tags": [ + "Board" + ], + "security": [ + { + "OAuth2": [ + "board:play" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "gameId", + "schema": { + "type": "string", + "example": "5IrD6Gzz" + }, + "required": true + }, + { + "in": "path", + "name": "accept", + "schema": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "const": "yes" + } + ], + "example": "yes" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The takeback offer was successfully sent.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + }, + "400": { + "description": "The takeback offering failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/board/game/{gameId}/claim-victory": { + "post": { + "operationId": "boardGameClaimVictory", + "summary": "Claim victory of a game", + "description": "Claim victory when the opponent has left the game for a while.\n", + "tags": [ + "Board" + ], + "security": [ + { + "OAuth2": [ + "board:play" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "gameId", + "schema": { + "type": "string", + "example": "5IrD6Gzz" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The victory was successfully claimed.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + }, + "400": { + "description": "The victory claim has failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/board/game/{gameId}/berserk": { + "post": { + "operationId": "boardGameBerserk", + "summary": "Berserk a tournament game", + "description": "Go berserk on an arena tournament game. Halves the clock time, grants an extra point upon winning.\nOnly available in arena tournaments that allow berserk, and before each player has made a move.\n", + "tags": [ + "Board" + ], + "security": [ + { + "OAuth2": [ + "board:play" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "gameId", + "schema": { + "type": "string", + "example": "5IrD6Gzz" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The player successfully whent berserk.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + }, + "400": { + "description": "The berserk has failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/bot/online": { + "get": { + "operationId": "apiBotOnline", + "summary": "Get online bots", + "tags": [ + "Bot" + ], + "security": [], + "description": "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.", + "parameters": [ + { + "in": "query", + "name": "nb", + "description": "How many bot users to fetch", + "schema": { + "type": "integer", + "minimum": 1, + "example": 20 + } + } + ], + "responses": { + "200": { + "description": "The list of online bot users", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/x-ndjson": { + "schema": { + "$ref": "#/components/schemas/User" + }, + "example": { + "id": "georges-bot", + "username": "Georges-bot", + "perfs": { + "chess960": { + "games": 2945, + "rating": 1609, + "rd": 60, + "prog": -22, + "prov": true + }, + "atomic": { + "games": 2945, + "rating": 1609, + "rd": 60, + "prog": -22, + "prov": true + }, + "racingKings": { + "games": 2945, + "rating": 1609, + "rd": 60, + "prog": -22, + "prov": true + }, + "ultraBullet": { + "games": 2945, + "rating": 1609, + "rd": 60, + "prog": -22, + "prov": true + }, + "blitz": { + "games": 2945, + "rating": 1609, + "rd": 60, + "prog": -22, + "prov": true + }, + "kingOfTheHill": { + "games": 2945, + "rating": 1609, + "rd": 60, + "prog": -22, + "prov": true + }, + "bullet": { + "games": 2945, + "rating": 1609, + "rd": 60, + "prog": -22, + "prov": true + }, + "correspondence": { + "games": 2945, + "rating": 1609, + "rd": 60, + "prog": -22, + "prov": true + }, + "horde": { + "games": 2945, + "rating": 1609, + "rd": 60, + "prog": -22, + "prov": true + }, + "puzzle": { + "games": 2945, + "rating": 1609, + "rd": 60, + "prog": -22, + "prov": true + }, + "classical": { + "games": 2945, + "rating": 1609, + "rd": 60, + "prog": -22, + "prov": true + }, + "rapid": { + "games": 2945, + "rating": 1609, + "rd": 60, + "prog": -22, + "prov": true + }, + "storm": { + "runs": 44, + "score": 61 + }, + "racer": { + "runs": 44, + "score": 61 + }, + "streak": { + "runs": 44, + "score": 61 + } + }, + "createdAt": 1290415680000, + "disabled": false, + "tosViolation": false, + "profile": { + "country": "EC", + "location": "string", + "bio": "Free bugs!", + "firstName": "Thibault", + "lastName": "Duplessis", + "fideRating": 1500, + "uscfRating": 1500, + "ecfRating": 1500, + "cfcRating": 1500, + "dsbRating": 1500, + "links": "github.com/ornicar\r\ntwitter.com/ornicar" + }, + "seenAt": 1522636452014, + "patron": true, + "verified": true, + "playTime": { + "total": 3296897, + "tv": 12134 + }, + "title": "BOT" + } + } + } + } + } + } + }, + "/api/bot/account/upgrade": { + "post": { + "operationId": "botAccountUpgrade", + "summary": "Upgrade to Bot account", + "description": "Upgrade a lichess player account into a Bot account. Only Bot accounts can use the Bot API.\nThe 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.\nTo upgrade an account to Bot, use the [official lichess-bot client](https://github.com/lichess-bot-devs/lichess-bot), or follow these steps:\n- Create an [API access token](https://lichess.org/account/oauth/token/create?scopes[]=bot:play) with \"Play bot moves\" permission.\n- `curl -d '' https://lichess.org/api/bot/account/upgrade -H \"Authorization: Bearer <yourTokenHere>\"`\nTo know if an account has already been upgraded, use the [Get my profile API](#operation/accountMe):\nthe `title` field should be set to `BOT`.\n", + "tags": [ + "Bot" + ], + "security": [ + { + "OAuth2": [ + "bot:play" + ] + } + ], + "responses": { + "200": { + "description": "The bot account was successfully upgraded.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + }, + "400": { + "description": "The upgrade of the bot account failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/bot/game/stream/{gameId}": { + "get": { + "operationId": "botGameStream", + "summary": "Stream Bot game state", + "description": " Stream the state of a game being played with the Bot API, as [ndjson](#section/Introduction/Streaming-with-ND-JSON).\n\nUse this endpoint to get updates about the game in real-time, with a single request.\n\nEach line is a JSON object containing a `type` field. Possible values are:\n - `gameFull` Full game data. All values are immutable, except for the `state` field.\n - `gameState` Current state of the game. Immutable values not included.\n - `chatLine` Chat message sent by a user (or the bot itself) in the `room` \"player\" or \"spectator\".\n\n - `opponentGone` Whether the opponent has left the game, and how long before you can claim a win or draw.\n\n \nThe first line is always of type `gameFull`.", + "tags": [ + "Bot" + ], + "security": [ + { + "OAuth2": [ + "bot:play" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "gameId", + "schema": { + "type": "string", + "example": "5IrD6Gzz" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The stream of the bot game.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/x-ndjson": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/GameFullEvent" + }, + { + "$ref": "#/components/schemas/GameStateEvent" + }, + { + "$ref": "#/components/schemas/ChatLineEvent" + }, + { + "$ref": "#/components/schemas/OpponentGone" + } + ] + } + } + } + }, + "404": { + "description": "The bot game was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotFound" + } + } + } + } + } + } + }, + "/api/bot/game/{gameId}/move/{move}": { + "post": { + "operationId": "botGameMove", + "summary": "Make a Bot move", + "description": "Make a move in a game being played with the Bot API.\nThe move can also contain a draw offer/agreement.\n", + "tags": [ + "Bot" + ], + "security": [ + { + "OAuth2": [ + "bot:play" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "gameId", + "schema": { + "type": "string", + "example": "5IrD6Gzz" + }, + "required": true + }, + { + "in": "path", + "name": "move", + "required": true, + "description": "The move to play, in UCI format", + "schema": { + "type": "string", + "example": "e2e4" + } + }, + { + "in": "query", + "name": "offeringDraw", + "description": "Whether to offer (or agree to) a draw", + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "The bot move was successfully made.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + }, + "400": { + "description": "The bot move failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/bot/game/{gameId}/chat": { + "post": { + "operationId": "botGameChat", + "summary": "Write in the chat", + "description": "Post a message to the player or spectator chat, in a game being played with the Bot API.\n", + "tags": [ + "Bot" + ], + "security": [ + { + "OAuth2": [ + "bot:play" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "gameId", + "schema": { + "type": "string", + "example": "5IrD6Gzz" + }, + "required": true + } + ], + "requestBody": { + "required": true, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "room": { + "type": "string", + "enum": [ + "player", + "spectator" + ] + }, + "text": { + "type": "string", + "example": "Thank you for the game!" + } + }, + "required": [ + "room", + "text" + ] + } + } + } + }, + "responses": { + "200": { + "description": "The message was successfully posted in chat.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + }, + "400": { + "description": "The posting of the message in chat failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "operationId": "botGameChatGet", + "summary": "Fetch the game chat", + "description": "Get the messages posted in the game chat\n", + "tags": [ + "Bot" + ], + "security": [ + { + "OAuth2": [ + "bot:play" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "gameId", + "schema": { + "type": "string", + "example": "5IrD6Gzz" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The messages posted in the chat.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/x-ndjson": { + "schema": { + "$ref": "#/components/schemas/GameChat" + } + } + } + } + } + } + }, + "/api/bot/game/{gameId}/abort": { + "post": { + "operationId": "botGameAbort", + "summary": "Abort a game", + "description": "Abort a game being played with the Bot API.\n", + "tags": [ + "Bot" + ], + "security": [ + { + "OAuth2": [ + "bot:play" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "gameId", + "schema": { + "type": "string", + "example": "5IrD6Gzz" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The game was successfully aborted.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + }, + "400": { + "description": "The abortion of the game failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/bot/game/{gameId}/resign": { + "post": { + "operationId": "botGameResign", + "summary": "Resign a game", + "description": "Resign a game being played with the Bot API.\n", + "tags": [ + "Bot" + ], + "security": [ + { + "OAuth2": [ + "bot:play" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "gameId", + "schema": { + "type": "string", + "example": "5IrD6Gzz" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The game was successfully resigned from.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + }, + "400": { + "description": "Resigning the game failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/bot/game/{gameId}/draw/{accept}": { + "post": { + "operationId": "botGameDraw", + "summary": "Handle draw offers", + "description": "Create/accept/decline draw offers with the Bot API.\n- `yes`: Offer a draw, or accept the opponent's draw offer.\n- `no`: Decline a draw offer from the opponent.\n", + "tags": [ + "Bot" + ], + "security": [ + { + "OAuth2": [ + "bot:play" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "gameId", + "schema": { + "type": "string", + "example": "5IrD6Gzz" + }, + "required": true + }, + { + "in": "path", + "name": "accept", + "schema": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "const": "yes" + } + ], + "example": "yes" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The draw offer was successfully sent.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + }, + "400": { + "description": "The draw offering failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/bot/game/{gameId}/takeback/{accept}": { + "post": { + "operationId": "botGameTakeback", + "summary": "Handle takeback offers", + "description": "Create/accept/decline takebacks with the Bot API.\n- `yes`: Propose a takeback, or accept the opponent's takeback offer.\n- `no`: Decline a takeback offer from the opponent.\n", + "tags": [ + "Bot" + ], + "security": [ + { + "OAuth2": [ + "bot:play" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "gameId", + "schema": { + "type": "string", + "example": "5IrD6Gzz" + }, + "required": true + }, + { + "in": "path", + "name": "accept", + "schema": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "const": "yes" + } + ], + "example": "yes" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The takeback offer was successfully sent.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + }, + "400": { + "description": "The takeback offering failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/challenge": { + "get": { + "operationId": "challengeList", + "summary": "List your challenges", + "description": "Get a list of challenges created by or targeted at you.\n", + "tags": [ + "Challenges" + ], + "security": [ + { + "OAuth2": [ + "challenge:read" + ] + } + ], + "responses": { + "200": { + "description": "The list of challenges created by or targeted at the logged in user.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "in": { + "type": "array", + "description": "Incoming challenges i.e. targeted at you", + "items": { + "$ref": "#/components/schemas/ChallengeJson" + } + }, + "out": { + "type": "array", + "description": "Outgoing challenges i.e. created by you", + "items": { + "$ref": "#/components/schemas/ChallengeJson" + } + } + } + } + } + } + } + } + } + }, + "/api/challenge/{username}": { + "post": { + "operationId": "challengeCreate", + "summary": "Create a challenge", + "description": "Challenge someone to play. The targeted player can choose to accept or decline.\nIf the challenge is accepted, you will be notified on the [event stream](#operation/apiStreamEvent)\nthat a new game has started. The game ID will be the same as the challenge ID.\nChallenges for realtime games (not correspondence) expire after 20s if not accepted.\nTo prevent that, use the `keepAliveStream` flag described below.\n", + "tags": [ + "Challenges" + ], + "security": [ + { + "OAuth2": [ + "challenge:write", + "bot:play", + "board:play" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "username", + "schema": { + "type": "string", + "example": "LeelaChess" + }, + "required": true + } + ], + "requestBody": { + "description": "Parameters of the challenge", + "required": true, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "rated": { + "type": "boolean", + "description": "Game is rated and impacts players ratings", + "default": false + }, + "clock.limit": { + "type": "number", + "description": "Clock initial time in seconds. If empty, a correspondence game is created. Valid values are 0, 15, 30, 45, 60, 90, and any multiple of 60 up to 10800 (3 hours).", + "example": 300, + "minimum": 0, + "maximum": 10800 + }, + "clock.increment": { + "type": "integer", + "description": "Clock increment in seconds. If empty, a correspondence game is created.", + "example": 1, + "minimum": 0, + "maximum": 60 + }, + "days": { + "type": "integer", + "description": "Days per move, for correspondence games. Clock settings must be omitted.", + "enum": [ + 1, + 2, + 3, + 5, + 7, + 10, + 14 + ] + }, + "color": { + "type": "string", + "description": "Which color you get to play", + "enum": [ + "random", + "white", + "black" + ], + "default": "random" + }, + "variant": { + "$ref": "#/components/schemas/VariantKey" + }, + "fen": { + "$ref": "#/components/schemas/FromPositionFEN" + }, + "keepAliveStream": { + "type": "boolean", + "description": "If set, the response is streamed as [ndjson](#section/Introduction/Streaming-with-ND-JSON).\nThe challenge is kept alive until the connection is closed by the client.\nWhen the challenge is accepted, declined or canceled, a message of the form `{\"done\":\"accepted\"}` is sent,\nthen the connection is closed by the server.\nIf not set, the response is not streamed, and the challenge expires after 20s if not accepted.\n" + }, + "rules": { + "type": "string", + "enum": [ + "noAbort", + "noRematch", + "noGiveTime", + "noClaimWin", + "noEarlyDraw" + ], + "description": "Extra game rules separated by commas.\nExample: `noAbort,noRematch`\n" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "The challenge was successfully created.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "challenge": { + "$ref": "#/components/schemas/ChallengeJson" + } + } + } + } + } + }, + "400": { + "description": "The creation of the challenge failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/challenge/{challengeId}/accept": { + "post": { + "operationId": "challengeAccept", + "summary": "Accept a challenge", + "description": "Accept an incoming challenge.\nYou should receive a `gameStart` event on the [incoming events stream](#operation/apiStreamEvent).\n", + "tags": [ + "Challenges" + ], + "security": [ + { + "OAuth2": [ + "challenge:write", + "bot:play", + "board:play" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "challengeId", + "schema": { + "type": "string", + "example": "5IrD6Gzz" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The challenge was successfully accepted.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + }, + "404": { + "description": "The challenge to accept was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotFound" + } + } + } + } + } + } + }, + "/api/challenge/{challengeId}/decline": { + "post": { + "operationId": "challengeDecline", + "summary": "Decline a challenge", + "description": "Decline an incoming challenge.\n", + "tags": [ + "Challenges" + ], + "security": [ + { + "OAuth2": [ + "challenge:write", + "bot:play", + "board:play" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "challengeId", + "schema": { + "type": "string", + "example": "5IrD6Gzz" + }, + "required": true + } + ], + "requestBody": { + "description": "Details related to decline of challenge", + "required": false, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "reason": { + "type": "string", + "description": "Reason challenge was declined. It will be translated to the player's language. See [the full list in the translation file](https://github.com/ornicar/lila/blob/master/translation/source/challenge.xml#L14).", + "enum": [ + "generic", + "later", + "tooFast", + "tooSlow", + "timeControl", + "rated", + "casual", + "standard", + "variant", + "noBot", + "onlyBot" + ] + } + } + } + } + } + }, + "responses": { + "200": { + "description": "The challenge was successfully declined.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + }, + "404": { + "description": "The challenge to decline was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotFound" + } + } + } + } + } + } + }, + "/api/challenge/{challengeId}/cancel": { + "post": { + "operationId": "challengeCancel", + "summary": "Cancel a challenge", + "description": "Cancel a challenge you sent, or aborts the game if the challenge was accepted, but the game was not yet played.\nNote that the ID of a game is the same as the ID of the challenge that created it.\nWorks for user challenges and open challenges alike.\n", + "tags": [ + "Challenges" + ], + "security": [ + { + "OAuth2": [ + "challenge:write", + "bot:play", + "board:play" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "challengeId", + "schema": { + "type": "string", + "example": "5IrD6Gzz" + }, + "required": true + }, + { + "in": "query", + "name": "opponentToken", + "description": "Optional `challenge:write` token of the opponent. If set, the game can be canceled even if both players have moved.", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The challenge was successfully cancelled.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + }, + "404": { + "description": "The challenge to cancel was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotFound" + } + } + } + } + } + } + }, + "/api/challenge/ai": { + "post": { + "operationId": "challengeAi", + "summary": "Challenge the AI", + "description": "Start a game with Lichess AI.\nYou will be notified on the [event stream](#operation/apiStreamEvent) that a new game has started.\n", + "tags": [ + "Challenges" + ], + "security": [ + { + "OAuth2": [ + "challenge:write", + "bot:play", + "board:play" + ] + } + ], + "requestBody": { + "description": "Parameters of the game", + "required": true, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "level": { + "type": "number", + "description": "AI strength", + "minimum": 1, + "maximum": 8 + }, + "clock.limit": { + "type": "number", + "description": "Clock initial time in seconds. If empty, a correspondence game is created.", + "example": 300, + "minimum": 0, + "maximum": 10800 + }, + "clock.increment": { + "type": "integer", + "description": "Clock increment in seconds. If empty, a correspondence game is created.", + "example": 1, + "minimum": 0, + "maximum": 60 + }, + "days": { + "type": "integer", + "description": "Days per move, for correspondence games. Clock settings must be omitted.", + "enum": [ + 1, + 2, + 3, + 5, + 7, + 10, + 14 + ] + }, + "color": { + "type": "string", + "description": "Which color you get to play", + "enum": [ + "random", + "white", + "black" + ], + "default": "random" + }, + "variant": { + "$ref": "#/components/schemas/VariantKey" + }, + "fen": { + "$ref": "#/components/schemas/FromPositionFEN" + } + } + } + } + } + }, + "responses": { + "201": { + "description": "The game with Lichess AI was successfully started.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GameJson" + } + } + } + }, + "400": { + "description": "The creation of a game with Lichess AI failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/challenge/open": { + "post": { + "operationId": "challengeOpen", + "summary": "Open-ended challenge", + "description": "Create a challenge that any 2 players can join.\nShare the URL of the challenge. the first 2 players to click it will be paired for a game.\nThe response body also contains `whiteUrl` and `blackUrl`.\nYou can control which color each player gets by giving them these URLs,\ninstead of the main challenge URL.\nOpen challenges expire after 24h.\nIf the challenge creation is [authenticated with OAuth2](#section/Introduction/Authentication),\nthen you can use the [challenge cancel endpoint](#operation/challengeCancel) to cancel it.\nTo directly pair 2 known players, use [this endpoint](#operation/bulkPairingList) instead.\n", + "tags": [ + "Challenges" + ], + "security": [], + "requestBody": { + "description": "Parameters of the game", + "required": true, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "rated": { + "type": "boolean", + "description": "Game is rated and impacts players ratings", + "default": false + }, + "clock.limit": { + "type": "number", + "description": "Clock initial time in seconds. If empty, a correspondence game is created.", + "example": 300, + "minimum": 0, + "maximum": 10800 + }, + "clock.increment": { + "type": "integer", + "description": "Clock increment in seconds. If empty, a correspondence game is created.", + "example": 1, + "minimum": 0, + "maximum": 60 + }, + "days": { + "type": "integer", + "description": "Days per turn. For correspondence challenges.", + "enum": [ + 1, + 2, + 3, + 5, + 7, + 10, + 14 + ] + }, + "variant": { + "$ref": "#/components/schemas/VariantKey" + }, + "fen": { + "$ref": "#/components/schemas/FromPositionFEN" + }, + "name": { + "type": "string", + "description": "Optional name for the challenge, that players will see on the challenge page." + }, + "rules": { + "type": "string", + "enum": [ + "noRematch", + "noGiveTime", + "noClaimWin", + "noEarlyDraw", + "noAbort" + ], + "description": "Extra game rules separated by commas.\nExample: `noRematch,noGiveTime`\nThe `noAbort` rule is available for Lichess admins only\n" + }, + "users": { + "type": "string", + "description": "Optional pair of usernames, separated by a comma.\nIf set, only these users will be allowed to join the game.\nThe first username gets the white pieces.\nExample: `Username1,Username2`\n" + }, + "expiresAt": { + "type": "integer", + "description": "Timestamp in milliseconds to expire the challenge. Defaults to 24h after creation. Can't be more than 2 weeks after creation." + } + } + } + } + } + }, + "responses": { + "200": { + "description": "The challenge was successfully created.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChallengeOpenJson" + } + } + } + }, + "400": { + "description": "The creation of the challenge failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/challenge/{gameId}/start-clocks": { + "post": { + "operationId": "challengeStartClocks", + "summary": "Start clocks of a game", + "description": "Start the clocks of a game immediately, even if a player has not yet made a move.\nRequires the OAuth tokens of both players with `challenge:write` scope.\nIf the clocks have already started, the call will have no effect.\n", + "tags": [ + "Challenges" + ], + "security": [ + { + "OAuth2": [ + "challenge:write" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "gameId", + "schema": { + "type": "string", + "description": "ID of the game" + }, + "required": true + }, + { + "in": "query", + "name": "token1", + "description": "OAuth token of a player", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "token2", + "description": "OAuth token of the other player", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The clock of a game was successfully started.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + } + } + } + }, + "/api/bulk-pairing": { + "get": { + "operationId": "bulkPairingList", + "summary": "View your bulk pairings", + "description": "Get a list of bulk pairings you created.\n", + "tags": [ + "Bulk pairings" + ], + "security": [ + { + "OAuth2": [ + "challenge:bulk" + ] + } + ], + "responses": { + "200": { + "description": "The list of bulk pairing the logged in user created.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BulkPairing" + } + } + } + } + } + } + }, + "post": { + "operationId": "bulkPairingCreate", + "summary": "Create a bulk pairing", + "description": "Schedule many games at once, up to 24h in advance.\nOAuth tokens are required for all paired players, with the `challenge:write` scope.\nYou can schedule up to 500 games every 10 minutes. [Contact us](mailto:contact@lichess.org) if you need higher limits.\nIf games have a real-time clock, each player must have only one pairing.\nFor correspondence games, players can have multiple pairings within the same bulk.\nThe entire bulk is rejected if:\n - a token is missing\n - a token is present more than once (except in correspondence)\n - a token lacks the `challenge:write` scope\n - a player account is closed\n - a player is paired more than once (except in correspondence)\n - a bulk is already scheduled to start at the same time with the same player\n - you have 20 scheduled bulks\n - you have 1000 scheduled games\nPartial bulks are never created. Either it all fails, or it all succeeds.\nWhen it fails, it does so with an error message explaining the issue.\nFailed bulks are not counted in the rate limiting, they are free.\nFix the issues, manually or programmatically, then retry to schedule the bulk.\nA successful bulk creation returns a JSON bulk document. Its ID can be used for further operations.\n", + "tags": [ + "Bulk pairings" + ], + "security": [ + { + "OAuth2": [ + "challenge:bulk" + ] + } + ], + "requestBody": { + "description": "Parameters of the pairings", + "required": true, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "players": { + "type": "string", + "description": "OAuth tokens of all the players to pair, with the syntax `tokenOfWhitePlayerInGame1:tokenOfBlackPlayerInGame1,tokenOfWhitePlayerInGame2:tokenOfBlackPlayerInGame2,...`.\nThe 2 tokens of the players of a game are separated with `:`. The first token gets the white pieces. Games are separated with `,`.\nUp to 1000 tokens can be sent, for a max of 500 games.\nEach token must be included at most once.\nExample: `token1:token2,token3:token4,token5:token6`\n" + }, + "clock.limit": { + "type": "number", + "description": "Clock initial time in seconds. Example: `600`\n", + "minimum": 0, + "maximum": 10800 + }, + "clock.increment": { + "type": "integer", + "description": "Clock increment in seconds. Example: `2`\n", + "minimum": 0, + "maximum": 60 + }, + "days": { + "type": "integer", + "description": "Days per turn. For correspondence games only.", + "enum": [ + 1, + 2, + 3, + 5, + 7, + 10, + 14 + ] + }, + "pairAt": { + "description": "Date at which the games will be created as a Unix timestamp in milliseconds.\nUp to 7 days in the future.\nOmit, or set to current date and time, to start the games immediately.\nExample: `1612289869919`\n", + "type": "integer" + }, + "startClocksAt": { + "description": "Date at which the clocks will be automatically started as a Unix timestamp in milliseconds.\nUp to 7 days in the future.\nNote that the clocks can start earlier than specified, if players start making moves in the game.\nIf omitted, the clocks will not start automatically.\nExample: `1612289869919`\n", + "type": "integer" + }, + "rated": { + "type": "boolean", + "description": "Game is rated and impacts players ratings", + "default": false + }, + "variant": { + "$ref": "#/components/schemas/VariantKey" + }, + "fen": { + "$ref": "#/components/schemas/FromPositionFEN" + }, + "message": { + "type": "string", + "description": "Message that will be sent to each player, when the game is created. It is sent from your user account.\n`{opponent}` and `{game}` are placeholders that will be replaced with the opponent and the game URLs.\nYou can omit this field to send the default message,\nbut if you set your own message, it must at least contain the `{game}` placeholder.\n", + "default": "Your game with {opponent} is ready: {game}." + }, + "rules": { + "type": "string", + "enum": [ + "noAbort", + "noRematch", + "noGiveTime", + "noClaimWin", + "noEarlyDraw" + ], + "description": "Extra game rules separated by commas.\nExample: `noAbort,noRematch`\n" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "The bulk pairing has been successfully created.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BulkPairing" + } + } + } + }, + "400": { + "description": "The creation of the bulk pairings failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/bulk-pairing/{id}/start-clocks": { + "post": { + "operationId": "bulkPairingStartClocks", + "summary": "Manually start clocks", + "description": "Immediately start all clocks of the games of a bulk pairing.\nThis overrides the `startClocksAt` value of an existing bulk pairing.\nIf the games have not yet been created (`bulk.pairAt` is in the future), then this does nothing.\nIf the clocks have already started (`bulk.startClocksAt` is in the past), then this does nothing.\n", + "tags": [ + "Bulk pairings" + ], + "security": [ + { + "OAuth2": [ + "challenge:bulk" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "description": "The ID of the bulk pairing", + "example": "5IrD6Gzz" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The clocks of the games of a bulk pairing were successfully started.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + }, + "404": { + "description": "The bulk pairing was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotFound" + } + } + } + } + } + } + }, + "/api/bulk-pairing/{id}": { + "get": { + "operationId": "bulkPairingGet", + "summary": "Show a bulk pairing", + "description": "Get a single bulk pairing by its ID.\n", + "tags": [ + "Bulk pairings" + ], + "security": [ + { + "OAuth2": [ + "challenge:bulk" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "description": "The ID of the bulk pairing", + "example": "5IrD6Gzz" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The bulk pairing.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BulkPairing" + } + } + } + }, + "404": { + "description": "The bulk pairing was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotFound" + } + } + } + } + } + }, + "delete": { + "operationId": "bulkPairingDelete", + "summary": "Cancel a bulk pairing", + "description": "Cancel and delete a bulk pairing that is scheduled in the future.\nIf the games have already been created, then this does nothing.\nCanceling a bulk pairing does not refund the rate limit cost of that bulk pairing.\n", + "tags": [ + "Bulk pairings" + ], + "security": [ + { + "OAuth2": [ + "challenge:bulk" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "description": "The ID of the bulk pairing", + "example": "5IrD6Gzz" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The bulk pairing was successfully deleted.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + }, + "404": { + "description": "The bulk pairing to delete was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotFound" + } + } + } + } + } + } + }, + "/api/round/{gameId}/add-time/{seconds}": { + "post": { + "operationId": "roundAddTime", + "summary": "Add time to the opponent clock", + "description": "Add seconds to the opponent's clock. Can be used to create games with time odds.\n", + "tags": [ + "Challenges" + ], + "security": [ + { + "OAuth2": [ + "challenge:write" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "gameId", + "schema": { + "type": "string", + "description": "ID of the game" + }, + "required": true + }, + { + "in": "path", + "name": "seconds", + "description": "How many seconds to give", + "schema": { + "type": "string", + "minimum": 1, + "maximum": 86400 + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Time was successfully added to the opponent's clock.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + } + } + } + }, + "/api/token/admin-challenge": { + "post": { + "operationId": "adminChallengeTokens", + "summary": "Admin challenge tokens", + "description": "**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.*\nCreate and obtain `challenge:write` tokens for multiple users.\nIf a similar token already exists for a user, it is reused. This endpoint is idempotent.\n", + "tags": [ + "Challenges" + ], + "security": [ + { + "OAuth2": [ + "web:mod" + ] + } + ], + "requestBody": { + "required": true, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "users": { + "description": "Usernames separated with commas", + "type": "string", + "example": "thibault,neio,lizen2,lizen3" + }, + "description": { + "description": "User visible description of the token", + "type": "string", + "example": "FIDE tournament XYZ" + } + }, + "required": [ + "users", + "description" + ] + } + } + } + }, + "responses": { + "200": { + "description": "The `challenge:write` tokens of each user", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "example": { + "thibault": "lLOEkpH58W599xH9", + "neio": "nAYTIJphwWFwKmKk", + "lizen2": "1cnHhuWKHROgiPC4", + "lizen3": "SszJ9Sj1bto0UQCK" + } + } + } + }, + "400": { + "description": "The creation of the tokens failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/inbox/{username}": { + "post": { + "operationId": "inboxUsername", + "summary": "Send a private message", + "description": "Send a private message to another player.\n", + "tags": [ + "Messaging" + ], + "security": [ + { + "OAuth2": [ + "msg:write" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "username", + "schema": { + "type": "string", + "example": "someplayer" + }, + "required": true + } + ], + "requestBody": { + "required": true, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "text": { + "type": "string", + "example": "Thank you for the game!" + } + }, + "required": [ + "text" + ] + } + } + } + }, + "responses": { + "200": { + "description": "The private message has been successfully sent.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + }, + "400": { + "description": "The sending of the private message has failed.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/cloud-eval": { + "get": { + "operationId": "apiCloudEval", + "summary": "Get cloud evaluation of a position.", + "description": "Get the cached evaluation of a position, if available.\nOpening positions have more chances of being available. There are about 15 million positions in the database.\nUp to 5 variations may be available. Variants are supported.\nUse this endpoint to fetch a few positions here and there.\nIf you want to download a lot of positions, [get the full list](https://database.lichess.org/#evals) from our exported database.\n", + "tags": [ + "Analysis" + ], + "security": [], + "parameters": [ + { + "in": "query", + "name": "fen", + "required": true, + "description": "FEN of the position", + "schema": { + "type": "string" + }, + "example": "rnbqkbnr/ppp1pppp/8/3pP3/8/8/PPPP1PPP/RNBQKBNR b KQkq - 0 2" + }, + { + "in": "query", + "name": "multiPv", + "description": "Number of variations", + "schema": { + "type": "number", + "default": 1 + } + }, + { + "in": "query", + "name": "variant", + "description": "Variant", + "schema": { + "$ref": "#/components/schemas/VariantKey" + } + } + ], + "responses": { + "200": { + "description": "The evaluation of the position.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "example": { + "fen": "rnbqkbnr/ppp1pppp/8/3pP3/8/8/PPPP1PPP/RNBQKBNR b KQkq - 0 2", + "knodes": 13683, + "depth": 22, + "pvs": [ + { + "moves": "c8f5 d2d4 e7e6 g1f3 g8e7 c1e3 c7c5 d4c5 e7c6 b1c3", + "cp": -13 + }, + { + "moves": "c7c5 c2c3 d5d4 g1f3 b8c6 c3d4 c6d4 b1c3 c8d7 f1d3", + "cp": -1 + }, + { + "moves": "e7e6 d2d4 c7c5 c2c3 b8c6 g1f3 c8d7 b1a3 c5d4 c3d4", + "cp": 24 + } + ] + } + } + } + } + } + } + }, + "/api/external-engine": { + "get": { + "operationId": "apiExternalEngineList", + "summary": "List external engines", + "tags": [ + "External engine" + ], + "security": [ + { + "OAuth2": [ + "engine:read" + ] + } + ], + "description": "Lists all external engines that have been registered for the user,\nand the credentials required to use them.\n", + "responses": { + "200": { + "description": "A list of external engines.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExternalEngine" + } + } + } + } + } + } + }, + "post": { + "operationId": "apiExternalEngineCreate", + "summary": "Create external engine", + "tags": [ + "External engine" + ], + "security": [ + { + "OAuth2": [ + "engine:write" + ] + } + ], + "description": "Registers a new external engine for the user. It can then be selected\nand used on the analysis board.\nAfter registering, the provider should start waiting for analyis requests.\n", + "requestBody": { + "description": "A new external engine registration.", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExternalEngineRegistration" + } + } + } + }, + "responses": { + "200": { + "description": "The registered engine.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExternalEngine" + } + } + } + } + } + } + }, + "/api/external-engine/{id}": { + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "description": "The external engine id.", + "schema": { + "type": "string" + }, + "example": "eei_aTKImBJOnv6j" + } + ], + "get": { + "operationId": "apiExternalEngineGet", + "summary": "Get external engine", + "tags": [ + "External engine" + ], + "security": [ + { + "OAuth2": [ + "engine:read" + ] + } + ], + "description": "Get properties and credentials of an external engine.\n", + "responses": { + "200": { + "description": "A registered engine.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExternalEngine" + } + } + } + } + } + }, + "put": { + "operationId": "apiExternalEnginePut", + "summary": "Update external engine", + "tags": [ + "External engine" + ], + "security": [ + { + "OAuth2": [ + "engine:write" + ] + } + ], + "description": "Updates the properties of an external engine.\n", + "requestBody": { + "description": "A modified engine registration.", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExternalEngineRegistration" + } + } + } + }, + "responses": { + "200": { + "description": "A registered engine.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExternalEngine" + } + } + } + } + } + }, + "delete": { + "operationId": "apiExternalEngineDelete", + "summary": "Delete external engine", + "tags": [ + "External engine" + ], + "security": [ + { + "OAuth2": [ + "engine:write" + ] + } + ], + "description": "Unregisters an external engine.\n", + "responses": { + "200": { + "description": "Engine successfully deleted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ok" + } + } + } + } + } + } + }, + "/api/external-engine/{id}/analyse": { + "servers": [ + { + "url": "https://engine.lichess.ovh" + } + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "description": "The external engine id.", + "schema": { + "type": "string" + }, + "example": "eei_aTKImBJOnv6j" + } + ], + "post": { + "operationId": "apiExternalEngineAnalyse", + "summary": "Analyse with external engine", + "tags": [ + "External engine" + ], + "security": [], + "description": "**Endpoint: `https://engine.lichess.ovh/api/external-engine/{id}/analyse`**\nRequest analysis from an external engine.\nResponse content is streamed as [newline delimited JSON](#section/Introduction/Streaming-with-ND-JSON).\nThe properties are based on the [UCI specification](https://backscattering.de/chess/uci/#engine).\nAnalysis stops when the client goes away, the requested limit\nis reached, or the provider goes away.\n", + "requestBody": { + "description": "Engine credentials and analysis request.", + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "clientSecret": { + "type": "string", + "example": "ees_mdF2hK0hlKGSPeC6" + }, + "work": { + "$ref": "#/components/schemas/ExternalEngineWork" + } + }, + "required": [ + "clientSecret", + "work" + ] + } + } + } + }, + "responses": { + "200": { + "description": "Stream of analysis output", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/x-ndjson": { + "schema": { + "type": "object", + "properties": { + "time": { + "type": "integer", + "description": "Number of milliseconds the search has been going on", + "example": 6880, + "minimum": 0 + }, + "depth": { + "type": "integer", + "description": "Current search depth", + "example": 25, + "minimum": 0 + }, + "nodes": { + "type": "integer", + "description": "Number of nodes visited so far", + "example": 7230340, + "minimum": 0 + }, + "pvs": { + "type": "array", + "description": "Information about up to 5 pvs, with the primary pv at index 0.", + "items": { + "type": "object", + "properties": { + "depth": { + "type": "integer", + "description": "Current search depth of the pv", + "example": 25, + "minimum": 0 + }, + "cp": { + "type": "integer", + "description": "Evaluation in centi-pawns, from White's point of view", + "example": 40 + }, + "mate": { + "type": "integer", + "description": "Evaluation in signed moves to mate, from White's point of view" + }, + "moves": { + "type": "array", + "description": "Variation in UCI notation", + "items": { + "type": "string" + }, + "example": [ + "e2e4", + "c7c6", + "g1f3", + "d7d5", + "d2d3", + "d5e4" + ] + } + }, + "required": [ + "depth", + "moves" + ] + } + } + }, + "required": [ + "time", + "depth", + "nodes", + "pvs" + ] + } + } + } + } + } + } + }, + "/api/external-engine/work": { + "servers": [ + { + "url": "https://engine.lichess.ovh" + } + ], + "post": { + "operationId": "apiExternalEngineAcquire", + "summary": "Acquire analysis request", + "tags": [ + "External engine" + ], + "security": [], + "description": "**Endpoint: `https://engine.lichess.ovh/api/external-engine/work`**\nWait for an analysis requests to any of the external engines that\nhave been registered with the given `secret`.\nUses long polling.\nAfter acquiring a request, the provider should immediately\n[start streaming the results](#tag/External-engine/operation/apiExternalEngineSubmit).\n", + "requestBody": { + "description": "Provider credentials.", + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "providerSecret": { + "type": "string", + "example": "Dee3uwieZei9ahpaici9bee2yahsai0K" + } + }, + "required": [ + "secret" + ] + } + } + } + }, + "responses": { + "200": { + "description": "Analysis has been requested", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "id": { + "type": "string", + "example": "aingoohiJee2sius" + }, + "work": { + "$ref": "#/components/schemas/ExternalEngineWork" + }, + "engine": { + "$ref": "#/components/schemas/ExternalEngine" + } + }, + "required": [ + "id", + "engine", + "work" + ] + } + } + } + }, + "204": { + "description": "No pending analysis", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + } + } + } + } + }, + "/api/external-engine/work/{id}": { + "servers": [ + { + "url": "https://engine.lichess.ovh" + } + ], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string", + "example": "aingoohiJee2sius" + } + } + ], + "post": { + "operationId": "apiExternalEngineSubmit", + "summary": "Answer analysis request", + "tags": [ + "External engine" + ], + "security": [], + "description": "**Endpoint: `https://engine.lichess.ovh/api/external-engine/work/{id}`**\nSubmit a stream of analysis as [UCI output](https://backscattering.de/chess/uci/#engine-info).\n* The engine should always be in `UCI_Chess960` mode.\n* `UCI_AnalyseMode` enabled if available.\n* It produces `info` with at least:\n - `depth`\n - `multipv` (between 1 and 5)\n - `score`\n - `nodes`\n - `time`\n - `pv`\nThe server may close the connection at any time, indicating that\nthe requester has gone away and analysis should be stopped.\n", + "requestBody": { + "description": "Analysis results", + "required": true, + "content": { + "text/plain": { + "schema": { + "type": "string" + }, + "example": "info multipv 1 depth 20 seldepth 30 time 1373 nodes 1494341 score cp 47 hashfull 594 nps 1088376 tbhits 0 pv d2d4 d7d5 c2c4 e7e6 b1c3 f8b4 c4d5 e6d5 g1f3 g8f6 c1g5 h7h6 g5f6 d8f6 d1b3 c7c5 e2e3 b8c6 d4c5 e8g8 f1d3" + } + } + }, + "responses": { + "200": { + "description": "Thanks", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + } + } + } + } + }, + "/oauth": { + "get": { + "operationId": "oauth", + "summary": "Request authorization code", + "tags": [ + "OAuth" + ], + "security": [], + "description": "OAuth2 authorization endpoint.\nStart the OAuth2 Authorization Code Flow with PKCE by securely\ngenerating two random strings unique to each authorization\nrequest:\n* `code_verifier`\n* `state`\nStore these in session storage. Make sure not to reveal `code_verifier`\nto eavesdroppers. Do not show it in URLs, do not abuse `state` to store\nit, do not send it over insecure connections. However it is fine if\nthe user themselves can extract `code_verifier`, which will always be\npossible for fully client-side apps.\nThen send the user to this endpoint. They will be prompted to grant\nauthorization and then be redirected back to the given `redirect_uri`.\nIf the authorization failed, the following query string parameters will\nbe appended to the redirection:\n* `error`, in particular with value `access_denied` if the user\n cancelled authorization\n* `error_description` to aid debugging\n* `state`, exactly as passed in the `state` parameter\nIf the authorization succeeded, the following query string parameters\nwill be appended to the redirection:\n* `code`, containing a fresh short-lived authorization code\n* `state`, exactly as passed in the `state` parameter\nNext, to defend against cross site request forgery, check that the\nreturned `state` matches the `state` you originally generated.\nFinally, continue by using the authorization code to\n[obtain an access token](#operation/apiToken).\n", + "parameters": [ + { + "in": "query", + "name": "response_type", + "description": "Must be `code`.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "client_id", + "description": "Arbitrary identifier that uniquely identifies your application.", + "example": "example.com", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "redirect_uri", + "description": "The absolute URL that the user should be redirected to with the authorization result.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "code_challenge_method", + "description": "Must be `S256`.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "code_challenge", + "description": "Compute `BASE64URL(SHA256(code_verifier))`.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "scope", + "description": "Space separated list of requested OAuth scopes, if any.", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "username", + "description": "Hint that you want the user to log in with a specific Lichess username.", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "state", + "description": "Arbitrary state that will be returned verbatim with the authorization result.", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Authorization prompt will be displayed to the user." + } + } + } + }, + "/api/token": { + "post": { + "operationId": "apiToken", + "summary": "Obtain access token", + "tags": [ + "OAuth" + ], + "security": [], + "description": "OAuth2 token endpoint. Exchanges an authorization code for an access token.\n", + "requestBody": { + "required": true, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "grant_type": { + "type": "string", + "example": "authorization_code", + "description": "Must be `authorization_code`." + }, + "code": { + "type": "string", + "example": "liu_iS1uOZg99Htmo58ex2jKgYziUfzsnAl0", + "description": "The authorization code that was sent in the `code` parameter to your `redirect_uri`." + }, + "code_verifier": { + "type": "string", + "example": "Ry1rbGdOMTQtUjhOc0lmTnFKak1LTHV0NjlRMll2aXYtTThkQnlJRkRpaGwyQjh0ZDNFdzFPSG9KUlY4M1NrRzJ5ZHhUdjVZR08zLTZOT3dCN2xLfjZOXzU2WHk4SENP", + "description": "A `code_challenge` was used to request the authorization code. This must be the `code_verifier` it was derived from." + }, + "redirect_uri": { + "type": "string", + "example": "http://example.com/", + "description": "Must match the `redirect_uri` used to request the authorization code." + }, + "client_id": { + "type": "string", + "example": "example.com", + "description": "Must match the `client_id` used to request the authorization code." + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Access token successfully obtained.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "example": { + "token_type": "Bearer", + "access_token": "lio_pLwAbN7lFPklzY2m8lTOI1DGApS84u57", + "expires_in": 31536000 + } + } + } + }, + "400": { + "description": "Failed to obtain access token.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuthError" + } + } + } + } + } + }, + "delete": { + "operationId": "apiTokenDelete", + "summary": "Revoke access token", + "description": "Revokes the access token sent as Bearer for this request.", + "tags": [ + "OAuth" + ], + "security": [ + { + "OAuth2": [] + } + ], + "responses": { + "204": { + "description": "Access token revoked.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + } + } + } + } + }, + "/api/token/test": { + "post": { + "operationId": "tokenTest", + "summary": "Test multiple OAuth tokens", + "description": "For up to 1000 OAuth tokens,\nreturns their associated user ID and scopes,\nor `null` if the token is invalid.\nThe method is `POST` so a longer list of tokens can be sent in the request body.\n", + "tags": [ + "OAuth" + ], + "security": [], + "requestBody": { + "description": "OAuth tokens separated by commas. Up to 1000.", + "required": true, + "content": { + "text/plain": { + "schema": { + "type": "string" + }, + "example": "lip_AvsS88TozFeSMEaoLN5c,lip_badToken" + } + } + }, + "responses": { + "200": { + "description": "The representation of the OAuth tokens.", + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": { + "x-additionalPropertiesName": "token", + "oneOf": [ + { + "type": "object", + "properties": { + "userId": { + "type": "string" + }, + "scopes": { + "type": "string", + "description": "Comma-separated list of scopes. Empty string if the token has no scopes." + }, + "expires": { + "type": [ + "integer", + null + ], + "description": "Unix-timestampe in milliseconds or null if the token never expires." + } + } + }, + { + "type": null + } + ] + }, + "example": { + "lip_AvsS88TozFeSnZa1LN5c": { + "scopes": "challenge:read,challenge:write", + "userId": "thibault", + "expires": 1358509698620 + }, + "lip_badToken": null + } + } + } + } + } + } + } + }, + "/masters": { + "servers": [ + { + "url": "https://explorer.lichess.ovh" + } + ], + "get": { + "operationId": "openingExplorerMaster", + "summary": "Masters database", + "description": "**Endpoint: <https://explorer.lichess.ovh/masters>**\nExample: `curl https://explorer.lichess.ovh/masters?play=d2d4,d7d5,c2c4,c7c6,c4d5`\n", + "tags": [ + "Opening Explorer" + ], + "security": [], + "parameters": [ + { + "in": "query", + "name": "fen", + "description": "FEN of the root position", + "schema": { + "type": "string" + }, + "example": "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1" + }, + { + "in": "query", + "name": "play", + "description": "Comma separated sequence of legal moves in UCI notation.\nPlay additional moves starting from `fen`.\nRequired to find an opening name, if `fen` is not an exact match\nfor a named position.\n", + "schema": { + "type": "string", + "default": "" + }, + "example": "e2e4,e7e5,c2c4,c7c6,c4e5" + }, + { + "in": "query", + "name": "since", + "description": "Include only games from this year or later", + "schema": { + "type": "number", + "default": 1952 + } + }, + { + "in": "query", + "name": "until", + "description": "Include only games from this year or earlier", + "schema": { + "type": "number" + } + }, + { + "in": "query", + "name": "moves", + "description": "Number of most common moves to display", + "schema": { + "type": "number", + "default": 12 + } + }, + { + "in": "query", + "name": "topGames", + "description": "Number of top games to display", + "schema": { + "type": "number", + "default": 15, + "maximum": 15 + } + } + ], + "responses": { + "200": { + "description": "Opening statistics and game references for the position.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OpeningExplorerJson" + } + } + } + } + } + } + }, + "/lichess": { + "servers": [ + { + "url": "https://explorer.lichess.ovh" + } + ], + "get": { + "operationId": "openingExplorerLichess", + "summary": "Lichess games", + "description": "**Endpoint: <https://explorer.lichess.ovh/lichess>**\nGames sampled from all Lichess players.\nExample: `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`\n", + "tags": [ + "Opening Explorer" + ], + "security": [], + "parameters": [ + { + "in": "query", + "name": "variant", + "description": "Variant", + "schema": { + "$ref": "#/components/schemas/VariantKey", + "default": "standard" + } + }, + { + "in": "query", + "name": "fen", + "description": "FEN or EPD of the root position", + "schema": { + "type": "string" + }, + "example": "rnbqkbnr/ppp1pppp/8/3pP3/8/8/PPPP1PPP/RNBQKBNR b KQkq - 0 2" + }, + { + "in": "query", + "name": "play", + "description": "Comma separated sequence of legal moves in UCI notation.\nPlay additional moves starting from `fen`.\nRequired to find an opening name, if `fen` is not an exact match\nfor a named position.\n", + "schema": { + "type": "string", + "default": "" + }, + "example": "e2e4,e7e5,c2c4,c7c6,c4e5" + }, + { + "in": "query", + "name": "speeds", + "description": "Comma separated list of game speeds to filter by", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Speed" + } + } + }, + { + "in": "query", + "name": "ratings", + "description": "Comma separated list of ratings groups to filter by.\nEach group ranges from its value to the next higher\ngroup in the enum (`0` from 0 to 999, `1000` from 1000 to 1199,\n..., `2500` from 2500 to any rating above).\n", + "schema": { + "type": "array", + "items": { + "type": "number", + "enum": [ + 0, + 1000, + 1200, + 1400, + 1600, + 1800, + 2000, + 2200, + 2500 + ] + } + } + }, + { + "in": "query", + "name": "since", + "description": "Include only games from this month or later", + "schema": { + "type": "string", + "default": "1952-01" + } + }, + { + "in": "query", + "name": "until", + "description": "Include only games from this month or earlier", + "schema": { + "type": "string", + "default": "3000-12" + } + }, + { + "in": "query", + "name": "moves", + "description": "Number of most common moves to display", + "schema": { + "type": "number", + "default": 12 + } + }, + { + "in": "query", + "name": "topGames", + "description": "Number of top games to display", + "schema": { + "type": "number", + "default": 4, + "maximum": 4 + } + }, + { + "in": "query", + "name": "recentGames", + "description": "Number of recent games to display", + "schema": { + "type": "number", + "default": 4, + "maximum": 4 + } + }, + { + "in": "query", + "name": "history", + "description": "Optionally retrieve history", + "schema": { + "type": "boolean", + "default": false + } + } + ], + "responses": { + "200": { + "description": "Opening statistics and game references for the position.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OpeningExplorerJson" + } + } + } + } + } + } + }, + "/player": { + "servers": [ + { + "url": "https://explorer.lichess.ovh" + } + ], + "get": { + "operationId": "openingExplorerPlayer", + "summary": "Player games", + "description": "**Endpoint: <https://explorer.lichess.ovh/player>**\nGames of a Lichess player.\nResponds with a stream of [newline delimited JSON](#section/Introduction/Streaming-with-ND-JSON). Will start indexing\non demand, immediately respond with the current results, and stream\nmore updates until indexing is complete. The stream is throttled\nand deduplicated. Empty lines may be sent to avoid timeouts.\nWill index new games at most once per minute, and revisit previously\nongoing games at most once every day.\nExample: `curl https://explorer.lichess.ovh/player?player=revoof&color=white&play=d2d4,d7d5&recentGames=1`\n", + "tags": [ + "Opening Explorer" + ], + "security": [], + "parameters": [ + { + "in": "query", + "name": "player", + "description": "Username or ID of the player", + "schema": { + "type": "string" + }, + "example": "revoof" + }, + { + "in": "query", + "name": "variant", + "description": "Variant", + "schema": { + "$ref": "#/components/schemas/VariantKey", + "default": "standard" + } + }, + { + "in": "query", + "name": "fen", + "description": "FEN of the root position", + "schema": { + "type": "string" + }, + "example": "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1" + }, + { + "in": "query", + "name": "play", + "description": "Comma separated sequence of legal moves in UCI notation.\nPlay additional moves starting from `fen`.\nRequired to find an opening name, if `fen` is not an exact match\nfor a named position.\n", + "schema": { + "type": "string", + "default": "" + }, + "example": "d2d4,d7d5" + }, + { + "in": "query", + "name": "speeds", + "description": "Comma separated list of game speeds to look for", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Speed" + } + } + }, + { + "in": "query", + "name": "modes", + "description": "Comma separated list of modes", + "schema": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "casual", + "rated" + ] + } + } + }, + { + "in": "query", + "name": "since", + "description": "Include only games from this month or later", + "schema": { + "type": "string", + "default": "1952-01" + } + }, + { + "in": "query", + "name": "until", + "description": "Include only games from this month or earlier", + "schema": { + "type": "string", + "default": "3000-12" + } + }, + { + "in": "query", + "name": "moves", + "description": "Number of most common moves to display", + "schema": { + "type": "number" + } + }, + { + "in": "query", + "name": "recentGames", + "description": "Number of recent games to display", + "schema": { + "type": "number", + "default": 8, + "maximum": 8 + } + } + ], + "responses": { + "200": { + "description": "Opening statistics and game references for the position.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/nd-json": { + "schema": { + "$ref": "#/components/schemas/OpeningExplorerPlayerJson" + } + } + } + } + } + } + }, + "/master/pgn/{gameId}": { + "servers": [ + { + "url": "https://explorer.lichess.ovh" + } + ], + "get": { + "operationId": "openingExplorerMasterGame", + "summary": "OTB master game", + "description": "**Endpoint: `https://explorer.lichess.ovh/masters/pgn/{gameId}`**\nExample: `curl https://explorer.lichess.ovh/masters/pgn/aAbqI4ey`\n", + "tags": [ + "Opening Explorer" + ], + "security": [], + "parameters": [ + { + "in": "path", + "name": "gameId", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The PGN representation of the game.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/x-chess-pgn": { + "schema": { + "$ref": "#/components/schemas/MasterGamePgn" + } + } + } + } + } + } + }, + "/standard": { + "servers": [ + { + "url": "https://tablebase.lichess.ovh" + } + ], + "get": { + "operationId": "tablebaseStandard", + "summary": "Tablebase lookup", + "description": "**Endpoint: <https://tablebase.lichess.ovh>**\nExample: `curl http://tablebase.lichess.ovh/standard?fen=4k3/6KP/8/8/8/8/7p/8_w_-_-_0_1`\n", + "tags": [ + "Tablebase" + ], + "security": [], + "parameters": [ + { + "in": "query", + "name": "fen", + "description": "FEN of the position. Underscores allowed.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "The tablebase information for the position in standard chess.", + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TablebaseJson" + } + } + } + } + } + } + }, + "/atomic": { + "servers": [ + { + "url": "https://tablebase.lichess.ovh" + } + ], + "get": { + "operationId": "tablebaseAtomic", + "summary": "Tablebase lookup for Atomic chess", + "description": "**Endpoint: <https://tablebase.lichess.ovh>**\n", + "tags": [ + "Tablebase" + ], + "security": [], + "responses": { + "200": { + "description": "The tablebase information for the position in atomic chess.", + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + }, + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + } + } + } + } + }, + "/antichess": { + "servers": [ + { + "url": "https://tablebase.lichess.ovh" + } + ], + "get": { + "operationId": "antichessAtomic", + "summary": "Tablebase lookup for Antichess", + "description": "**Endpoint: <https://tablebase.lichess.ovh>**\n", + "tags": [ + "Tablebase" + ], + "security": [], + "responses": { + "200": { + "description": "The tablebase information for the position in antichess.", + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + }, + "headers": { + "Access-Control-Allow-Origin": { + "schema": { + "type": "string", + "default": "'*'" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "Top10s": { + "example": { + "bullet": [ + { + "id": "bahadirozen", + "username": "BahadirOzen", + "perfs": { + "bullet": { + "rating": 3018, + "progress": 18 + } + }, + "online": true, + "title": "FM" + }, + { + "id": "penguingim1", + "username": "penguingim1", + "perfs": { + "bullet": { + "rating": 2983, + "progress": -36 + } + }, + "title": "GM", + "online": true, + "patron": true + }, + { + "id": "night-king96", + "username": "Night-King96", + "perfs": { + "bullet": { + "rating": 2958, + "progress": 35 + } + }, + "title": "GM" + } + ], + "blitz": [], + "rapid": [], + "classical": [], + "ultraBullet": [], + "chess960": [], + "crazyhouse": [], + "antichess": [], + "atomic": [], + "horde": [], + "kingOfTheHill": [], + "racingKings": [], + "threeCheck": [] + } + }, + "Leaderboard": { + "example": { + "users": [ + { + "id": "bahadirozen", + "username": "BahadirOzen", + "perfs": { + "bullet": { + "rating": 3018, + "progress": 18 + } + }, + "online": true, + "title": "FM" + }, + { + "id": "penguingim1", + "username": "penguingim1", + "perfs": { + "bullet": { + "rating": 2983, + "progress": -36 + } + }, + "title": "GM", + "online": true, + "patron": true + }, + { + "id": "night-king96", + "username": "Night-King96", + "perfs": { + "bullet": { + "rating": 2958, + "progress": 35 + } + }, + "title": "GM" + } + ] + } + }, + "Perf": { + "type": "object", + "properties": { + "games": { + "type": "integer", + "example": 2945 + }, + "rating": { + "type": "integer", + "example": 1609 + }, + "rd": { + "type": "integer", + "example": 60 + }, + "prog": { + "type": "integer", + "example": -22 + }, + "prov": { + "type": "boolean", + "description": "only appears if a user's perf rating are [provisional](https://lichess.org/faq#provisional)" + } + } + }, + "PuzzleModePerf": { + "type": "object", + "properties": { + "runs": { + "type": "integer", + "example": 44 + }, + "score": { + "type": "integer", + "example": 61 + } + } + }, + "Perfs": { + "type": "object", + "properties": { + "chess960": { + "$ref": "#/components/schemas/Perf" + }, + "atomic": { + "$ref": "#/components/schemas/Perf" + }, + "racingKings": { + "$ref": "#/components/schemas/Perf" + }, + "ultraBullet": { + "$ref": "#/components/schemas/Perf" + }, + "blitz": { + "$ref": "#/components/schemas/Perf" + }, + "kingOfTheHill": { + "$ref": "#/components/schemas/Perf" + }, + "bullet": { + "$ref": "#/components/schemas/Perf" + }, + "correspondence": { + "$ref": "#/components/schemas/Perf" + }, + "horde": { + "$ref": "#/components/schemas/Perf" + }, + "puzzle": { + "$ref": "#/components/schemas/Perf" + }, + "classical": { + "$ref": "#/components/schemas/Perf" + }, + "rapid": { + "$ref": "#/components/schemas/Perf" + }, + "storm": { + "$ref": "#/components/schemas/PuzzleModePerf" + }, + "racer": { + "$ref": "#/components/schemas/PuzzleModePerf" + }, + "streak": { + "$ref": "#/components/schemas/PuzzleModePerf" + } + } + }, + "Profile": { + "type": "object", + "properties": { + "country": { + "type": "string", + "example": "EC" + }, + "location": { + "type": "string" + }, + "bio": { + "type": "string", + "example": "Free bugs!" + }, + "firstName": { + "type": "string", + "example": "Thibault" + }, + "lastName": { + "type": "string", + "example": "Duplessis" + }, + "fideRating": { + "type": "integer", + "example": 1500, + "description": "only appears if a user has set them" + }, + "uscfRating": { + "type": "integer", + "example": 1500, + "description": "only appears if a user has set them" + }, + "ecfRating": { + "type": "integer", + "example": 1500, + "description": "only appears if a user has set them" + }, + "cfcRating": { + "type": "integer", + "example": 1500, + "description": "only appears if a user has set them" + }, + "dsbRating": { + "type": "integer", + "example": 1500, + "description": "only appears if a user has set them" + }, + "links": { + "type": "string", + "example": "github.com/ornicar\r\ntwitter.com/ornicar" + } + } + }, + "PlayTime": { + "type": "object", + "properties": { + "total": { + "type": "integer", + "example": 3296897 + }, + "tv": { + "type": "integer", + "example": 12134 + } + } + }, + "Title": { + "type": "string", + "enum": [ + "GM", + "WGM", + "IM", + "WIM", + "FM", + "WFM", + "NM", + "CM", + "WCM", + "WNM", + "LM", + "BOT" + ], + "example": "NM", + "description": "only appears if the user is a titled player or a bot user" + }, + "User": { + "type": "object", + "properties": { + "id": { + "type": "string", + "example": "georges" + }, + "username": { + "type": "string", + "example": "Georges" + }, + "perfs": { + "$ref": "#/components/schemas/Perfs" + }, + "flair": { + "type": "string", + "example": "nature.water-wave" + }, + "createdAt": { + "type": "integer", + "format": "int64", + "example": 1290415680000 + }, + "disabled": { + "type": "boolean", + "example": false, + "description": "only appears if a user's account is closed" + }, + "tosViolation": { + "type": "boolean", + "example": false, + "description": "only appears if a user's account is marked for the violation of [Lichess TOS](https://lichess.org/terms-of-service)" + }, + "profile": { + "$ref": "#/components/schemas/Profile" + }, + "seenAt": { + "type": "integer", + "format": "int64", + "example": 1522636452014 + }, + "patron": { + "type": "boolean", + "example": true + }, + "verified": { + "type": "boolean", + "example": true + }, + "playTime": { + "$ref": "#/components/schemas/PlayTime" + }, + "title": { + "$ref": "#/components/schemas/Title" + } + } + }, + "Count": { + "type": "object", + "properties": { + "all": { + "type": "integer", + "example": 9265 + }, + "rated": { + "type": "integer", + "example": 7157 + }, + "ai": { + "type": "integer", + "example": 531 + }, + "draw": { + "type": "integer", + "example": 340 + }, + "drawH": { + "type": "integer", + "example": 331 + }, + "loss": { + "type": "integer", + "example": 4480 + }, + "lossH": { + "type": "integer", + "example": 4207 + }, + "win": { + "type": "integer", + "example": 4440 + }, + "winH": { + "type": "integer", + "example": 4378 + }, + "bookmark": { + "type": "integer", + "example": 71 + }, + "playing": { + "type": "integer", + "example": 6 + }, + "import": { + "type": "integer", + "example": 66 + }, + "me": { + "type": "integer", + "example": 0 + } + } + }, + "UserExtended": { + "allOf": [ + { + "$ref": "#/components/schemas/User" + }, + { + "properties": { + "url": { + "type": "string", + "format": "uri", + "example": "https://lichess.org/@/georges" + }, + "playing": { + "type": "string", + "format": "uri", + "example": "https://lichess.org/yqfLYJ5E/black" + }, + "count": { + "$ref": "#/components/schemas/Count" + }, + "streaming": { + "type": "boolean", + "example": false + }, + "streamer": { + "example": { + "twitch": { + "channel": "https://www.twitch.tv/lichessdotorg" + }, + "youTube": { + "channel": "https://www.youtube.com/c/LichessDotOrg" + } + } + }, + "followable": { + "type": "boolean", + "example": true, + "description": "only appears if the request is [authenticated with OAuth2](#section/Introduction/Authentication)" + }, + "following": { + "type": "boolean", + "example": false, + "description": "only appears if the request is [authenticated with OAuth2](#section/Introduction/Authentication)" + }, + "blocking": { + "type": "boolean", + "example": false, + "description": "only appears if the request is [authenticated with OAuth2](#section/Introduction/Authentication)" + }, + "followsYou": { + "type": "boolean", + "example": false, + "description": "only appears if the request is [authenticated with OAuth2](#section/Introduction/Authentication)" + } + } + } + ] + }, + "RatingHistory": { + "example": [ + { + "name": "Bullet", + "points": [ + [ + 2011, + 0, + 8, + 1472 + ], + [ + 2011, + 0, + 9, + 1332 + ], + [ + 2011, + 8, + 12, + 1314 + ] + ] + }, + { + "name": "Blitz", + "points": [ + [ + 2011, + 7, + 29, + 1332 + ] + ] + } + ] + }, + "PerfType": { + "type": "string", + "enum": [ + "ultraBullet", + "bullet", + "blitz", + "rapid", + "classical", + "correspondence", + "chess960", + "crazyhouse", + "antichess", + "atomic", + "horde", + "kingOfTheHill", + "racingKings", + "threeCheck" + ] + }, + "PerfStat": { + "example": { + "perf": { + "glicko": { + "rating": 1672.42, + "deviation": 45.13, + "provisional": false + }, + "nb": 5692, + "progress": -27 + }, + "rank": 98121, + "percentile": 69.7, + "stat": { + "perfType": { + "key": "bullet", + "name": "Bullet" + }, + "highest": { + "int": 1902, + "at": "2021-05-31T08:58:53.701Z", + "gameId": "YEDqtwig" + }, + "lowest": { + "int": 1417, + "at": "2016-06-28T13:54:39.656Z", + "gameId": "rNM4J1GJ" + }, + "bestWins": { + "results": [ + { + "opInt": 2238, + "opId": { + "id": "hyperdragon84", + "name": "HyperDragon84" + }, + "at": "2019-06-19T17:09:05.187Z", + "gameId": "DGB53z9w" + }, + { + "opInt": 2089, + "opId": { + "id": "osipov", + "name": "osipov" + }, + "at": "2017-06-18T09:46:05.016Z", + "gameId": "gurRhuMi" + }, + { + "opInt": 2071, + "opId": { + "id": "spark50", + "name": "Spark50" + }, + "at": "2020-07-04T08:36:12.948Z", + "gameId": "a93Dk1mv" + }, + { + "opInt": 2045, + "opId": { + "id": "yasha43", + "name": "Yasha43" + }, + "at": "2021-05-17T14:01:41.098Z", + "gameId": "j3jZnGTr" + }, + { + "opInt": 2034, + "opId": { + "id": "midedu", + "name": "midedu" + }, + "at": "2020-06-27T17:32:47.001Z", + "gameId": "OiaMVLQ8" + } + ] + }, + "worstLosses": { + "results": [ + { + "opInt": 1186, + "opId": { + "id": "happy0", + "name": "Happy0" + }, + "at": "2016-07-07T19:48:29.077Z", + "gameId": "Q01bbiN4" + }, + { + "opInt": 1197, + "opId": { + "id": "kazmankiller86", + "name": "KazmanKiller86" + }, + "at": "2016-10-16T14:21:37.748Z", + "gameId": "Aivqh9Sp" + }, + { + "opInt": 1201, + "opId": { + "id": "artem555", + "name": "artem555" + }, + "at": "2016-08-28T16:21:30.923Z", + "gameId": "tiRAbhnX" + }, + { + "opInt": 1265, + "opId": { + "id": "arcenuu", + "name": "Arcenuu" + }, + "at": "2016-12-24T14:28:03.866Z", + "gameId": "A68wUOoh" + }, + { + "opInt": 1283, + "opId": { + "id": "amritalib76", + "name": "Amritalib76" + }, + "at": "2018-06-26T09:55:39.354Z", + "gameId": "sbNVikmo" + } + ] + }, + "count": { + "all": 5858, + "rated": 5688, + "win": 2789, + "loss": 2806, + "draw": 263, + "tour": 654, + "berserk": 1, + "opAvg": 1671.44, + "seconds": 784886, + "disconnects": 0 + }, + "resultStreak": { + "win": { + "cur": { + "v": 0 + }, + "max": { + "v": 11, + "from": { + "at": "2021-06-14T15:38:50.681Z", + "gameId": "wTX2IExo" + }, + "to": { + "at": "2021-06-15T18:41:46.970Z", + "gameId": "1z4rrjgw" + } + } + }, + "loss": { + "cur": { + "v": 3, + "from": { + "at": "2021-06-29T17:53:23.642Z", + "gameId": "pfcnjgik" + }, + "to": { + "at": "2021-06-29T18:04:48.358Z", + "gameId": "6sPaGL8T" + } + }, + "max": { + "v": 14, + "from": { + "at": "2018-06-11T14:43:39.296Z", + "gameId": "1fc9dqun" + }, + "to": { + "at": "2018-06-11T15:10:30.908Z", + "gameId": "Nzy6UgwY" + } + } + } + }, + "playStreak": { + "nb": { + "cur": { + "v": 0 + }, + "max": { + "v": 118, + "from": { + "at": "2018-06-11T10:32:21.248Z", + "gameId": "UAsNnJbN" + }, + "to": { + "at": "2018-06-11T15:13:01.193Z", + "gameId": "T7fHRaFG" + } + } + }, + "time": { + "cur": { + "v": 0 + }, + "max": { + "v": 12683, + "from": { + "at": "2018-06-12T14:11:14.021Z", + "gameId": "IrZCAW58" + }, + "to": { + "at": "2018-06-12T18:02:57.010Z", + "gameId": "RNF1mQ68" + } + } + }, + "lastDate": "2021-06-29T18:04:48.358Z" + } + } + } + }, + "PuzzleAndGame": { + "example": { + "game": { + "clock": "10+0", + "id": "VpVdGbna", + "perf": { + "key": "rapid", + "name": "Rapid" + }, + "pgn": "d4 Nf6 Nf3 g6 Nc3 d6 e4 c5 Be3 cxd4 Bxd4 Nc6 Be3 Qa5 Bd2 Bg7 Be2 O-O O-O Qb6 Rb1 Bg4 h3 Bxf3 Bxf3 Nd4 Be3 Nxf3+ Qxf3 Qc6 Bd4 a6 Bxf6 Bxf6 Nd5 Qxc2 Nxf6+ exf6 Qxf6 Qxe4 Qxd6 Rad8 Qb6 Rfe8 Rfe1 Qxe1+ Rxe1 Rxe1+ Kh2 Rd2 Kg3 Ree2 Qxb7 Rxb2 Qxa6 Rxa2 Qc8+ Kg7 Qc3+ Kg8 Qc5 Rxf2 Qc8+ Kg7 Qc3+ Kh6 Qe3+ Kg7 Qe5+ Kf8 Qh8+ Ke7 Qe5+ Kf8 Qb8+ Kg7 Qe5+ f6 Qe7+ Kh6 Qf8+ Kg5 h4+ Kh5 Qc5+ f5 Qc1 Rxg2+ Kh3 Rh2+ Kg3 Rag2+ Kf3 Rg4 Qd1 Rhxh4 Kf2 Rh2+ Kf3 Rh3+ Ke2 Rg2+ Kf1+ Rg4 Kf2 g5 Qd8 h6 Qe8+ Kh4 Kf1 h5 Qe1+ Rhg3 Qe5 f4 Qe1 f3 Kf2 Rf4 Qh1+ Rh3 Qe1 g4", + "players": [ + { + "color": "white", + "name": "borska (2013)", + "userId": "borska" + }, + { + "color": "black", + "name": "Xxn00bkillar69xX (1990)", + "userId": "xxn00bkillar69xx" + } + ], + "rated": true + }, + "puzzle": { + "id": "K69di", + "initialPly": 123, + "plays": 1970, + "rating": 2022, + "solution": [ + "e1e7", + "f4f6", + "e7f6" + ], + "themes": [ + "short", + "queenRookEndgame", + "endgame", + "mateIn2" + ] + } + } + }, + "PuzzleRoundJson": { + "type": "object", + "properties": { + "date": { + "type": "number", + "example": 1514505150384 + }, + "win": { + "type": "boolean", + "example": true + }, + "puzzle": { + "type": "object", + "example": { + "id": "K69di", + "fen": "6k1/6b1/8/4p1N1/7Q/2P2pP1/1Pq2P1K/8 w - - 14 49", + "plays": 1970, + "rating": 2022, + "solution": [ + "e1e7", + "f4f6", + "e7f6" + ], + "themes": [ + "short", + "queenRookEndgame", + "endgame", + "mateIn2" + ] + } + } + } + }, + "PuzzleDashboardJson": { + "example": { + "days": 30, + "global": { + "firstWins": 276, + "nb": 501, + "performance": 1570, + "puzzleRatingAvg": 1523, + "replayWins": 2 + }, + "themes": { + "advancedPawn": { + "results": { + "firstWins": 19, + "nb": 39, + "performance": 1438, + "puzzleRatingAvg": 1476, + "replayWins": 1 + }, + "theme": "Advanced pawn" + }, + "anastasiaMate": { + "results": { + "firstWins": 5, + "nb": 6, + "performance": 1720, + "puzzleRatingAvg": 1387, + "replayWins": 0 + }, + "theme": "Anastasia's mate" + } + } + } + }, + "StormDashboardJson": { + "example": { + "high": { + "allTime": 11, + "day": 0, + "month": 7, + "week": 0 + }, + "days": [ + { + "_id": "2021/1/28", + "combo": 8, + "errors": 1, + "highest": 1084, + "moves": 9, + "runs": 26, + "score": 4, + "time": 175 + }, + { + "_id": "2021/1/27", + "combo": 14, + "errors": 1, + "highest": 1095, + "moves": 15, + "runs": 15, + "score": 7, + "time": 23 + }, + { + "_id": "2021/1/22", + "combo": 14, + "errors": 1, + "highest": 1095, + "moves": 15, + "runs": 15, + "score": 3, + "time": 23 + } + ] + } + }, + "PuzzleRaceJson": { + "example": { + "id": "Kj1t0", + "url": "https://lichess.org/racer/Kj1t0" + } + }, + "UserPreferences": { + "type": "object", + "properties": { + "dark": { + "type": "boolean", + "example": true + }, + "transp": { + "type": "boolean", + "example": false + }, + "bgImg": { + "type": "string", + "format": "uri" + }, + "is3d": { + "type": "boolean", + "example": false + }, + "theme": { + "type": "string", + "enum": [ + "blue", + "blue2", + "blue3", + "blue-marble", + "canvas", + "wood", + "wood2", + "wood3", + "wood4", + "maple", + "maple2", + "brown", + "leather", + "green", + "marble", + "green-plastic", + "grey", + "metal", + "olive", + "newspaper", + "purple", + "purple-diag", + "pink", + "ic" + ] + }, + "pieceSet": { + "type": "string", + "enum": [ + "cburnett", + "merida", + "alpha", + "pirouetti", + "chessnut", + "chess7", + "reillycraig", + "companion", + "riohacha", + "kosal", + "leipzig", + "fantasy", + "spatial", + "california", + "pixel", + "maestro", + "fresca", + "cardinal", + "gioco", + "tatiana", + "staunty", + "governor", + "dubrovny", + "icpieces", + "shapes", + "letter" + ] + }, + "theme3d": { + "type": "string", + "enum": [ + "Black-White-Aluminium", + "Brushed-Aluminium", + "China-Blue", + "China-Green", + "China-Grey", + "China-Scarlet", + "Classic-Blue", + "Gold-Silver", + "Light-Wood", + "Power-Coated", + "Rosewood", + "Marble", + "Wax", + "Jade", + "Woodi" + ] + }, + "pieceSet3d": { + "type": "string", + "enum": [ + "Basic", + "Wood", + "Metal", + "RedVBlue", + "ModernJade", + "ModernWood", + "Glass", + "Trimmed", + "Experimental", + "Staunton", + "CubesAndPi" + ] + }, + "soundSet": { + "type": "string", + "enum": [ + "silent", + "standard", + "piano", + "nes", + "sfx", + "futuristic", + "robot", + "music", + "speech" + ] + }, + "blindfold": { + "type": "integer", + "example": 0 + }, + "autoQueen": { + "type": "integer", + "example": 2 + }, + "autoThreefold": { + "type": "integer", + "example": 2 + }, + "takeback": { + "type": "integer", + "example": 3 + }, + "moretime": { + "type": "integer", + "example": 3 + }, + "clockTenths": { + "type": "integer", + "example": 1 + }, + "clockBar": { + "type": "boolean", + "example": true + }, + "clockSound": { + "type": "boolean", + "example": true + }, + "premove": { + "type": "boolean", + "example": true + }, + "animation": { + "type": "integer", + "example": 2 + }, + "captured": { + "type": "boolean", + "example": true + }, + "follow": { + "type": "boolean", + "example": true + }, + "highlight": { + "type": "boolean", + "example": true + }, + "destination": { + "type": "boolean", + "example": true + }, + "coords": { + "type": "integer", + "example": 2 + }, + "replay": { + "type": "integer", + "example": 2 + }, + "challenge": { + "type": "integer", + "example": 4 + }, + "message": { + "type": "integer", + "example": 3 + }, + "coordColor": { + "type": "integer", + "example": 2 + }, + "submitMove": { + "type": "integer", + "example": 4 + }, + "confirmResign": { + "type": "integer", + "example": 1 + }, + "insightShare": { + "type": "integer", + "example": 1 + }, + "keyboardMove": { + "type": "integer", + "example": 0 + }, + "zen": { + "type": "integer", + "example": 0 + }, + "moveEvent": { + "type": "integer", + "example": 2 + }, + "rookCastle": { + "type": "integer", + "example": 1 + } + } + }, + "Ok": { + "properties": { + "ok": { + "type": "boolean" + } + }, + "example": { + "ok": true + } + }, + "Timeline": { + "type": "object", + "properties": { + "entries": { + "type": "array" + }, + "users": { + "type": "object" + } + }, + "example": { + "entries": [ + { + "type": "follow", + "data": { + "u1": "neio", + "u2": "chess-network" + }, + "date": 1644232201429 + }, + { + "type": "team-join", + "data": { + "userId": "neio", + "teamId": "coders" + }, + "date": 1644232201429 + }, + { + "type": "team-create", + "data": { + "userId": "neio", + "teamId": "coders" + }, + "date": 1644232201429 + }, + { + "type": "forum-post", + "data": { + "userId": "neio", + "topicId": "AAAAAAAN", + "topicName": "World's Tallest LEGO Tower Completed in City Square", + "postId": "AAAAAAAL" + }, + "date": 1644232201429 + }, + { + "type": "ublog-post", + "data": { + "userId": "neio", + "id": "og5pkt1c", + "slug": "gotta-go-fast", + "title": "Gotta Go Fast" + }, + "date": 1644232201429 + }, + { + "type": "tour-join", + "data": { + "userId": "chess-network", + "tourId": "Z24oxqgU", + "tourName": "Daily Blitz Arena" + }, + "date": 1644232201429 + }, + { + "type": "game-end", + "data": { + "fullId": "iGkAXUdEfLZC", + "perf": "correspondence", + "opponent": "chess-network", + "win": false + }, + "date": 1644232201429 + }, + { + "type": "simul-create", + "data": { + "userId": "neio", + "simulId": "m3c0Wvu3", + "simulName": "RCA 1st Jan simul" + }, + "date": 1644232201429 + }, + { + "type": "simul-join", + "data": { + "userId": "chess-network", + "simulId": "m3c0Wvu3", + "simulName": "RCA 1st Jan simul" + }, + "date": 1644232201429 + }, + { + "type": "study-like", + "data": { + "userId": "neio", + "studyId": "ma5AvZ7o", + "studyName": "Free wins | Danish Gambit" + }, + "date": 1644232201429 + }, + { + "type": "plan-start", + "data": { + "userId": "chess-network" + }, + "date": 1644232201429 + }, + { + "type": "plan-renew", + "data": { + "userId": "chess-network", + "months": 64 + }, + "date": 1644232201429 + }, + { + "type": "blog-post", + "data": { + "id": "ZUviXRIAACYAVtMm", + "slug": "lichess-development-made-easy-with-gitpod", + "title": "Lichess Development Made Easy With Gitpod" + }, + "date": 1644232201429 + }, + { + "type": "ublog-post-like", + "data": { + "userId": "neio", + "id": "ZUviXRIAACYAVtMm", + "title": "Lichess Development Made Easy With Gitpod" + }, + "date": 1644232201429 + }, + { + "type": "stream-start", + "data": { + "userId": "chess-network", + "title": "Streamers Battle December !team | lichess.org" + }, + "date": 1644232201429 + } + ], + "users": { + "neio": { + "id": "neio", + "name": "Neio", + "title": "NM" + }, + "chess-network": { + "id": "chess-network", + "name": "Chess-Network", + "title": "NM", + "patron": true + } + } + } + }, + "GamePgn": { + "example": "[Event \"Rated Blitz game\"]\n[Site \"https://lichess.org/fY44h4OY\"]\n[Date \"2018.03.29\"]\n[Round \"-\"]\n[White \"pveldman\"]\n[Black \"thibault\"]\n[Result \"1-0\"]\n[UTCDate \"2018.03.29\"]\n[UTCTime \"01:38:15\"]\n[WhiteElo \"1610\"]\n[BlackElo \"1601\"]\n[WhiteRatingDiff \"+10\"]\n[BlackRatingDiff \"-10\"]\n[Variant \"Standard\"]\n[TimeControl \"180+0\"]\n[ECO \"C62\"]\n[Opening \"Ruy Lopez: Steinitz Defense\"]\n[Termination \"Normal\"]\n[Event \"U1700 SuperBlitz Arena\"]\n\n1. e4 { [%clk 0:03:00] } e5 { [%clk 0:03:00] } 2. Nf3 { [%clk 0:02:59] } Nc6 { [%clk 0:02:58] } 3. Bb5 { [%clk 0:02:57] } d6 { [%clk 0:02:55] } 4. h3 { [%clk 0:02:54] } Nf6 { [%clk 0:02:52] } 5. Bxc6+ { [%clk 0:02:52] } bxc6 { [%clk 0:02:49] } 6. d3 { [%clk 0:02:51] } Be7 { [%clk 0:02:46] } 7. O-O { [%clk 0:02:47] } O-O { [%clk 0:02:45] } 8. b3 { [%clk 0:02:45] } d5 { [%clk 0:02:45] } 9. exd5 { [%clk 0:02:33] } cxd5 { [%clk 0:02:40] } 10. Nxe5 { [%clk 0:02:31] } Qd6 { [%clk 0:02:38] } 1-0\n" + }, + "VariantKey": { + "type": "string", + "enum": [ + "standard", + "chess960", + "crazyhouse", + "antichess", + "atomic", + "horde", + "kingOfTheHill", + "racingKings", + "threeCheck", + "fromPosition" + ], + "example": "standard", + "default": "standard" + }, + "Speed": { + "type": "string", + "enum": [ + "ultraBullet", + "bullet", + "blitz", + "rapid", + "classical", + "correspondence" + ] + }, + "GameStatus": { + "type": "string", + "description": "Game status code. https://github.com/lichess-org/scalachess/blob/0a7d6f2c63b1ca06cd3c958ed3264e738af5c5f6/src/main/scala/Status.scala#L16-L28", + "enum": [ + "created", + "started", + "aborted", + "mate", + "resign", + "stalemate", + "timeout", + "draw", + "outoftime", + "cheat", + "noStart", + "unknownFinish", + "variantEnd" + ] + }, + "LightUser": { + "type": "object", + "properties": { + "id": { + "type": "string", + "example": "chess-network" + }, + "name": { + "type": "string", + "example": "Chess-Network" + }, + "title": { + "$ref": "#/components/schemas/Title" + }, + "patron": { + "type": "boolean", + "example": true + } + }, + "required": [ + "id", + "name" + ] + }, + "GameUser": { + "type": "object", + "properties": { + "user": { + "$ref": "#/components/schemas/LightUser" + }, + "rating": { + "type": "number" + }, + "ratingDiff": { + "type": "number" + }, + "name": { + "type": "string" + }, + "provisional": { + "type": "boolean" + }, + "aiLevel": { + "type": "number" + }, + "analysis": { + "type": "object", + "properties": { + "inaccuracy": { + "type": "number" + }, + "mistake": { + "type": "number" + }, + "blunder": { + "type": "number" + }, + "acpl": { + "type": "number" + } + }, + "required": [ + "inaccuracy", + "mistake", + "blunder", + "acpl" + ] + }, + "team": { + "type": "string" + } + } + }, + "GameJson": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "rated": { + "type": "boolean" + }, + "variant": { + "$ref": "#/components/schemas/VariantKey" + }, + "speed": { + "$ref": "#/components/schemas/Speed" + }, + "perf": { + "type": "string" + }, + "createdAt": { + "type": "number", + "format": "int64" + }, + "lastMoveAt": { + "type": "number", + "format": "int64" + }, + "status": { + "$ref": "#/components/schemas/GameStatus" + }, + "players": { + "type": "object", + "properties": { + "white": { + "$ref": "#/components/schemas/GameUser" + }, + "black": { + "$ref": "#/components/schemas/GameUser" + } + } + }, + "initialFen": { + "type": "string" + }, + "winner": { + "type": "string", + "enum": [ + "white", + "black" + ] + }, + "opening": { + "type": "object", + "properties": { + "eco": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ply": { + "type": "number" + } + } + }, + "moves": { + "type": "string" + }, + "pgn": { + "type": "string" + }, + "daysPerTurn": { + "type": "number" + }, + "analysis": { + "type": "array", + "items": { + "type": "object", + "properties": { + "eval": { + "type": "number", + "description": "Evaluation in centipawns" + }, + "mate": { + "type": "number", + "description": "Number of moves until forced mate" + }, + "best": { + "type": "string", + "example": "c2c3", + "description": "Best move in UCI notation (only if played move was inaccurate)" + }, + "variation": { + "type": "string", + "example": "c3 Nc6 d4 Qb6 Be2 Nge7 Na3 cxd4 cxd4 Nf5", + "description": "Best variation in SAN notation (only if played move was inaccurate)" + }, + "judgment": { + "type": "object", + "description": "Judgment annotation (only if played move was inaccurate)", + "properties": { + "name": { + "type": "string", + "enum": [ + "Inaccuracy", + "Mistake", + "Blunder" + ] + }, + "comment": { + "type": "string", + "example": "Blunder. Nxg6 was best." + } + } + } + }, + "required": [] + } + }, + "tournament": { + "type": "string" + }, + "swiss": { + "type": "string" + }, + "clock": { + "type": "object", + "properties": { + "initial": { + "type": "number" + }, + "increment": { + "type": "number" + }, + "totalTime": { + "type": "number" + } + } + }, + "division": { + "type": "object", + "properties": { + "middle": { + "type": "number", + "description": "Ply at which the middlegame begins" + }, + "end": { + "type": "number", + "description": "Ply at which the endgame begins" + } + }, + "required": [] + } + }, + "required": [ + "id", + "rated", + "variant", + "speed", + "perf", + "createdAt", + "lastMoveAt", + "status", + "players" + ], + "example": { + "id": "q7ZvsdUF", + "rated": true, + "variant": "standard", + "speed": "blitz", + "perf": "blitz", + "createdAt": 1514505150384, + "lastMoveAt": 1514505592843, + "status": "draw", + "players": { + "white": { + "user": { + "name": "Lance5500", + "title": "LM", + "patron": true, + "id": "lance5500" + }, + "rating": 2389, + "ratingDiff": 4 + }, + "black": { + "user": { + "name": "TryingHard87", + "id": "tryinghard87" + }, + "rating": 2498, + "ratingDiff": -4 + } + }, + "opening": { + "eco": "D31", + "name": "Semi-Slav Defense: Marshall Gambit", + "ply": 7 + }, + "moves": "d4 d5 c4 c6 Nc3 e6 e4 Nd7 exd5 cxd5 cxd5 exd5 Nxd5 Nb6 Bb5+ Bd7 Qe2+ Ne7 Nxb6 Qxb6 Bxd7+ Kxd7 Nf3 Qa6 Ne5+ Ke8 Qf3 f6 Nd3 Qc6 Qe2 Kf7 O-O Kg8 Bd2 Re8 Rac1 Nf5 Be3 Qe6 Rfe1 g6 b3 Bd6 Qd2 Kf7 Bf4 Qd7 Bxd6 Nxd6 Nc5 Rxe1+ Rxe1 Qc6 f3 Re8 Rxe8 Nxe8 Kf2 Nc7 Qb4 b6 Qc4+ Nd5 Nd3 Qe6 Nb4 Ne7 Qxe6+ Kxe6 Ke3 Kd6 g3 h6 Kd3 h5 Nc2 Kd5 a3 Nc6 Ne3+ Kd6 h4 Nd8 g4 Ne6 Ke4 Ng7 Nc4+ Ke6 d5+ Kd7 a4 g5 gxh5 Nxh5 hxg5 fxg5 Kf5 Nf4 Ne3 Nh3 Kg4 Ng1 Nc4 Kc7 Nd2 Kd6 Kxg5 Kxd5 f4 Nh3+ Kg4 Nf2+ Kf3 Nd3 Ke3 Nc5 Kf3 Ke6 Ke3 Kf5 Kd4 Ne6+ Kc4", + "clock": { + "initial": 300, + "increment": 3, + "totalTime": 420 + } + } + }, + "GameStream": { + "example": [ + { + "id": "A5fcMO3k", + "rated": true, + "variant": "standard", + "speed": "bullet", + "perf": "bullet", + "createdAt": 1525789431889, + "status": 20, + "statusName": "started", + "clock": { + "initial": 60, + "increment": 0, + "totalTime": 60 + }, + "players": { + "white": { + "userId": "kastorcito", + "rating": 2617 + }, + "black": { + "userId": "er_or", + "rating": 2288 + } + } + } + ] + }, + "MoveStream": { + "example": [ + { + "id": "LuGQwhBb", + "variant": { + "key": "standard", + "name": "Standard", + "short": "Std" + }, + "speed": "blitz", + "perf": "blitz", + "rated": true, + "initialFen": "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", + "fen": "rnbqkb1r/1p1ppppp/p6n/2p4Q/8/1P2P3/P1PP1PPP/RNB1KBNR w KQkq - 0 4", + "player": "white", + "turns": 6, + "startedAtTurn": 0, + "source": "pool", + "status": { + "id": 20, + "name": "started" + }, + "createdAt": 1620029815106, + "lastMove": "c7c5", + "players": { + "white": { + "user": { + "name": "ARM-777777", + "title": "GM", + "id": "arm-777777" + }, + "rating": 3120 + }, + "black": { + "user": { + "name": "Flash_Marafon", + "id": "flash_marafon" + }, + "rating": 3015 + } + } + }, + { + "fen": "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w", + "wc": 180, + "bc": 180 + }, + { + "fen": "rnbqkbnr/pppppppp/8/8/8/4P3/PPPP1PPP/RNBQKBNR b", + "lm": "e2e3", + "wc": 180, + "bc": 180 + }, + { + "fen": "rnbqkb1r/pppppppp/7n/8/8/4P3/PPPP1PPP/RNBQKBNR w", + "lm": "g8h6", + "wc": 180, + "bc": 180 + }, + { + "fen": "rnbqkb1r/pppppppp/7n/8/8/1P2P3/P1PP1PPP/RNBQKBNR b", + "lm": "b2b3", + "wc": 177, + "bc": 180 + }, + { + "fen": "rnbqkb1r/1ppppppp/p6n/8/8/1P2P3/P1PP1PPP/RNBQKBNR w", + "lm": "a7a6", + "wc": 177, + "bc": 177 + } + ] + }, + "TvFeed": { + "type": "object", + "properties": { + "t": { + "type": "string" + }, + "d": { + "type": "object" + } + } + }, + "Clock": { + "type": "object", + "properties": { + "limit": { + "type": "integer" + }, + "increment": { + "type": "integer" + } + } + }, + "Variant": { + "type": "object", + "properties": { + "key": { + "$ref": "#/components/schemas/VariantKey" + }, + "name": { + "type": "string" + }, + "short": { + "type": "string" + } + } + }, + "ArenaStatus": { + "type": "integer", + "description": "10: created, 20: started, 30: finished\n", + "enum": [ + 10, + 20, + 30 + ], + "example": 30 + }, + "ArenaPerf": { + "type": "object", + "properties": { + "key": { + "type": "string", + "example": "blitz" + }, + "name": { + "type": "string", + "example": "Blitz" + }, + "position": { + "type": "integer", + "example": 1 + }, + "icon": { + "type": "string", + "example": ")" + } + } + }, + "ArenaRatingObj": { + "type": "object", + "properties": { + "perf": { + "$ref": "#/components/schemas/PerfType" + }, + "rating": { + "type": "integer", + "example": 1700 + } + } + }, + "ArenaPosition": { + "oneOf": [ + { + "type": "object", + "title": "Thematic", + "properties": { + "eco": { + "type": "string", + "example": "C41" + }, + "name": { + "type": "string", + "example": "Philidor Defense" + }, + "fen": { + "type": "string", + "example": "rnbqkbnr/ppp2ppp/3p4/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq -" + }, + "url": { + "type": "string", + "example": "https://lichess.org/opening/Philidor_Defense" + } + } + }, + { + "type": "object", + "title": "Custom position", + "properties": { + "name": { + "type": "string", + "const": "Custom position" + }, + "fen": { + "type": "string", + "example": "rnbq1bnr/ppppkppp/8/4p3/4P3/8/PPPPKPPP/RNBQ1BNR w - - 2 3" + } + } + } + ] + }, + "ArenaTournament": { + "type": "object", + "properties": { + "id": { + "type": "string", + "example": "QITRjufu" + }, + "createdBy": { + "type": "string", + "example": "lichess" + }, + "system": { + "type": "string", + "const": "arena" + }, + "minutes": { + "type": "integer", + "example": 57 + }, + "clock": { + "$ref": "#/components/schemas/Clock" + }, + "rated": { + "type": "boolean", + "example": true + }, + "fullName": { + "type": "string", + "example": "U1700 SuperBlitz Arena" + }, + "nbPlayers": { + "type": "integer", + "example": 154 + }, + "variant": { + "$ref": "#/components/schemas/Variant" + }, + "startsAt": { + "type": "integer", + "example": 1522803600000 + }, + "finishesAt": { + "type": "integer", + "example": 1522807200000 + }, + "status": { + "$ref": "#/components/schemas/ArenaStatus" + }, + "perf": { + "$ref": "#/components/schemas/ArenaPerf" + }, + "secondsToStart": { + "type": "integer", + "example": 576 + }, + "hasMaxRating": { + "type": "boolean", + "example": true + }, + "maxRating": { + "$ref": "#/components/schemas/ArenaRatingObj" + }, + "minRating": { + "$ref": "#/components/schemas/ArenaRatingObj" + }, + "minRatedGames": { + "type": "object", + "properties": { + "nb": { + "type": "integer", + "example": 20 + }, + "perf": { + "$ref": "#/components/schemas/PerfType", + "example": "blitz" + } + } + }, + "onlyTitled": { + "type": "boolean", + "example": false + }, + "teamMember": { + "type": "string", + "example": "coders" + }, + "private": { + "type": "boolean", + "example": true + }, + "position": { + "$ref": "#/components/schemas/ArenaPosition" + }, + "schedule": { + "type": "object", + "properties": { + "freq": { + "type": "string", + "example": "hourly" + }, + "speed": { + "type": "string", + "example": "superblitz" + } + } + }, + "teamBattle": { + "type": "object", + "properties": { + "teams": { + "type": "array", + "items": { + "type": "string", + "example": "coders" + } + }, + "nbLeaders": { + "type": "integer", + "example": 3 + } + } + }, + "winner": { + "type": "object", + "properties": { + "id": { + "type": "string", + "example": "lichess" + }, + "name": { + "type": "string", + "example": "lichess" + }, + "title": { + "$ref": "#/components/schemas/Title" + } + } + } + } + }, + "ArenaTournaments": { + "type": "object", + "properties": { + "created": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ArenaTournament" + } + }, + "started": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ArenaTournament" + } + }, + "finished": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ArenaTournament" + } + } + } + }, + "FromPositionFEN": { + "type": "string", + "description": "Custom initial position (in FEN). Variant must be standard, fromPosition, or chess960 (if a valid 960 starting position), and the game cannot be rated.", + "default": "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1" + }, + "ArenaTournamentVariantIsKey": { + "example": { + "id": "QITRjufu", + "fullName": "U1700 SuperBlitz Arena", + "rated": true, + "clock": { + "increment": 0, + "limit": 180 + }, + "minutes": 57, + "createdBy": "lichess", + "system": "arena", + "secondsToStart": 0, + "secondsToFinish": 36000, + "isFinished": true, + "isRecentlyFinished": true, + "pairingsClosed": true, + "startsAt": 1522803600000, + "nbPlayers": 154, + "perf": { + "icon": ")", + "key": "blitz", + "name": "Blitz", + "position": 1 + }, + "schedule": { + "freq": "hourly", + "speed": "superblitz" + }, + "variant": "standard", + "duels": [ + { + "id": "0MM6q4tQ", + "p": [ + { + "n": "player1", + "r": 1500, + "k": 3 + }, + { + "n": "player2", + "r": 1500, + "k": 3 + } + ] + } + ], + "standings": { + "page": 1, + "players": [ + { + "name": "player1", + "rank": 1, + "rating": 1500, + "score": 3, + "sheet": { + "scores": [ + { + "0": 2, + "1": 2 + }, + { + "0": 4, + "1": 3 + }, + 0 + ], + "total": 6, + "fire": true + } + } + ] + }, + "featured": { + "id": "khe72Fer", + "fen": "rn1qkb1r/pQ3ppp/2b2n2/8/5P2/4P3/PP4PP/RNB1KBNR", + "color": "black", + "lastMove": "d7c6", + "white": { + "rank": 2, + "name": "player1", + "rating": 1360 + }, + "black": { + "rank": 5, + "name": "player2", + "rating": 1431 + } + }, + "podium": [ + { + "name": "player1", + "rank": 1, + "rating": 1500, + "score": 3, + "sheet": { + "scores": [ + { + "0": 2, + "1": 2 + }, + { + "0": 4, + "1": 3 + }, + 0 + ], + "total": 6, + "fire": true + }, + "nb": { + "game": 3, + "beserk": 0, + "win": 2 + }, + "performance": 1787 + } + ], + "stats": { + "games": 454, + "moves": 27542, + "whiteWins": 236, + "blackWins": 207, + "draws": 11, + "berserks": 0, + "averageRating": 1320 + } + } + }, + "Error": { + "properties": { + "error": { + "type": "string", + "description": "The cause of the error." + } + }, + "example": { + "error": "This request is invalid because [...]" + } + }, + "SwissTournament": { + "example": { + "rated": true, + "clock": { + "increment": 0, + "limit": 300 + }, + "createdBy": "thibault", + "id": "ZmKWCOye", + "name": "Wang", + "nbOngoing": 0, + "nbPlayers": 0, + "nbRounds": 2, + "nextRound": { + "at": "2020-05-11T12:23:18.233-06:00", + "in": 600 + }, + "round": 0, + "startsAt": "2020-05-11T12:23:18.233-06:00", + "status": "created", + "variant": "standard", + "isRecentlyFinished": false, + "password": true, + "stats": { + "absences": 1608, + "averageRating": 1588, + "blackWins": 42541, + "byes": 12, + "draws": 0, + "games": 42689, + "whiteWins": 42837 + } + } + }, + "SwissUnauthorisedEdit": { + "properties": { + "error": { + "type": "string" + } + }, + "example": { + "error": "This user cannot edit this swiss" + } + }, + "StudyPgn": { + "example": "[Event \"All about the Sicilian Defense: Dragon Variation\"]\n[Site \"https://lichess.org/study/8c8bmUfy/qwnXMwVC\"]\n[Result \"*\"]\n[UTCDate \"2017.06.25\"]\n[UTCTime \"10:12:04\"]\n[Variant \"Standard\"]\n[ECO \"B76\"]\n[Opening \"Sicilian Defense: Dragon Variation, Yugoslav Attack, Panov Variation\"]\n[Annotator \"https://lichess.org/@/Francesco_Super\"]\n\n{ This chapter will go over the Dragon Variation, a very common variation used by Black and it is the most aggressive variation in the Sicilian defense. }\n1. e4 c5 2. Nf3 { Simple developing move to control the d4 square } { [%csl Gd4,Gc5][%cal Gf3d4,Gc5d4] } 2... d6 { [%cal Gd6e5] } (2... e6 3. d4 cxd4 4. Nxd4 Nf6 5. e5 (5. Nc3 { [%cal Ge4e5] }) 5... Qa5+) 3. d4 { Whites want the exchange of pawns } { [%cal Gc5d4] } 3... cxd4 { [%cal Gf3d4] } 4. Nxd4 { Whites are now ahead in development but blacks still have the two central pawns whereas whites only one. } { [%csl Ge7,Gd6,Ge4] } 4... Nf6 { Blacks are now developing their knight and threatening the e4 pawn } { [%csl Ge4][%cal Gf6e4] } 5. Nc3 { The e4 pawn is now protected by the c3 knight } { [%csl Ge4,Bc3][%cal Rf6e4,Bc3e4] } 5... g6 { This is the DRAGON VARIATION. g6 allows the dark-squared bishop to develop and move to g7, controlling the long dark-squared diagonal } { [%csl Gd4] } 6. Be3 { [%cal Gd1d2,Gf2f3,Ge1c1,Gg2g4,Gh2h4,Gg4g5] } (6. Be2 Bg7 7. O-O Nc6 8. Be3 { [%cal Ge3d4] } (8. f3 Nxe4 { [%cal Gg7d4,Gc6d4] } 9. Nxc6 Qb6+ { [%cal Gb6c6,Gb6g1] } 10. Kh1 Nxc3 { [%cal Gc3d1,Gc3e2] } 11. bxc3 bxc6 { [%cal Gc8a6] }) 8... O-O 9. Nb3 a6 { [%cal Gb7b5,Gb5b4,Ge2c4] }) 6... Bg7 (6... Ng4 { [%cal Gg4e3] } 7. Bb5+ { [%cal Gb5e8,Gb8d7,Gc8d7,Gd1g4] } 7... Nc6 8. Nxc6 bxc6 9. Bxc6+ { [%cal Gc6a8] }) 7. f3 { The key opening moves for White, who attempt to castle queenside , whereas f3 strengthens the pawn structure, connecting e4 to the h2 and g2, while White also plan pushing to g4 and possibly h4. } { [%csl Bf3,Be3][%cal Rg2g4,Rh2h4,Rg4g5] } 7... O-O (7... h5 { Is operating against g4. }) 8. Qd2 { [%csl Gh6,Gg7][%cal Ge1c1,Ga1d1,Re3h6,Rd2h6] } 8... Nc6 { [%csl Gc6,Gh6][%cal Gb8c6,Ge1c1,Ga7a6,Ge3h6] } 9. g4 (9. Bh6 { [%cal Ge3d4] } 9... Bxh6 10. Qxh6 Nxd4) 9... Be6 10. Nxe6 fxe6 { [%cal Gf8f1] } 11. O-O-O Ne5 12. Be2 { [%csl Gf3][%cal Re5f3,Bd1h1,Bg1d1] } 12... Qc7 { [%csl Gc4][%cal Ge5c4,Gc4e3,Gc4d2,Bf8c8,Yc7c3] } 13. h4 Nc4 *\n" + }, + "StudyImportPgnChapters": { + "example": { + "chapters": [ + { + "id": "WTvnkWAL", + "name": "Game 2" + } + ] + } + }, + "StudyMetadata": { + "example": { + "id": "WTvnkWAL", + "name": "Guess the move", + "createdAt": 1463756350225, + "updatedAt": 1469965025205 + } + }, + "BroadcastTour": { + "example": { + "tour": { + "id": "QYiOYnl1", + "name": "New in Chess Classic | Finals", + "slug": "new-in-chess-classic--finals", + "description": "Match for 1st 2nd and 3rd place.", + "url": "https://lichess.org/broadcast/new-in-chess-classic--finals/phgcXuBl", + "createdAt": 1525789431889 + }, + "rounds": [ + { + "id": "BueO56UJ", + "name": "Finals Day 1", + "slug": "finals-day-1", + "url": "https://lichess.org/broadcast/new-in-chess-classic--finals/finals-day-1/BueO56UJ", + "createdAt": 1525789431889 + }, + { + "id": "yeGGfkfY", + "name": "Finals Day 2", + "slug": "finals-day-2", + "url": "https://lichess.org/broadcast/new-in-chess-classic--finals/finals-day-2/yeGGfkfY", + "createdAt": 1525789431889 + } + ] + } + }, + "BroadcastForm": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the broadcast tournament. Length must be between 3 and 80 characters.\n\nExample: `Sinquefield Cup`\n" + }, + "description": { + "type": "string", + "description": "Short description of the broadcast tournament. Length must be between 3 and 400 characters.\n\nExample: `An 11 round classical tournament featuring the 9 highest rated players in the world. Including Carlsen, Caruana, Ding, Aronian, Nakamura and more.`\n" + }, + "autoLeaderboard": { + "type": "boolean", + "description": "Compute and display a simple leaderboard based on game results" + }, + "markdown": { + "type": "string", + "description": "Optional long description of the broadcast. Markdown is supported. Length must be less than 20,000 characters." + }, + "tier": { + "type": "integer", + "description": "Optional, for Lichess admins only, use to feature on /broadcast.\n\n* `3` for normal\n* `4` for high\n* `5` for best\n" + }, + "players": { + "description": "Optional replace player names, ratings and titles.\n\nOne line per player, formatted as such:\n\n`player name = FIDE ID`\n\nExample:\n\n`Magnus Carlsen = 1503014`\n\nPlayer names ignore case and punctuation, and match all possible combinations of 2 words:\n\"Jorge Rick Vito\" will match \"Jorge Rick\", \"jorge vito\", \"Rick, Vito\", etc. \n\nAlternatively, you may set tags manually, like so:\n\n`player name / rating / title / new name`\n\nAll values are optional. Example:\n\n`Magnus Carlsen / 2863 / GM` \n`YouGotLittUp / 1890 / / Louis Litt`\n" + } + }, + "required": [ + "name", + "description", + "autoLeaderboard" + ] + }, + "BroadcastLeaderboardEntry": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "Hernandez Riera, Jose" + }, + "score": { + "type": "number", + "example": 2.5 + }, + "played": { + "type": "integer", + "example": 7 + }, + "rating": { + "type": "integer", + "example": 2149 + }, + "title": { + "type": "string", + "example": "FM" + }, + "fideId": { + "type": "integer", + "example": 3408230 + }, + "fed": { + "type": "string", + "example": "CHI" + } + } + }, + "BroadcastRound": { + "example": { + "round": { + "id": "BueO56UJ", + "name": "Finals Day 1", + "slug": "finals-day-1", + "url": "https://lichess.org/broadcast/new-in-chess-classic--finals/finals-day-1/BueO56UJ", + "createdAt": 1525789431889 + }, + "tour": { + "id": "QYiOYnl1", + "name": "New in Chess Classic | Finals", + "slug": "new-in-chess-classic--finals", + "description": "Match for 1st 2nd and 3rd place.", + "url": "https://lichess.org/broadcast/new-in-chess-classic--finals/phgcXuBl", + "createdAt": 1525789431889 + }, + "study": { + "writeable": true + }, + "games": [ + { + "id": "GRjidNTw", + "name": "Martin Fargac - Vit Kostka", + "ongoing": true, + "res": "*", + "url": "https://lichess.org/broadcast/new-in-chess-classic--finals/round-4/iCEwAzEX/GRjidNTw" + }, + { + "id": "81TcKCWT", + "name": "Pavel Zabystrzan - Kilian Slovak", + "res": "½-½", + "url": "https://lichess.org/broadcast/new-in-chess-classic--finals/round-4/iCEwAzEX/tJpK7gbl" + }, + { + "id": "xEfufedI", + "name": "Roman Pilch - Bartolomej Buchta", + "res": "1-0", + "url": "https://lichess.org/broadcast/new-in-chess-classic--finals/round-4/iCEwAzEX/xEfufedI" + } + ] + } + }, + "BroadcastPgnPush": { + "type": "object", + "properties": { + "games": { + "type": "array", + "items": { + "type": "object", + "properties": { + "tags": { + "type": "object" + }, + "moves": { + "type": "integer" + }, + "error": { + "type": "string" + } + } + } + } + } + }, + "BroadcastMyRound": { + "example": { + "tour": { + "description": "April 18th - 28th | 10-round Swiss | Classical time control", + "id": "x7WskVz3", + "name": "Moonway Chess Festival", + "tier": "high", + "slug": "moonway-chess-festival" + }, + "round": { + "finished": true, + "id": "LXfsdxuf", + "name": "Round 5", + "slug": "round-5", + "startsAt": 1682168400000, + "url": "https://lichess.org/broadcast/moonway-chess-festival/round-5/LXfsdxuf" + }, + "study": { + "writeable": true + } + } + }, + "Simul": { + "example": { + "id": "pDGbxhUe", + "name": "GM ChessWeeb", + "fullName": "GM ChessWeeb simul", + "host": { + "id": "chessweeb", + "name": "ChessWeeb", + "rating": 1500, + "title": "GM" + }, + "isCreated": false, + "isFinished": true, + "isRunning": false, + "estimatedStartAt": 1620029815106, + "startedAt": 1620029815106, + "finishedAt": 1620029937283, + "nbApplicants": 0, + "nbPairings": 24, + "text": "", + "variants": [ + { + "icon": "+", + "key": "standard", + "name": "Standard" + } + ] + } + }, + "Team": { + "type": "object", + "properties": { + "id": { + "type": "string", + "example": "coders" + }, + "name": { + "type": "string", + "example": "Coders" + }, + "description": { + "type": "string", + "example": "There are 10 kinds of people in the world: those who understand binary, and the others.\r\n\r\nIf you want to join the team, prove (briefly) that you can code in the request message!" + }, + "open": { + "type": "boolean", + "example": false + }, + "leaders": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LightUser" + } + }, + "nbMembers": { + "type": "integer", + "example": 3129 + } + } + }, + "TeamPaginatorJson": { + "type": "object", + "properties": { + "currentPage": { + "type": "number", + "example": 4 + }, + "maxPerPage": { + "type": "number", + "example": 15 + }, + "currentPageResults": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Team" + } + }, + "nbResults": { + "type": "number", + "example": 205194 + }, + "previousPage": { + "type": [ + "number", + null + ], + "example": 3 + }, + "nextPage": { + "type": [ + "number", + null + ], + "example": 5 + }, + "nbPages": { + "type": "number", + "example": 13680 + } + } + }, + "TeamRequest": { + "type": "object", + "properties": { + "teamId": { + "type": "string", + "example": "coders" + }, + "userId": { + "type": "string", + "example": "thibault" + }, + "date": { + "type": "number", + "example": 1514505150384 + }, + "message": { + "type": "string", + "example": "Hello, I would like to join the team!" + } + } + }, + "TeamRequestWithUser": { + "type": "object", + "properties": { + "request": { + "$ref": "#/components/schemas/TeamRequest" + }, + "user": { + "$ref": "#/components/schemas/User" + } + } + }, + "Crosstable": { + "example": { + "users": { + "neio": 201.5, + "thibault": 144.5 + }, + "nbGames": 346, + "matchup": { + "users": { + "neio": 44, + "thibault": 43 + }, + "nbGames": 87 + } + } + }, + "LightUserOnline": { + "allOf": [ + { + "$ref": "#/components/schemas/LightUser" + }, + { + "properties": { + "online": { + "type": "boolean" + } + } + } + ] + }, + "UserNote": { + "type": "object", + "properties": { + "from": { + "$ref": "#/components/schemas/LightUser" + }, + "to": { + "$ref": "#/components/schemas/LightUser" + }, + "text": { + "type": "string", + "example": "This is a note" + }, + "date": { + "type": "integer", + "format": "int64", + "example": 1290415680000 + } + } + }, + "GameEventInfo": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "source": { + "type": "string", + "enum": [ + "lobby", + "friend", + "ai", + "api", + "tournament", + "position", + "import", + "importlive", + "simul", + "relay", + "pool", + "swiss" + ] + }, + "status": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "enum": [ + 10, + 20, + 25, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 60 + ] + }, + "name": { + "$ref": "#/components/schemas/GameStatus" + } + } + }, + "winner": { + "type": "string", + "enum": [ + "white", + "black" + ] + }, + "compat": { + "type": "object", + "properties": { + "bot": { + "type": "boolean" + }, + "board": { + "type": "boolean" + } + } + } + } + }, + "GameStartEvent": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "gameStart" + }, + "game": { + "$ref": "#/components/schemas/GameEventInfo" + } + }, + "example": { + "type": "gameStart", + "game": { + "gameId": "rCRw1AuO", + "fullId": "rCRw1AuOvonq", + "color": "black", + "fen": "r1bqkbnr/pppp2pp/2n1pp2/8/8/3PP3/PPPB1PPP/RN1QKBNR w KQkq - 2 4", + "hasMoved": true, + "isMyTurn": false, + "lastMove": "b8c6", + "opponent": { + "id": "philippe", + "rating": 1790, + "username": "Philippe" + }, + "perf": "correspondence", + "rated": true, + "secondsLeft": 1209600, + "source": "friend", + "status": { + "id": 20, + "name": "started" + }, + "speed": "correspondence", + "variant": { + "key": "standard", + "name": "Standard" + }, + "compat": { + "bot": false, + "board": true + }, + "id": "rCRw1AuO" + } + } + }, + "GameFinishEvent": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "gameFinish" + }, + "game": { + "$ref": "#/components/schemas/GameEventInfo" + } + }, + "example": { + "type": "gameFinish", + "game": { + "gameId": "rCRw1AuO", + "fullId": "rCRw1AuOvonq", + "color": "black", + "fen": "r1bqkbnr/pppp2pp/2n1pp2/8/8/3PP3/PPPB1PPP/RN1QKBNR w KQkq - 2 4", + "hasMoved": true, + "isMyTurn": false, + "lastMove": "b8c6", + "opponent": { + "id": "philippe", + "username": "Philippe", + "rating": 1790, + "ratingDiff": -12 + }, + "perf": "correspondence", + "rated": true, + "secondsLeft": 1209600, + "source": "friend", + "status": { + "id": 31, + "name": "resign" + }, + "speed": "correspondence", + "variant": { + "key": "standard", + "name": "Standard" + }, + "compat": { + "bot": false, + "board": true + }, + "winner": "black", + "ratingDiff": 8, + "id": "rCRw1AuO" + } + } + }, + "ChallengeUser": { + "allOf": [ + { + "$ref": "#/components/schemas/LightUser" + } + ], + "properties": { + "rating": { + "type": "number" + }, + "provisional": { + "type": "boolean" + }, + "online": { + "type": "boolean" + } + } + }, + "ChallengeJson": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "url": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "created", + "offline", + "canceled", + "declined", + "accepted" + ] + }, + "challenger": { + "$ref": "#/components/schemas/ChallengeUser" + }, + "destUser": { + "oneOf": [ + { + "$ref": "#/components/schemas/ChallengeUser" + }, + { + "type": null + } + ] + }, + "variant": { + "$ref": "#/components/schemas/Variant" + }, + "rated": { + "type": "boolean" + }, + "speed": { + "$ref": "#/components/schemas/Speed" + }, + "timeControl": { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "type": "string", + "example": "clock" + }, + "limit": { + "type": "number" + }, + "increment": { + "type": "number" + }, + "show": { + "example": "5+2", + "type": "string" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "example": "correspondence" + }, + "daysPerTurn": { + "type": "number" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "example": "unlimited" + } + }, + "additionalProperties": false + } + ] + }, + "color": { + "type": "string", + "enum": [ + "white", + "black", + "random" + ] + }, + "perf": { + "type": "object", + "properties": { + "icon": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "direction": { + "type": "string", + "enum": [ + "in", + "out" + ] + }, + "initialFen": { + "type": "string" + }, + "declineReason": { + "type": "string", + "description": "Human readable, possibly translated reason why the challenge was declined." + }, + "declineReasonKey": { + "type": "string", + "description": "Untranslated, computer-matchable reason why the challenge was declined." + } + }, + "required": [ + "id", + "url", + "status", + "challenger", + "destUser", + "variant", + "rated", + "speed", + "timeControl", + "color", + "perf" + ], + "example": { + "id": "VU0nyvsW", + "url": "https://lichess.org/VU0nyvsW", + "color": "random", + "direction": "out", + "timeControl": { + "increment": 2, + "limit": 300, + "show": "5+2", + "type": "clock" + }, + "variant": { + "key": "standard", + "name": "Standard", + "short": "Std" + }, + "challenger": { + "id": "thibot", + "name": "thibot", + "online": true, + "provisional": false, + "rating": 1940, + "title": "BOT" + }, + "destUser": { + "id": "leelachess", + "name": "LeelaChess", + "online": true, + "provisional": true, + "rating": 2670, + "title": "BOT" + }, + "perf": { + "icon": ";", + "name": "Correspondence" + }, + "rated": true, + "speed": "blitz", + "status": "created" + } + }, + "ChallengeEvent": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "challenge" + }, + "challenge": { + "$ref": "#/components/schemas/ChallengeJson" + } + } + }, + "ChallengeCanceledEvent": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "challengeCanceled" + }, + "challenge": { + "$ref": "#/components/schemas/ChallengeJson" + } + }, + "example": { + "type": "challengeCanceled", + "challenge": { + "id": "7pGLxJ4F", + "url": "https://lichess.org/VU0nyvsW", + "status": "canceled", + "compat": { + "bot": false, + "board": true + }, + "challenger": { + "id": "lovlas", + "name": "Lovlas", + "title": "IM", + "rating": 2506, + "patron": true, + "online": true, + "lag": 24 + }, + "destUser": { + "id": "thibot", + "name": "thibot", + "rating": 1500, + "provisional": true, + "online": true, + "lag": 45 + }, + "variant": { + "key": "standard", + "name": "Standard", + "short": "Std" + }, + "rated": true, + "timeControl": { + "type": "clock", + "limit": 300, + "increment": 25, + "show": "5+25" + }, + "color": "random", + "finalColor": "black", + "speed": "rapid", + "perf": { + "icon": "#", + "name": "Rapid" + } + } + } + }, + "ChallengeCanceledJson": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "example": { + "id": "VU0nyvsW" + } + }, + "ChallengeDeclinedEvent": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "challengeDeclined" + }, + "challenge": { + "$ref": "#/components/schemas/ChallengeCanceledJson" + } + }, + "example": { + "type": "challengeDeclined", + "challenge": { + "id": "7pGLxJ4F", + "url": "https://lichess.org/VU0nyvsW", + "status": "declined", + "compat": { + "bot": false, + "board": true + }, + "challenger": { + "id": "lovlas", + "name": "Lovlas", + "title": "IM", + "rating": 2506, + "patron": true, + "online": true, + "lag": 24 + }, + "destUser": { + "id": "thibot", + "name": "thibot", + "title": null, + "rating": 1500, + "provisional": true, + "online": true, + "lag": 45 + }, + "variant": { + "key": "standard", + "name": "Standard", + "short": "Std" + }, + "rated": true, + "timeControl": { + "type": "clock", + "limit": 300, + "increment": 25, + "show": "5+25" + }, + "color": "random", + "finalColor": "white", + "speed": "rapid", + "perf": { + "icon": "#", + "name": "Rapid" + }, + "declineReason": "I'm not accepting challenges at the moment.", + "declineReasonKey": "generic" + } + } + }, + "GameEventPlayer": { + "type": "object", + "properties": { + "aiLevel": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "title": { + "type": [ + "string", + null + ] + }, + "rating": { + "type": "number" + }, + "provisional": { + "type": "boolean" + } + } + }, + "GameStateEvent": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "gameState" + }, + "moves": { + "type": "string", + "description": "Current moves in UCI format" + }, + "wtime": { + "type": "integer", + "description": "Integer of milliseconds White has left on the clock" + }, + "btime": { + "type": "integer", + "description": "Integer of milliseconds Black has left on the clock" + }, + "winc": { + "type": "integer", + "description": "Integer of White Fisher increment." + }, + "binc": { + "type": "integer", + "description": "Integer of Black Fisher increment." + }, + "status": { + "$ref": "#/components/schemas/GameStatus" + }, + "winner": { + "type": "string", + "description": "Color of the winner, if any" + }, + "wdraw": { + "type": "boolean", + "description": "true if white is offering draw, else omitted" + }, + "bdraw": { + "type": "boolean", + "description": "true if black is offering draw, else omitted" + }, + "wtakeback": { + "type": "boolean", + "description": "true if white is proposing takeback, else omitted" + }, + "btakeback": { + "type": "boolean", + "description": "true if black is proposing takeback, else omitted" + } + }, + "required": [ + "type", + "moves", + "wtime", + "btime", + "winc", + "binc", + "status" + ], + "example": { + "type": "gameState", + "moves": "e2e4 c7c5 f2f4 d7d6 g1f3 b8c6 f1c4 g8f6 d2d3 g7g6 e1g1 f8g7 b1c3", + "wtime": 7598040, + "btime": 8395220, + "winc": 10000, + "binc": 10000, + "wdraw": false, + "bdraw": false, + "status": "started" + } + }, + "GameFullEvent": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "gameFull" + }, + "id": { + "type": "string" + }, + "variant": { + "$ref": "#/components/schemas/Variant" + }, + "clock": { + "oneOf": [ + { + "$ref": "#/components/schemas/Clock" + }, + { + "type": null + } + ] + }, + "speed": { + "$ref": "#/components/schemas/Speed" + }, + "perf": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Translated perf name (e.g. \"Classical\" or \"Blitz\")" + } + } + }, + "rated": { + "type": "boolean" + }, + "createdAt": { + "type": "number", + "format": "int64" + }, + "white": { + "$ref": "#/components/schemas/GameEventPlayer" + }, + "black": { + "$ref": "#/components/schemas/GameEventPlayer" + }, + "initialFen": { + "type": "string", + "default": "startpos" + }, + "state": { + "$ref": "#/components/schemas/GameStateEvent" + }, + "tournamentId": { + "type": "string" + } + }, + "required": [ + "type", + "id", + "variant", + "clock", + "speed", + "perf", + "rated", + "createdAt", + "white", + "black", + "initialFen", + "state" + ], + "example": { + "type": "gameFull", + "id": "5IrD6Gzz", + "rated": true, + "variant": { + "key": "standard", + "name": "Standard", + "short": "Std" + }, + "clock": { + "initial": 1200000, + "increment": 10000 + }, + "speed": "classical", + "perf": { + "name": "Classical" + }, + "createdAt": 1523825103562, + "white": { + "id": "lovlas", + "name": "lovlas", + "provisional": false, + "rating": 2500, + "title": "IM" + }, + "black": { + "id": "leela", + "name": "leela", + "rating": 2390 + }, + "initialFen": "startpos", + "state": { + "type": "gameState", + "moves": "e2e4 c7c5 f2f4 d7d6 g1f3 b8c6 f1c4 g8f6 d2d3 g7g6 e1g1 f8g7", + "wtime": 7598040, + "btime": 8395220, + "winc": 10000, + "binc": 10000, + "wdraw": false, + "bdraw": false, + "status": "started" + } + } + }, + "ChatLineEvent": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "chatLine" + }, + "room": { + "type": "string", + "enum": [ + "player", + "spectator" + ] + }, + "username": { + "type": "string" + }, + "text": { + "type": "string" + } + }, + "required": [ + "type", + "room", + "username", + "text" + ], + "example": { + "type": "chatLine", + "username": "thibault", + "text": "Good luck, have fun", + "room": "player" + } + }, + "OpponentGone": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "opponentGone" + }, + "gone": { + "type": "boolean" + }, + "claimWinInSeconds": { + "type": "number" + } + }, + "required": [ + "type", + "gone" + ], + "example": { + "type": "opponentGone", + "gone": true, + "claimWinInSeconds": 8 + } + }, + "NotFound": { + "properties": { + "error": { + "type": "string" + } + }, + "example": { + "error": "Not found." + } + }, + "GameChat": { + "example": [ + { + "text": "Takeback sent", + "user": "lichess" + }, + { + "text": "Takeback accepted", + "user": "lichess" + }, + { + "text": "Good game, well played", + "user": "thibault" + } + ] + }, + "ChallengeOpenJson": { + "example": { + "id": "VU0nyvsW", + "url": "https://lichess.org/VU0nyvsW", + "urlWhite": "https://lichess.org/VU0nyvsW?color=white", + "urlBlack": "https://lichess.org/VU0nyvsW?color=black", + "color": "random", + "direction": "out", + "timeControl": { + "increment": 2, + "limit": 300, + "show": "5+2", + "type": "clock" + }, + "variant": { + "key": "standard", + "name": "Standard", + "short": "Std" + }, + "challenger": { + "id": "thibot", + "name": "thibot", + "online": true, + "provisional": false, + "rating": 1940, + "title": "BOT" + }, + "destUser": { + "id": "leelachess", + "name": "LeelaChess", + "online": true, + "provisional": true, + "rating": 2670, + "title": "BOT" + }, + "perf": { + "icon": ";", + "name": "Correspondence" + }, + "rated": true, + "speed": "blitz", + "status": "created" + } + }, + "BulkPairing": { + "example": { + "id": "RVAcwgg7", + "games": [ + { + "id": "NKop9IyD", + "black": "lizen1", + "white": "thibault" + }, + { + "id": "KT8374ut", + "black": "lizen3", + "white": "lizen2" + }, + { + "id": "wInQr8Sk", + "black": "lizen5", + "white": "lizen4" + } + ], + "variant": "standard", + "clock": { + "increment": 0, + "limit": 300 + }, + "pairAt": 1612289869919, + "pairedAt": null, + "rated": false, + "startClocksAt": 1612200422971, + "scheduledAt": 1612203514628 + } + }, + "UciVariant": { + "type": "string", + "enum": [ + "chess", + "crazyhouse", + "antichess", + "atomic", + "horde", + "kingofthehill", + "racingkings", + "3check" + ], + "example": "chess", + "default": "chess" + }, + "ExternalEngine": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique engine registration ID.", + "example": "eei_aTKImBJOnv6j" + }, + "name": { + "type": "string", + "description": "Display name of the engine.", + "example": "Stockfish 15", + "minLength": 3, + "maxLength": 200 + }, + "clientSecret": { + "type": "string", + "description": "A secret token that can be used to\n[*request* analysis](#tag/External-engine/operation/apiExternalEngineAnalyse)\nfrom this external engine.\n", + "example": "ees_mdF2hK0hlKGSPeC6" + }, + "userId": { + "type": "string", + "description": "The user this engine has been registered for.", + "example": "thibault" + }, + "maxThreads": { + "type": "integer", + "description": "Maximum number of available threads.", + "example": 8, + "minimum": 1, + "maximum": 65536 + }, + "maxHash": { + "type": "integer", + "description": "Maximum available hash table size, in MiB.", + "example": 2048, + "minimum": 1, + "maximum": 1048576 + }, + "defaultDepth": { + "type": "integer", + "description": "Estimated depth of normal search.", + "example": 24, + "minimum": 0, + "maximum": 246 + }, + "variants": { + "type": "array", + "description": "List of supported chess variants.", + "example": [ + "chess" + ], + "items": { + "$ref": "#/components/schemas/UciVariant" + } + }, + "providerData": { + "type": "string", + "description": "Arbitrary data that the engine provider can use for identification\nor bookkeeping.\n\nUsers can read this information, but updating it requires knowing\nor changing the `providerSecret`.\n" + } + }, + "required": [ + "id", + "clientSecret", + "userId", + "name", + "maxThreads", + "maxHash", + "defaultDepth", + "variants" + ] + }, + "ExternalEngineRegistration": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Display name of the engine.", + "example": "Stockfish 15", + "minLength": 3, + "maxLength": 200 + }, + "maxThreads": { + "type": "integer", + "description": "Maximum number of available threads.", + "example": 8, + "minimum": 1, + "maximum": 65536 + }, + "maxHash": { + "type": "integer", + "description": "Maximum available hash table size, in MiB.", + "example": 2048, + "minimum": 1, + "maximum": 1048576 + }, + "defaultDepth": { + "type": "integer", + "description": "Estimated depth of normal search.", + "example": 24, + "minimum": 0, + "maximum": 246 + }, + "variants": { + "type": "array", + "description": "Optional list of supported chess variants.", + "items": { + "$ref": "#/components/schemas/UciVariant" + } + }, + "providerSecret": { + "type": "string", + "description": "A random token that can be used to\n[wait for analysis requests](#tag/External-engine/operation/apiExternalEngineAcquire)\nand provide analysis.\n\nThe engine provider should securely generate a random string.\n\nThe token will not be readable again, even by the user.\n\nThe analysis provider can register multiple engines with the same\ntoken, even for different users, and wait for analysis requests\nfrom any of them. In this case, the request must not be made via\nCORS, so that the token is not revealed to any of the users.\n", + "example": "Dee3uwieZei9ahpaici9bee2yahsai0K", + "minLength": 16, + "maxLength": 1024 + }, + "providerData": { + "type": "string", + "description": "Arbitrary data that the engine provider can use for identification\nor bookkeeping.\n\nUsers can read this information, but updating it requires knowing\nor changing the `providerSecret`.\n" + } + }, + "required": [ + "name", + "maxThreads", + "maxHash", + "defaultDepth", + "providerSecret" + ] + }, + "ExternalEngineWork": { + "type": "object", + "properties": { + "sessionId": { + "type": "string", + "description": "Arbitary string that identifies the analysis session.\nProviders may wish to clear the hash table between sessions.\n", + "example": "abcd1234" + }, + "threads": { + "type": "integer", + "minimum": 1, + "description": "Number of threads to use for analysis.", + "example": 4 + }, + "hash": { + "type": "integer", + "minimum": 1, + "description": "Hash table size to use for analysis, in MiB.", + "example": 128 + }, + "infinite": { + "type": "boolean", + "description": "Request an infinite search (rather than roughly aiming for\n`defaultDepth`).\n", + "example": false + }, + "multiPv": { + "type": "integer", + "minimum": 1, + "maximum": 5, + "description": "Requested number of principal variations.", + "example": 1 + }, + "variant": { + "$ref": "#/components/schemas/UciVariant" + }, + "initialFen": { + "type": "string", + "description": "Initial position of the game.", + "example": "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1" + }, + "moves": { + "type": "array", + "description": "List of moves played from the initial position, in UCI notation.", + "items": { + "type": "string" + }, + "example": [ + "e2e4", + "g8f6" + ] + } + }, + "required": [ + "sessionId", + "threads", + "hash", + "multiPv", + "variant", + "initialFen", + "moves" + ] + }, + "OAuthError": { + "properties": { + "error": { + "type": "string", + "description": "The cause of the error." + }, + "error_description": { + "type": "string", + "description": "The reason why the request was rejected." + } + }, + "example": { + "error": "invalid_grant", + "error_description": "hash of code_verifier does not match code_challenge" + } + }, + "OpeningExplorerJson": { + "example": { + "opening": { + "eco": "D10", + "name": "Slav Defense: Exchange Variation" + }, + "white": 1443, + "draws": 3787, + "black": 1156, + "moves": [ + { + "uci": "c6d5", + "san": "cxd5", + "averageRating": 2423, + "white": 1443, + "draws": 3787, + "black": 1155, + "game": null + }, + { + "uci": "g8f6", + "san": "Nf6", + "averageRating": 2515, + "white": 0, + "draws": 0, + "black": 1, + "game": { + "id": "1EErB5jc", + "winner": "black", + "white": { + "name": "Drozdovskij, Yuri", + "rating": 2509 + }, + "black": { + "name": "Dobrov, Vladimir", + "rating": 2515 + }, + "year": 2006, + "month": "2006-01" + } + } + ], + "topGames": [ + { + "uci": "c6d5", + "id": "kN6d9l2i", + "winner": "black", + "white": { + "name": "Carlsen, M.", + "rating": 2881 + }, + "black": { + "name": "Anand, V.", + "rating": 2785 + }, + "year": 2014, + "month": "2014-06" + }, + { + "uci": "c6d5", + "id": "qeYPJL2y", + "winner": "white", + "white": { + "name": "So, W.", + "rating": 2778 + }, + "black": { + "name": "Carlsen, M.", + "rating": 2843 + }, + "year": 2018, + "month": "2018-06" + } + ], + "recentGames": [], + "history": [ + { + "month": "2017-04", + "black": 413538, + "draws": 38549, + "white": 429805 + }, + { + "month": "2017-05", + "black": 418542, + "draws": 39171, + "white": 434066 + } + ] + } + }, + "OpeningExplorerPlayerJson": { + "example": { + "white": 359, + "draws": 23, + "black": 273, + "moves": [ + { + "uci": "c2c4", + "san": "c4", + "averageOpponentRating": 1695, + "performance": 1744, + "white": 354, + "draws": 23, + "black": 266, + "game": null + }, + { + "uci": "c2c3", + "san": "c3", + "averageOpponentRating": 1796, + "performance": 1796, + "white": 2, + "draws": 0, + "black": 2, + "game": null + }, + { + "uci": "e2e4", + "san": "e4", + "averageOpponentRating": 1762, + "performance": 1640, + "white": 1, + "draws": 0, + "black": 2, + "game": null + }, + { + "uci": "g1f3", + "san": "Nf3", + "averageOpponentRating": 1496, + "performance": 1374, + "white": 1, + "draws": 0, + "black": 2, + "game": null + }, + { + "uci": "h2h3", + "san": "h3", + "averageOpponentRating": 1696, + "performance": 2496, + "white": 1, + "draws": 0, + "black": 0, + "game": { + "id": "zyI4GGKv", + "winner": "white", + "speed": "bullet", + "mode": "rated", + "black": { + "name": "gocool99", + "rating": 1696 + }, + "white": { + "name": "revoof", + "rating": 1702 + }, + "year": 2020, + "month": "2020-07" + } + }, + { + "uci": "h2h4", + "san": "h4", + "averageOpponentRating": 1674, + "performance": 874, + "white": 0, + "draws": 0, + "black": 1, + "game": { + "id": "9vA24xBn", + "winner": "black", + "speed": "bullet", + "mode": "rated", + "black": { + "name": "MentalBlood", + "rating": 1674 + }, + "white": { + "name": "revoof", + "rating": 1657 + }, + "year": 2020, + "month": "2020-06" + } + } + ], + "recentGames": [ + { + "uci": "c2c4", + "id": "BGLmUtv7", + "winner": "white", + "speed": "bullet", + "mode": "rated", + "black": { + "name": "yigithanyiigit", + "rating": 1227 + }, + "white": { + "name": "revoof", + "rating": 1717 + }, + "year": 2022, + "month": "2022-03" + } + ], + "opening": { + "eco": "D00", + "name": "Queen's Pawn Game" + }, + "queuePosition": 0 + } + }, + "MasterGamePgn": { + "example": "[Event \"Wch Blitz\"]\n[Site \"Astana\"]\n[Date \"2012.07.10\"]\n[Round \"23\"]\n[White \"Carlsen, Magnus\"]\n[Black \"Chadaev, Nikolay\"]\n[Result \"1-0\"]\n[WhiteElo \"2837\"]\n[BlackElo \"2580\"]\n\n1. e4 e5 2. f4 d5 3. exd5 exf4 4. Nf3 Nf6 5. c4 c6 6. d4 cxd5 7. c5 Nc6 8. Bb5 Be7 9. O-O O-O 10. Bxf4 Bg4 11. Nc3 Ne4 12. Qd3 Bf5 13. Qe3 Bf6 14. Bxc6 bxc6 15. Ne5 Bxe5 16. Bxe5 Bg6 17. Nxe4 Bxe4 18. Qg3 f6 19. Bd6 Re8 20. b4 Bg6 21. a4 a6 22. h4 Qd7 23. h5 Bxh5 24. Rxf6 Qg4 25. Qxg4 Bxg4 26. Rf4 Bh5 27. Raf1 h6 28. Be5 Ra7 29. b5 axb5 30. axb5 cxb5 31. c6 Raa8 32. c7 Kh7 33. Rb1 Be2 34. Rf7 Rg8 35. Re7 Bc4 36. Kh2 Rae8 37. Rd7 Ra8 38. Rb2 Raf8 39. g4 Ra8 40. Rf2 b4 41. Rff7 h5 42. Rxg7+ Rxg7 43. Rxg7+ 1-0\n" + }, + "Move": { + "type": "object", + "properties": { + "uci": { + "type": "string", + "example": "h7h8q" + }, + "san": { + "type": "string", + "example": "h8=Q+" + }, + "category": { + "type": "string", + "enum": [ + "loss", + "unknown", + "maybe-loss", + "blessed-loss", + "draw", + "cursed-win", + "maybe-win", + "win" + ] + }, + "dtz": { + "type": "integer", + "description": "DTZ50'' with rounding or null if unknown" + }, + "precise_dtz": { + "type": "integer", + "description": "DTZ50'' (only if guaranteed to be not rounded) or null if unknown\n" + }, + "dtm": { + "type": "integer", + "description": "Distance to mate (only for positions with not more than 5 pieces)" + }, + "zeroing": { + "type": "boolean" + }, + "checkmate": { + "type": "boolean" + }, + "stalemate": { + "type": "boolean" + }, + "variant_win": { + "type": "boolean" + }, + "variant_loss": { + "type": "boolean" + }, + "insufficient_material": { + "type": "boolean" + } + } + }, + "TablebaseJson": { + "type": "object", + "properties": { + "category": { + "type": "string", + "enum": [ + "win", + "unknown", + "maybe-win", + "cursed-win", + "draw", + "blessed-loss", + "maybe-loss", + "loss" + ], + "description": "`cursed-win` and `blessed-loss` means the 50-move rule prevents\nthe decisive result.\n\n`maybe-win` and `maybe-loss` means exact result is unknown due to\n[DTZ rounding](https://syzygy-tables.info/metrics#dtz), i.e., the\nwin or loss could also be prevented by the 50-move rule if\nthe user has deviated from the tablebase recommendation since the\nlast pawn move or capture.\n" + }, + "dtz": { + "type": "integer", + "description": "[DTZ50'' with rounding](https://syzygy-tables.info/metrics#dtz) or null if unknown\n" + }, + "precise_dtz": { + "type": "integer", + "description": "DTZ50'' (only if guaranteed to be not rounded) or null if unknown\n" + }, + "dtm": { + "type": "integer", + "description": "Distance to mate (only for positions with not more than 5 pieces)" + }, + "checkmate": { + "type": "boolean" + }, + "stalemate": { + "type": "boolean" + }, + "variant_win": { + "type": "boolean", + "description": "Only in chess variants" + }, + "variant_loss": { + "type": "boolean", + "description": "Only in chess variants" + }, + "insufficient_material": { + "type": "boolean" + }, + "moves": { + "type": "array", + "description": "Information about legal moves, best first", + "items": { + "$ref": "#/components/schemas/Move" + } + } + }, + "example": { + "dtz": 1, + "precise_dtz": 1, + "dtm": 17, + "checkmate": false, + "stalemate": false, + "variant_win": false, + "variant_loss": false, + "insufficient_material": false, + "category": "win", + "moves": [ + { + "uci": "h7h8q", + "san": "h8=Q+", + "dtz": -2, + "precise_dtz": -2, + "dtm": -16, + "zeroing": true, + "checkmate": false, + "stalemate": false, + "variant_win": false, + "variant_loss": false, + "insufficient_material": false, + "category": "loss" + } + ] + } + } + }, + "securitySchemes": { + "OAuth2": { + "type": "oauth2", + "description": "Read [the introduction for how to make authenticated requests](#section/Introduction/Authentication).\n", + "flows": { + "authorizationCode": { + "authorizationUrl": "https://lichess.org/oauth", + "tokenUrl": "https://lichess.org/api/token", + "scopes": { + "preference:read": "Read your preferences", + "preference:write": "Write your preferences", + "email:read": "Read your email address", + "engine:read": "Read your external engines", + "engine:write": "Create, update, delete your external engines", + "challenge:read": "Read incoming challenges", + "challenge:write": "Create, accept, decline challenges", + "challenge:bulk": "Create, delete, query bulk pairings", + "study:read": "Read private studies and broadcasts", + "study:write": "Create, update, delete studies and broadcasts", + "tournament:write": "Create tournaments", + "racer:write": "Create and join puzzle races", + "puzzle:read": "Read puzzle activity", + "team:read": "Read private team information", + "team:write": "Join, leave teams", + "team:lead": "Manage teams (kick members, send PMs)", + "follow:read": "Read followed players", + "follow:write": "Follow and unfollow other players", + "msg:write": "Send private messages to other players", + "board:play": "Play with the Board API", + "bot:play": "Play with the Bot API. Only for [Bot accounts](#operation/botAccountUpgrade)", + "web:mod": "Use moderator tools (within the bounds of your permissions)" + } + } + } + } + }, + "examples": { + "tvFeedFirst": { + "value": { + "t": "featured", + "d": { + "id": "qVSOPtMc", + "orientation": "black", + "players": [ + { + "color": "white", + "user": { + "name": "lizen9", + "id": "lizen9", + "title": "GM" + }, + "rating": 2531, + "seconds": 60 + }, + { + "color": "black", + "user": { + "name": "lizen29", + "title": "WGM", + "id": "lizen29" + }, + "rating": 2594, + "seconds": 60 + } + ], + "fen": "rnbqk1r1/ppp1ppbp/8/N2p2p1/8/1PQPP3/P1P2PPn/R1B1K1NR" + } + } + }, + "tvFeedFen": { + "value": { + "t": "fen", + "d": { + "fen": "5rk1/6p1/p4q2/4p3/2p5/2P2bNQ/PP3P1P/1K1RR3 w - - 4 32", + "lm": "h8g8", + "wc": 14, + "bc": 30 + } + } + }, + "broadcastPgnPushRequest": { + "value": "[White \"Rasmus Svane\"]\n[Black \"Rajat Makkar\"]\n[BlackElo \"2453\"]\n[BlackTeam \"France\"]\n[BlackTitle \"FM\"]\n[WhiteTeam \"Germany\"]\n[Result \"1-0\"]\n[WhiteElo \"2632\"]\n[WhiteTitle \"GM\"]\n\n1. d4 d5\n\n[White \"Joseph Girel\"]\n[Black \"Matthias Bluebaum\"]\n[BlackElo \"2658\"]\n[BlackTeam \"Germany\"]\n[BlackTitle \"GM\"]\n[WhiteTeam \"France\"]\n[Result \"0-1\"]\n[WhiteElo \"2484\"]\n[WhiteTitle \"IM\"]\n\n1. a8\n" + }, + "broadcastPgnPushResponse": { + "value": { + "games": [ + { + "tags": { + "White": "Rasmus Svane", + "Black": "Rajat Makkar", + "BlackElo": "2453", + "BlackTeam": "France", + "BlackTitle": "FM", + "WhiteTeam": "Germany", + "Result": "1-0", + "WhiteElo": "2632", + "WhiteTitle": "GM" + }, + "moves": 2 + }, + { + "tags": { + "White": "Joseph Girel", + "Black": "Matthias Bluebaum", + "BlackElo": "2658", + "BlackTeam": "Germany", + "BlackTitle": "GM", + "WhiteTeam": "France", + "Result": "0-1", + "WhiteElo": "2484", + "WhiteTitle": "IM" + }, + "error": "No move found: Pawn a8" + } + ] + } + } + } + } +} diff --git a/Tests/swift-lichessTests/swift_lichessTests.swift b/Tests/swift-lichessTests/swift_lichessTests.swift new file mode 100644 index 0000000..cf125aa --- /dev/null +++ b/Tests/swift-lichessTests/swift_lichessTests.swift @@ -0,0 +1,35 @@ +import XCTest + +@testable import LichessClient + +final class swift_lichessTests: XCTestCase { + + func testTablebaseLookup() async throws { + let client = LichessClient() + + let tablebaseLookup = try await client.getStandardTablebase( + fen: "4k3/6KP/8/8/8/8/7p/8_w_-_-_0_1") + guard let dtm = tablebaseLookup.dtm else { + XCTAssert(false == true) + return + } + XCTAssert(dtm == 17) + + var found = false + guard let moves = tablebaseLookup.moves else { + XCTAssert(true == false) + return + } + for move in moves { + guard let uci = move.uci else { + XCTAssert(false == true) + return + } + if uci == "h7h8q" { + found = true + break + } + } + XCTAssert(found == true) + } +} |