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

/// A result of IAM Policy search, containing information of an IAM policy.
public struct IamPolicySearchResult: Codable, Equatable, GoogleCloudWkt._AnyPackable,
  Sendable
{
  /// The full resource name of the resource associated with this IAM policy.
  /// Example:
  /// `//compute.googleapis.com/projects/my_project_123/zones/zone1/instances/instance1`.
  /// See [Cloud Asset Inventory Resource Name
  /// Format](https://cloud.google.com/asset-inventory/docs/resource-name-format)
  /// for more information.
  ///
  /// To search against the `resource`:
  ///
  /// * use a field query. Example: `resource:organizations/123`
  public var resource: Swift.String = Swift.String()

  /// The type of the resource associated with this IAM policy. Example:
  /// `compute.googleapis.com/Disk`.
  ///
  /// To search against the `asset_type`:
  ///
  /// * specify the `asset_types` field in your search request.
  public var assetType: Swift.String = Swift.String()

  /// The project that the associated Google Cloud resource belongs to, in the
  /// form of projects/{PROJECT_NUMBER}. If an IAM policy is set on a resource
  /// (like VM instance, Cloud Storage bucket), the project field will indicate
  /// the project that contains the resource. If an IAM policy is set on a folder
  /// or organization, this field will be empty.
  ///
  /// To search against the `project`:
  ///
  /// * specify the `scope` field as this project in your search request.
  public var project: Swift.String = Swift.String()

  /// The folder(s) that the IAM policy belongs to, in the form of
  /// folders/{FOLDER_NUMBER}. This field is available when the IAM policy
  /// belongs to one or more folders.
  ///
  /// To search against `folders`:
  ///
  /// * use a field query. Example: `folders:(123 OR 456)`
  /// * use a free text query. Example: `123`
  /// * specify the `scope` field as this folder in your search request.
  public var folders: [Swift.String] = []

  /// The organization that the IAM policy belongs to, in the form
  /// of organizations/{ORGANIZATION_NUMBER}. This field is available when the
  /// IAM policy belongs to an organization.
  ///
  /// To search against `organization`:
  ///
  /// * use a field query. Example: `organization:123`
  /// * use a free text query. Example: `123`
  /// * specify the `scope` field as this organization in your search request.
  public var organization: Swift.String = Swift.String()

  /// The IAM policy directly set on the given resource. Note that the original
  /// IAM policy can contain multiple bindings. This only contains the bindings
  /// that match the given query. For queries that don't contain a constrain on
  /// policies (e.g., an empty query), this contains all the bindings.
  ///
  /// To search against the `policy` bindings:
  ///
  /// * use a field query:
  ///     - query by the policy contained members. Example:
  ///       `policy:amy@gmail.com`
  ///     - query by the policy contained roles. Example:
  ///       `policy:roles/compute.admin`
  ///     - query by the policy contained roles' included permissions. Example:
  ///       `policy.role.permissions:compute.instances.create`
  public var policy: GoogleIAMV1.Policy? = nil

  /// Explanation about the IAM policy search result. It contains additional
  /// information to explain why the search result matches the query.
  public var explanation: IamPolicySearchResult.Explanation? = nil

  /// Initialize a new instance of `IamPolicySearchResult`.
  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 = IamPolicySearchResult().with { $0.resource = ... }
  /// ```
  public func with(_ config: (inout Self) throws -> Swift.Void) rethrows -> Self {
    var copy = self
    try config(&copy)
    return copy
  }

  /// Explanation about the IAM policy search result.
  public struct Explanation: Codable, Equatable, GoogleCloudWkt._AnyPackable,
    Sendable
  {
    /// The map from roles to their included permissions that match the
    /// permission query (i.e., a query containing `policy.role.permissions:`).
    /// Example: if query `policy.role.permissions:compute.disk.get`
    /// matches a policy binding that contains owner role, the
    /// matched_permissions will be `{"roles/owner": ["compute.disk.get"]}`. The
    /// roles can also be found in the returned `policy` bindings. Note that the
    /// map is populated only for requests with permission queries.
    public var matchedPermissions: [Swift.String: IamPolicySearchResult.Explanation.Permissions] =
      [:]

    /// Initialize a new instance of `Explanation`.
    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 = Explanation().with { $0.matchedPermissions = ... }
    /// ```
    public func with(_ config: (inout Self) throws -> Swift.Void) rethrows -> Self {
      var copy = self
      try config(&copy)
      return copy
    }

    /// IAM permissions
    public struct Permissions: Codable, Equatable, GoogleCloudWkt._AnyPackable,
      Sendable
    {
      /// A list of permissions. A sample permission string: `compute.disk.get`.
      public var permissions: [Swift.String] = []

      /// Initialize a new instance of `Permissions`.
      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 = Permissions().with { $0.permissions = ... }
      /// ```
      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.asset.v1.IamPolicySearchResult.Explanation.Permissions"
      }
      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)
      }
    }

    public static var _anyTypeUrl: Swift.String {
      return "type.googleapis.com/google.cloud.asset.v1.IamPolicySearchResult.Explanation"
    }
    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)
    }
  }

  public static var _anyTypeUrl: Swift.String {
    return "type.googleapis.com/google.cloud.asset.v1.IamPolicySearchResult"
  }
  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)
  }
}
