// 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
import struct Logging.Logger

extension Clients {
  final class EdgeContainerLogging: EdgeContainerStub {
    let inner: any EdgeContainerStub
    let logger: Logger

    public init(_ inner: any EdgeContainerStub, logger: Logger) {
      var logger = logger
      logger[metadataKey: "gcp.artifact.id"] = "google-cloud-edgecontainer-v1"
      logger[metadataKey: "gcp.client.service"] = "edgecontainer"
      logger[metadataKey: "gcp.experimental.swift.client"] = "EdgeContainer"
      self.inner = inner
      self.logger = logger
    }

    func _intercept<Input, Output>(
      request: Input,
      options: GoogleCloudGax.RequestOptions,
      name: Swift.String,
      action: (Input, GoogleCloudGax.RequestOptions) async throws -> Output,
    ) async throws -> Output {
      var logger = logger
      logger[metadataKey: "gcp.experimental.swift.request.id"] = "\(UUID())"
      logger[metadataKey: "gcp.experimental.swift.method"] = .string(name)
      logger.debug("enter  : \(request) \(options)")
      do {
        let output = try await action(request, options)
        logger.debug("success: \(request) \(options) \(output)")
        return output
      } catch let error {
        logger.debug("error  : \(request) \(options) \(error)")
        throw error
      }
    }

