// 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.

#if BackendBuckets || BackendServices || Disks || FirewallPolicies || Images || InstanceTemplates || Instances || InstantSnapshotGroups || InstantSnapshots || InterconnectAttachmentGroups || InterconnectGroups || LicenseCodes || Licenses || MachineImages || NetworkAttachments || NetworkFirewallPolicies || NodeGroups || NodeTemplates || RegionBackendBuckets || RegionBackendServices || RegionDisks || RegionInstantSnapshotGroups || RegionInstantSnapshots || RegionNetworkFirewallPolicies || RegionSnapshots || ReservationBlocks || ReservationSubBlocks || Reservations || ResourcePolicies || ServiceAttachments || Snapshots || StoragePools || Subnetworks
  import Foundation
  import GoogleCloudWkt

  /// Specifies the audit configuration for a service.
  /// The configuration determines which permission types are logged, and what
  /// identities, if any, are exempted from logging.
  /// An AuditConfig must have one or more AuditLogConfigs.
  ///
  /// If there are AuditConfigs for both `allServices` and a specific service,
  /// the union of the two AuditConfigs is used for that service: the log_types
  /// specified in each AuditConfig are enabled, and the exempted_members in each
  /// AuditLogConfig are exempted.
  ///
  /// Example Policy with multiple AuditConfigs:
  ///
  ///     {
  ///       "audit_configs": [
  ///         {
  ///           "service": "allServices",
  ///           "audit_log_configs": [
  ///             {
  ///               "log_type": "DATA_READ",
  ///               "exempted_members": [
  ///                 "user:jose@example.com"
  ///               ]
  ///             },
  ///             {
  ///               "log_type": "DATA_WRITE"
  ///             },
  ///             {
  ///               "log_type": "ADMIN_READ"
  ///             }
  ///           ]
  ///         },
  ///         {
  ///           "service": "sampleservice.googleapis.com",
  ///           "audit_log_configs": [
  ///             {
  ///               "log_type": "DATA_READ"
  ///             },
  ///             {
  ///               "log_type": "DATA_WRITE",
  ///               "exempted_members": [
  ///                 "user:aliya@example.com"
  ///               ]
  ///             }
  ///           ]
  ///         }
  ///       ]
  ///     }
  ///
  /// For sampleservice, this policy enables DATA_READ, DATA_WRITE and ADMIN_READ
  /// logging. It also exempts `jose@example.com` from DATA_READ logging, and
  /// `aliya@example.com` from DATA_WRITE logging.
  public struct AuditConfig: Codable, Equatable, GoogleCloudWkt._AnyPackable,
    Sendable
  {
    /// The configuration for logging of each type of permission.
    public var auditLogConfigs: [AuditLogConfig] = []

    /// Specifies a service that will be enabled for audit logging.
    /// For example, `storage.googleapis.com`, `cloudsql.googleapis.com`.
    /// `allServices` is a special value that covers all services.
    public var service: Swift.String? = nil

    /// Initialize a new instance of `AuditConfig`.
    public init() {}

    /// Use `config` to return a new instance of this object, with some fields updated.
    ///
    /// Commonly used to initialize the value, for example:
    ///
    /// ```
    /// let value = AuditConfig().with { $0.auditLogConfigs = ... }
    /// ```
    public func with(_ config: (inout Self) throws -> Swift.Void) rethrows -> Self {
      var copy = self
      try config(&copy)
      return copy
    }

    public static var _anyTypeUrl: Swift.String {
      return "type.googleapis.com/google.cloud.compute.v1.AuditConfig"
    }
    public init(fromAny any: GoogleCloudWkt.`Any`) throws {
      self = try GoogleCloudWkt._slowAnyDeserialize(Self.self, from: any)
    }
    public func _pack() throws -> GoogleCloudWkt.Struct {
      return try GoogleCloudWkt._slowAnySerialize(message: self)
    }
  }
#endif
