// Code generated by sidekick. DO NOT EDIT.
//
// Copyright 2026 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

import Foundation
#if canImport(FoundationNetworking)
  import FoundationNetworking
#endif
import GoogleCloudLocation
import GoogleCloudWkt
import GoogleLongRunning
import GoogleRpc
import GoogleCloudGax

extension Clients {
  final class TpuRetry: TpuStub {
    let inner: any TpuStub
    let options: GoogleCloudGax.ClientOptions

    public init(_ inner: any TpuStub, options: GoogleCloudGax.ClientOptions) {
      self.inner = inner
      self.options = options
    }

    func _intercept<Input, Output>(
      request: Input,
      options: GoogleCloudGax.RequestOptions,
      idempotent: Swift.Bool,
      action: (Input, GoogleCloudGax.RequestOptions) async throws -> Output,
    ) async throws -> Output {
      let loop = GoogleCloudGax._RetryLoop(
        options: options, withDefault: self.options, idempotent: idempotent,
      )
      let attempt = { (attemptTimeout: Swift.Duration?) async throws -> Output in
        var attemptOptions = options
        attemptOptions.attemptTimeout = attemptTimeout
        return try await action(request, attemptOptions)
      }
      return try await loop.run(attempt: attempt)
    }

    public func listNodes(
      request: ListNodesRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudTpuV2.ListNodesResponse {
      try await self._intercept(
        request: request,
        options: options,
        idempotent: true,
        action: {
          (r: ListNodesRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudTpuV2.ListNodesResponse
          in
          return try await self.inner.listNodes(request: r, options: o)
        })
    }

    public func getNode(
      request: GetNodeRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudTpuV2.Node {
      try await self._intercept(
        request: request,
        options: options,
        idempotent: true,
        action: {
          (r: GetNodeRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudTpuV2.Node
          in
          return try await self.inner.getNode(request: r, options: o)
        })
    }

    public func createNode(
      request: CreateNodeRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleLongRunning.Operation {
      try await self._intercept(
        request: request,
        options: options,
        idempotent: false,
        action: {
          (r: CreateNodeRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleLongRunning.Operation
          in
          return try await self.inner.createNode(request: r, options: o)
        })
    }

    public func deleteNode(
      request: DeleteNodeRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleLongRunning.Operation {
      try await self._intercept(
        request: request,
        options: options,
        idempotent: false,
        action: {
          (r: DeleteNodeRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleLongRunning.Operation
          in
          return try await self.inner.deleteNode(request: r, options: o)
        })
    }

    public func stopNode(
      request: StopNodeRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleLongRunning.Operation {
      try await self._intercept(
        request: request,
        options: options,
        idempotent: false,
        action: {
          (r: StopNodeRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleLongRunning.Operation
          in
          return try await self.inner.stopNode(request: r, options: o)
        })
    }

    public func startNode(
      request: StartNodeRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleLongRunning.Operation {
      try await self._intercept(
        request: request,
        options: options,
        idempotent: false,
        action: {
          (r: StartNodeRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleLongRunning.Operation
          in
          return try await self.inner.startNode(request: r, options: o)
        })
    }

    public func updateNode(
      request: UpdateNodeRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleLongRunning.Operation {
      try await self._intercept(
        request: request,
        options: options,
        idempotent: false,
        action: {
          (r: UpdateNodeRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleLongRunning.Operation
          in
          return try await self.inner.updateNode(request: r, options: o)
        })
    }

    public func listQueuedResources(
      request: ListQueuedResourcesRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudTpuV2.ListQueuedResourcesResponse {
      try await self._intercept(
        request: request,
        options: options,
        idempotent: true,
        action: {
          (r: ListQueuedResourcesRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudTpuV2.ListQueuedResourcesResponse
          in
          return try await self.inner.listQueuedResources(request: r, options: o)
        })
    }

    public func getQueuedResource(
      request: GetQueuedResourceRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudTpuV2.QueuedResource {
      try await self._intercept(
        request: request,
        options: options,
        idempotent: true,
        action: {
          (r: GetQueuedResourceRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudTpuV2.QueuedResource
          in
          return try await self.inner.getQueuedResource(request: r, options: o)
        })
    }

    public func createQueuedResource(
      request: CreateQueuedResourceRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleLongRunning.Operation {
      try await self._intercept(
        request: request,
        options: options,
        idempotent: false,
        action: {
          (r: CreateQueuedResourceRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleLongRunning.Operation
          in
          return try await self.inner.createQueuedResource(request: r, options: o)
        })
    }

    public func deleteQueuedResource(
      request: DeleteQueuedResourceRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleLongRunning.Operation {
      try await self._intercept(
        request: request,
        options: options,
        idempotent: false,
        action: {
          (r: DeleteQueuedResourceRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleLongRunning.Operation
          in
          return try await self.inner.deleteQueuedResource(request: r, options: o)
        })
    }

    public func resetQueuedResource(
      request: ResetQueuedResourceRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleLongRunning.Operation {
      try await self._intercept(
        request: request,
        options: options,
        idempotent: false,
        action: {
          (r: ResetQueuedResourceRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleLongRunning.Operation
          in
          return try await self.inner.resetQueuedResource(request: r, options: o)
        })
    }

    public func generateServiceIdentity(
      request: GenerateServiceIdentityRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudTpuV2.GenerateServiceIdentityResponse {
      try await self._intercept(
        request: request,
        options: options,
        idempotent: false,
        action: {
          (r: GenerateServiceIdentityRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudTpuV2.GenerateServiceIdentityResponse
          in
          return try await self.inner.generateServiceIdentity(request: r, options: o)
        })
    }

    public func listAcceleratorTypes(
      request: ListAcceleratorTypesRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudTpuV2.ListAcceleratorTypesResponse {
      try await self._intercept(
        request: request,
        options: options,
        idempotent: true,
        action: {
          (r: ListAcceleratorTypesRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudTpuV2.ListAcceleratorTypesResponse
          in
          return try await self.inner.listAcceleratorTypes(request: r, options: o)
        })
    }

    public func getAcceleratorType(
      request: GetAcceleratorTypeRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudTpuV2.AcceleratorType {
      try await self._intercept(
        request: request,
        options: options,
        idempotent: true,
        action: {
          (r: GetAcceleratorTypeRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudTpuV2.AcceleratorType
          in
          return try await self.inner.getAcceleratorType(request: r, options: o)
        })
    }

    public func listRuntimeVersions(
      request: ListRuntimeVersionsRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudTpuV2.ListRuntimeVersionsResponse {
      try await self._intercept(
        request: request,
        options: options,
        idempotent: true,
        action: {
          (r: ListRuntimeVersionsRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudTpuV2.ListRuntimeVersionsResponse
          in
          return try await self.inner.listRuntimeVersions(request: r, options: o)
        })
    }

    public func getRuntimeVersion(
      request: GetRuntimeVersionRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudTpuV2.RuntimeVersion {
      try await self._intercept(
        request: request,
        options: options,
        idempotent: true,
        action: {
          (r: GetRuntimeVersionRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudTpuV2.RuntimeVersion
          in
          return try await self.inner.getRuntimeVersion(request: r, options: o)
        })
    }

    public func getGuestAttributes(
      request: GetGuestAttributesRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudTpuV2.GetGuestAttributesResponse {
      try await self._intercept(
        request: request,
        options: options,
        idempotent: false,
        action: {
          (r: GetGuestAttributesRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudTpuV2.GetGuestAttributesResponse
          in
          return try await self.inner.getGuestAttributes(request: r, options: o)
        })
    }

    public func listLocations(
      request: GoogleCloudLocation.ListLocationsRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudLocation.ListLocationsResponse {
      try await self._intercept(
        request: request,
        options: options,
        idempotent: true,
        action: {
          (r: GoogleCloudLocation.ListLocationsRequest, o: GoogleCloudGax.RequestOptions)
            async throws -> GoogleCloudLocation.ListLocationsResponse
          in
          return try await self.inner.listLocations(request: r, options: o)
        })
    }

    public func getLocation(
      request: GoogleCloudLocation.GetLocationRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudLocation.Location {
      try await self._intercept(
        request: request,
        options: options,
        idempotent: true,
        action: {
          (r: GoogleCloudLocation.GetLocationRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudLocation.Location
          in
          return try await self.inner.getLocation(request: r, options: o)
        })
    }

    public func listOperations(
      request: GoogleLongRunning.ListOperationsRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleLongRunning.ListOperationsResponse {
      try await self._intercept(
        request: request,
        options: options,
        idempotent: true,
        action: {
          (r: GoogleLongRunning.ListOperationsRequest, o: GoogleCloudGax.RequestOptions)
            async throws -> GoogleLongRunning.ListOperationsResponse
          in
          return try await self.inner.listOperations(request: r, options: o)
        })
    }

    public func getOperation(
      request: GoogleLongRunning.GetOperationRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleLongRunning.Operation {
      try await self._intercept(
        request: request,
        options: options,
        idempotent: true,
        action: {
          (r: GoogleLongRunning.GetOperationRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleLongRunning.Operation
          in
          return try await self.inner.getOperation(request: r, options: o)
        })
    }

    public func deleteOperation(
      request: GoogleLongRunning.DeleteOperationRequest, options: GoogleCloudGax.RequestOptions
    ) async throws {
      try await self._intercept(
        request: request,
        options: options,
        idempotent: false,
        action: {
          (r: GoogleLongRunning.DeleteOperationRequest, o: GoogleCloudGax.RequestOptions)
            async throws -> Void in
          return try await self.inner.deleteOperation(request: r, options: o)
        })
    }

    public func cancelOperation(
      request: GoogleLongRunning.CancelOperationRequest, options: GoogleCloudGax.RequestOptions
    ) async throws {
      try await self._intercept(
        request: request,
        options: options,
        idempotent: false,
        action: {
          (r: GoogleLongRunning.CancelOperationRequest, o: GoogleCloudGax.RequestOptions)
            async throws -> Void in
          return try await self.inner.cancelOperation(request: r, options: o)
        })
    }
  }
}