    public func listClusters(
      request: ListClustersRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudEdgeContainerV1.ListClustersResponse {
      try await self._intercept(
        request: request,
        options: options,
        name: "listClusters",
        action: {
          (r: ListClustersRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudEdgeContainerV1.ListClustersResponse
          in
          return try await self.inner.listClusters(request: r, options: o)
        })
    }

    public func getCluster(
      request: GetClusterRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudEdgeContainerV1.Cluster {
      try await self._intercept(
        request: request,
        options: options,
        name: "getCluster",
        action: {
          (r: GetClusterRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudEdgeContainerV1.Cluster
          in
          return try await self.inner.getCluster(request: r, options: o)
        })
    }

    public func createCluster(
      request: CreateClusterRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleLongRunning.Operation {
      try await self._intercept(
        request: request,
        options: options,
        name: "createCluster",
        action: {
          (r: CreateClusterRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleLongRunning.Operation
          in
          return try await self.inner.createCluster(request: r, options: o)
        })
    }

    public func updateCluster(
      request: UpdateClusterRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleLongRunning.Operation {
      try await self._intercept(
        request: request,
        options: options,
        name: "updateCluster",
        action: {
          (r: UpdateClusterRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleLongRunning.Operation
          in
          return try await self.inner.updateCluster(request: r, options: o)
        })
    }

    public func upgradeCluster(
      request: UpgradeClusterRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleLongRunning.Operation {
      try await self._intercept(
        request: request,
        options: options,
        name: "upgradeCluster",
        action: {
          (r: UpgradeClusterRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleLongRunning.Operation
          in
          return try await self.inner.upgradeCluster(request: r, options: o)
        })
    }

    public func deleteCluster(
      request: DeleteClusterRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleLongRunning.Operation {
      try await self._intercept(
        request: request,
        options: options,
        name: "deleteCluster",
        action: {
          (r: DeleteClusterRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleLongRunning.Operation
          in
          return try await self.inner.deleteCluster(request: r, options: o)
        })
    }

    public func generateAccessToken(
      request: GenerateAccessTokenRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudEdgeContainerV1.GenerateAccessTokenResponse {
      try await self._intercept(
        request: request,
        options: options,
        name: "generateAccessToken",
        action: {
          (r: GenerateAccessTokenRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudEdgeContainerV1.GenerateAccessTokenResponse
          in
          return try await self.inner.generateAccessToken(request: r, options: o)
        })
    }

    public func generateOfflineCredential(
      request: GenerateOfflineCredentialRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudEdgeContainerV1.GenerateOfflineCredentialResponse {
      try await self._intercept(
        request: request,
        options: options,
        name: "generateOfflineCredential",
        action: {
          (r: GenerateOfflineCredentialRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudEdgeContainerV1.GenerateOfflineCredentialResponse
          in
          return try await self.inner.generateOfflineCredential(request: r, options: o)
        })
    }

    public func listNodePools(
      request: ListNodePoolsRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudEdgeContainerV1.ListNodePoolsResponse {
      try await self._intercept(
        request: request,
        options: options,
        name: "listNodePools",
        action: {
          (r: ListNodePoolsRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudEdgeContainerV1.ListNodePoolsResponse
          in
          return try await self.inner.listNodePools(request: r, options: o)
        })
    }

    public func getNodePool(
      request: GetNodePoolRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudEdgeContainerV1.NodePool {
      try await self._intercept(
        request: request,
        options: options,
        name: "getNodePool",
        action: {
          (r: GetNodePoolRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudEdgeContainerV1.NodePool
          in
          return try await self.inner.getNodePool(request: r, options: o)
        })
    }

    public func createNodePool(
      request: CreateNodePoolRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleLongRunning.Operation {
      try await self._intercept(
        request: request,
        options: options,
        name: "createNodePool",
        action: {
          (r: CreateNodePoolRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleLongRunning.Operation
          in
          return try await self.inner.createNodePool(request: r, options: o)
        })
    }

    public func updateNodePool(
      request: UpdateNodePoolRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleLongRunning.Operation {
      try await self._intercept(
        request: request,
        options: options,
        name: "updateNodePool",
        action: {
          (r: UpdateNodePoolRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleLongRunning.Operation
          in
          return try await self.inner.updateNodePool(request: r, options: o)
        })
    }

    public func deleteNodePool(
      request: DeleteNodePoolRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleLongRunning.Operation {
      try await self._intercept(
        request: request,
        options: options,
        name: "deleteNodePool",
        action: {
          (r: DeleteNodePoolRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleLongRunning.Operation
          in
          return try await self.inner.deleteNodePool(request: r, options: o)
        })
    }

    public func listMachines(
      request: ListMachinesRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudEdgeContainerV1.ListMachinesResponse {
      try await self._intercept(
        request: request,
        options: options,
        name: "listMachines",
        action: {
          (r: ListMachinesRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudEdgeContainerV1.ListMachinesResponse
          in
          return try await self.inner.listMachines(request: r, options: o)
        })
    }

    public func getMachine(
      request: GetMachineRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudEdgeContainerV1.Machine {
      try await self._intercept(
        request: request,
        options: options,
        name: "getMachine",
        action: {
          (r: GetMachineRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudEdgeContainerV1.Machine
          in
          return try await self.inner.getMachine(request: r, options: o)
        })
    }

    public func listVpnConnections(
      request: ListVpnConnectionsRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudEdgeContainerV1.ListVpnConnectionsResponse {
      try await self._intercept(
        request: request,
        options: options,
        name: "listVpnConnections",
        action: {
          (r: ListVpnConnectionsRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudEdgeContainerV1.ListVpnConnectionsResponse
          in
          return try await self.inner.listVpnConnections(request: r, options: o)
        })
    }

    public func getVpnConnection(
      request: GetVpnConnectionRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudEdgeContainerV1.VpnConnection {
      try await self._intercept(
        request: request,
        options: options,
        name: "getVpnConnection",
        action: {
          (r: GetVpnConnectionRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudEdgeContainerV1.VpnConnection
          in
          return try await self.inner.getVpnConnection(request: r, options: o)
        })
    }

    public func createVpnConnection(
      request: CreateVpnConnectionRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleLongRunning.Operation {
      try await self._intercept(
        request: request,
        options: options,
        name: "createVpnConnection",
        action: {
          (r: CreateVpnConnectionRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleLongRunning.Operation
          in
          return try await self.inner.createVpnConnection(request: r, options: o)
        })
    }

    public func deleteVpnConnection(
      request: DeleteVpnConnectionRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleLongRunning.Operation {
      try await self._intercept(
        request: request,
        options: options,
        name: "deleteVpnConnection",
        action: {
          (r: DeleteVpnConnectionRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleLongRunning.Operation
          in
          return try await self.inner.deleteVpnConnection(request: r, options: o)
        })
    }

    public func getServerConfig(
      request: GetServerConfigRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudEdgeContainerV1.ServerConfig {
      try await self._intercept(
        request: request,
        options: options,
        name: "getServerConfig",
        action: {
          (r: GetServerConfigRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudEdgeContainerV1.ServerConfig
          in
          return try await self.inner.getServerConfig(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,
        name: "listLocations",
        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,
        name: "getLocation",
        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,
        name: "listOperations",
        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,
        name: "getOperation",
        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,
        name: "deleteOperation",
        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,
        name: "cancelOperation",
        action: {
          (r: GoogleLongRunning.CancelOperationRequest, o: GoogleCloudGax.RequestOptions)
            async throws -> Void in
          return try await self.inner.cancelOperation(request: r, options: o)
        })
    }
  }
}
