// 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
import GoogleCloudWkt

/// An IAM service account.
///
/// A service account is an account for an application or a virtual machine (VM)
/// instance, not a person. You can use a service account to call Google APIs. To
/// learn more, read the [overview of service
/// accounts](https://cloud.google.com/iam/help/service-accounts/overview).
///
/// When you create a service account, you specify the project ID that owns the
/// service account, as well as a name that must be unique within the project.
/// IAM uses these values to create an email address that identifies the service
/// account.
public struct ServiceAccount: Codable, Equatable, GoogleCloudWkt._AnyPackable,
  Sendable
{
  /// The resource name of the service account.
  ///
  /// Use one of the following formats:
  ///
  /// * `projects/{PROJECT_ID}/serviceAccounts/{EMAIL_ADDRESS}`
  /// * `projects/{PROJECT_ID}/serviceAccounts/{UNIQUE_ID}`
  ///
  /// As an alternative, you can use the `-` wildcard character instead of the
  /// project ID:
  ///
  /// * `projects/-/serviceAccounts/{EMAIL_ADDRESS}`
  /// * `projects/-/serviceAccounts/{UNIQUE_ID}`
  ///
  /// When possible, avoid using the `-` wildcard character, because it can cause
  /// response messages to contain misleading error codes. For example, if you
  /// try to get the service account
  /// `projects/-/serviceAccounts/fake@example.com`, which does not exist, the
  /// response contains an HTTP `403 Forbidden` error instead of a `404 Not
  /// Found` error.
  public var name: Swift.String = Swift.String()

  /// Output only. The ID of the project that owns the service account.
  public var projectId: Swift.String = Swift.String()

  /// Output only. The unique, stable numeric ID for the service account.
  ///
  /// Each service account retains its unique ID even if you delete the service
  /// account. For example, if you delete a service account, then create a new
  /// service account with the same name, the new service account has a different
  /// unique ID than the deleted service account.
  public var uniqueId: Swift.String = Swift.String()

  /// Output only. The email address of the service account.
  public var email: Swift.String = Swift.String()

  /// Optional. A user-specified, human-readable name for the service account. The maximum
  /// length is 100 UTF-8 bytes.
  public var displayName: Swift.String = Swift.String()

  /// Deprecated. Do not use.
  @available(*, deprecated)
  public var etag: Foundation.Data = Foundation.Data()

  /// Optional. A user-specified, human-readable description of the service account. The
  /// maximum length is 256 UTF-8 bytes.
  public var description: Swift.String = Swift.String()

  /// Output only. The OAuth 2.0 client ID for the service account.
  public var oauth2ClientId: Swift.String = Swift.String()

  /// Output only. Whether the service account is disabled.
  public var disabled: Swift.Bool = Swift.Bool()

  /// Initialize a new instance of `ServiceAccount`.
  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 = ServiceAccount().with { $0.name = ... }
  /// ```
  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.iam.admin.v1.ServiceAccount"
  }
  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)
  }
}
