// 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 SpeechLogging: SpeechStub {
    let inner: any SpeechStub
    let logger: Logger

    public init(_ inner: any SpeechStub, logger: Logger) {
      var logger = logger
      logger[metadataKey: "gcp.artifact.id"] = "google-cloud-speech-v2"
      logger[metadataKey: "gcp.client.service"] = "speech"
      logger[metadataKey: "gcp.experimental.swift.client"] = "Speech"
      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 createRecognizer(
      request: CreateRecognizerRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleLongRunning.Operation {
      try await self._intercept(
        request: request,
        options: options,
        name: "createRecognizer",
        action: {
          (r: CreateRecognizerRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleLongRunning.Operation
          in
          return try await self.inner.createRecognizer(request: r, options: o)
        })
    }

    public func listRecognizers(
      request: ListRecognizersRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudSpeechV2.ListRecognizersResponse {
      try await self._intercept(
        request: request,
        options: options,
        name: "listRecognizers",
        action: {
          (r: ListRecognizersRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudSpeechV2.ListRecognizersResponse
          in
          return try await self.inner.listRecognizers(request: r, options: o)
        })
    }

    public func getRecognizer(
      request: GetRecognizerRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudSpeechV2.Recognizer {
      try await self._intercept(
        request: request,
        options: options,
        name: "getRecognizer",
        action: {
          (r: GetRecognizerRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudSpeechV2.Recognizer
          in
          return try await self.inner.getRecognizer(request: r, options: o)
        })
    }

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

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

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

    public func recognize(
      request: RecognizeRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudSpeechV2.RecognizeResponse {
      try await self._intercept(
        request: request,
        options: options,
        name: "recognize",
        action: {
          (r: RecognizeRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudSpeechV2.RecognizeResponse
          in
          return try await self.inner.recognize(request: r, options: o)
        })
    }

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

    public func getConfig(
      request: GetConfigRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudSpeechV2.Config {
      try await self._intercept(
        request: request,
        options: options,
        name: "getConfig",
        action: {
          (r: GetConfigRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudSpeechV2.Config
          in
          return try await self.inner.getConfig(request: r, options: o)
        })
    }

    public func updateConfig(
      request: UpdateConfigRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudSpeechV2.Config {
      try await self._intercept(
        request: request,
        options: options,
        name: "updateConfig",
        action: {
          (r: UpdateConfigRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudSpeechV2.Config
          in
          return try await self.inner.updateConfig(request: r, options: o)
        })
    }

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

    public func listCustomClasses(
      request: ListCustomClassesRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudSpeechV2.ListCustomClassesResponse {
      try await self._intercept(
        request: request,
        options: options,
        name: "listCustomClasses",
        action: {
          (r: ListCustomClassesRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudSpeechV2.ListCustomClassesResponse
          in
          return try await self.inner.listCustomClasses(request: r, options: o)
        })
    }

    public func getCustomClass(
      request: GetCustomClassRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudSpeechV2.CustomClass {
      try await self._intercept(
        request: request,
        options: options,
        name: "getCustomClass",
        action: {
          (r: GetCustomClassRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudSpeechV2.CustomClass
          in
          return try await self.inner.getCustomClass(request: r, options: o)
        })
    }

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

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

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

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

    public func listPhraseSets(
      request: ListPhraseSetsRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudSpeechV2.ListPhraseSetsResponse {
      try await self._intercept(
        request: request,
        options: options,
        name: "listPhraseSets",
        action: {
          (r: ListPhraseSetsRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudSpeechV2.ListPhraseSetsResponse
          in
          return try await self.inner.listPhraseSets(request: r, options: o)
        })
    }

    public func getPhraseSet(
      request: GetPhraseSetRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleCloudSpeechV2.PhraseSet {
      try await self._intercept(
        request: request,
        options: options,
        name: "getPhraseSet",
        action: {
          (r: GetPhraseSetRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleCloudSpeechV2.PhraseSet
          in
          return try await self.inner.getPhraseSet(request: r, options: o)
        })
    }

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

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

    public func undeletePhraseSet(
      request: UndeletePhraseSetRequest, options: GoogleCloudGax.RequestOptions
    ) async throws -> GoogleLongRunning.Operation {
      try await self._intercept(
        request: request,
        options: options,
        name: "undeletePhraseSet",
        action: {
          (r: UndeletePhraseSetRequest, o: GoogleCloudGax.RequestOptions) async throws
            -> GoogleLongRunning.Operation
          in
          return try await self.inner.undeletePhraseSet(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)
        })
    }
  }
}
