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

/// Defines the destination Pub/Sub subscription.
/// If none of `push_config`, `bigquery_config`, `cloud_storage_config`,
/// `pubsub_export_config`, or `pubsublite_export_config`
/// is set, then the subscriber will pull and ack messages using API methods. At
/// most one of these fields may be set.
public struct PubSubSubscription: Codable, Equatable, GoogleCloudWkt._AnyPackable,
  Sendable
{
  /// Required. Name of the subscription.
  /// Format is `projects/{project}/subscriptions/{sub}`.
  public var name: Swift.String = Swift.String()

  /// Optional. If push delivery is used with this subscription, this field is
  /// used to configure it.
  public var pushConfig: PushConfig? = nil

  /// Optional. If delivery to BigQuery is used with this subscription, this
  /// field is used to configure it.
  public var bigqueryConfig: BigQueryConfig? = nil

  /// Optional. If delivery to Google Cloud Storage is used with this
  /// subscription, this field is used to configure it.
  public var cloudStorageConfig: CloudStorageConfig? = nil

  /// Optional. The approximate amount of time (on a best-effort basis) Pub/Sub
  /// waits for the subscriber to acknowledge receipt before resending the
  /// message. In the interval after the message is delivered and before it is
  /// acknowledged, it is considered to be _outstanding_. During that time
  /// period, the message will not be redelivered (on a best-effort basis).
  ///
  /// For pull subscriptions, this value is used as the initial value for the ack
  /// deadline. To override this value for a given message, call
  /// `ModifyAckDeadline` with the corresponding `ack_id` if using
  /// non-streaming pull or send the `ack_id` in a
  /// `StreamingModifyAckDeadlineRequest` if using streaming pull.
  /// The minimum custom deadline you can specify is 10 seconds.
  /// The maximum custom deadline you can specify is 600 seconds (10 minutes).
  /// If this parameter is 0, a default value of 10 seconds is used.
  ///
  /// For push delivery, this value is also used to set the request timeout for
  /// the call to the push endpoint.
  ///
  /// If the subscriber never acknowledges the message, the Pub/Sub
  /// system will eventually redeliver the message.
  public var ackDeadlineSeconds: Swift.Int32 = Swift.Int32()

  /// Optional. Indicates whether to retain acknowledged messages. If true, then
  /// messages are not expunged from the subscription's backlog, even if they are
  /// acknowledged, until they fall out of the `message_retention_duration`
  /// window. This must be true if you would like to [`Seek` to a timestamp]
  /// (https://cloud.google.com/pubsub/docs/replay-overview#seek_to_a_time) in
  /// the past to replay previously-acknowledged messages.
  public var retainAckedMessages: Swift.Bool = Swift.Bool()

  /// Optional. How long to retain unacknowledged messages in the subscription's
  /// backlog, from the moment a message is published. If `retain_acked_messages`
  /// is true, then this also configures the retention of acknowledged messages,
  /// and thus configures how far back in time a `Seek` can be done. Defaults to
  /// 7 days. Cannot be more than 31 days or less than 10 minutes.
  public var messageRetentionDuration: GoogleCloudWkt.Duration? = nil

  /// Optional. See [Creating and managing
  /// labels](https://cloud.google.com/pubsub/docs/labels).
  public var labels: [Swift.String: Swift.String] = [:]

  /// Optional. If true, messages published with the same `ordering_key` in
  /// `PubsubMessage` will be delivered to the subscribers in the order in which
  /// they are received by the Pub/Sub system. Otherwise, they may be delivered
  /// in any order.
  public var enableMessageOrdering: Swift.Bool = Swift.Bool()

  /// Optional. A policy that specifies the conditions for this subscription's
  /// expiration. A subscription is considered active as long as any connected
  /// subscriber is successfully consuming messages from the subscription or is
  /// issuing operations on the subscription. If `expiration_policy` is not set,
  /// a *default policy* with `ttl` of 31 days will be used. The minimum allowed
  /// value for `expiration_policy.ttl` is 1 day. If `expiration_policy` is set,
  /// but `expiration_policy.ttl` is not set, the subscription never expires.
  public var expirationPolicy: ExpirationPolicy? = nil

  /// Optional. An expression written in the Pub/Sub [filter
  /// language](https://cloud.google.com/pubsub/docs/filtering). If non-empty,
  /// then only `PubsubMessage`s whose `attributes` field matches the filter are
  /// delivered on this subscription. If empty, then no messages are filtered
  /// out.
  public var filter: Swift.String = Swift.String()

  /// Optional. A policy that specifies the conditions for dead lettering
  /// messages in this subscription. If dead_letter_policy is not set, dead
  /// lettering is disabled.
  ///
  /// The Pub/Sub service account associated with this subscriptions's
  /// parent project (i.e.,
  /// service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com) must have
  /// permission to Acknowledge() messages on this subscription.
  public var deadLetterPolicy: DeadLetterPolicy? = nil

  /// Optional. A policy that specifies how Pub/Sub retries message delivery for
  /// this subscription.
  ///
  /// If not set, the default retry policy is applied. This generally implies
  /// that messages will be retried as soon as possible for healthy subscribers.
  /// RetryPolicy will be triggered on NACKs or acknowledgement deadline
  /// exceeded events for a given message.
  public var retryPolicy: RetryPolicy? = nil

  /// Optional. Indicates whether the subscription is detached from its topic.
  /// Detached subscriptions don't receive messages from their topic and don't
  /// retain any backlog. `Pull` and `StreamingPull` requests will return
  /// FAILED_PRECONDITION. If the subscription is a push subscription, pushes to
  /// the endpoint will not be made.
  public var detached: Swift.Bool = Swift.Bool()

  /// Optional. If true, Pub/Sub provides the following guarantees for the
  /// delivery of a message with a given value of `message_id` on this
  /// subscription:
  ///
  /// * The message sent to a subscriber is guaranteed not to be resent
  /// before the message's acknowledgement deadline expires.
  /// * An acknowledged message will not be resent to a subscriber.
  ///
  /// Note that subscribers may still receive multiple copies of a message
  /// when `enable_exactly_once_delivery` is true if the message was published
  /// multiple times by a publisher client. These copies are  considered distinct
  /// by Pub/Sub and have distinct `message_id` values.
  public var enableExactlyOnceDelivery: Swift.Bool = Swift.Bool()

  /// Optional. Transforms to be applied to messages before they are delivered to
  /// subscribers. Transforms are applied in the order specified.
  public var messageTransforms: [MessageTransform] = []

  /// Optional. Input only. Immutable. Tag keys/values directly bound to this
  /// resource. For example:
  ///   "123/environment": "production",
  ///   "123/costCenter": "marketing"
  public var tags: [Swift.String: Swift.String] = [:]

  /// Initialize a new instance of `PubSubSubscription`.
  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 = PubSubSubscription().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.cloud.bigquery.analyticshub.v1.PubSubSubscription"
  }
  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)
  }
}
