ydb 0.18.1

Crate contains generated low-level grpc code from YDB API protobuf, used as base for ydb crate
Documentation
use std::sync::Arc;

use derive_builder::Builder;

use crate::client_topic::compression::{CodecSelection, CompressionEncoder};
use crate::client_topic::topicwriter::partitioning::PartitioningStrategy;
use crate::retry_settings::RetrySettings;
use crate::{TopicWriterOptions, errors};

#[derive(Builder, Clone)]
#[builder(build_fn(error = "errors::YdbError"))]
pub struct TopicWriterTxOptions {
    pub topic_path: String,

    /// Producer identifier used for server-side ordering and deduplication.
    /// When omitted, an empty producer identifier disables server-side deduplication.
    #[builder(setter(into, strip_option), default)]
    pub(crate) producer_id: Option<String>,

    /// Selects the topic partition for this transactional writer.
    #[builder(default)]
    pub(crate) partitioning: PartitioningStrategy,

    #[builder(default)]
    pub(crate) codec_selector: CodecSelection,
    #[builder(setter(custom), default)]
    pub(crate) extra_encoders: Vec<Arc<dyn CompressionEncoder>>,
}

impl TopicWriterTxOptionsBuilder {
    pub fn add_encoder<E>(&mut self, encoder: E) -> &mut Self
    where
        E: CompressionEncoder + 'static,
    {
        self.extra_encoders
            .get_or_insert_default()
            .push(Arc::new(encoder));
        self
    }
}

impl TopicWriterTxOptions {
    pub(crate) fn into_non_tx_options(self) -> TopicWriterOptions {
        // Transaction retries repeat the complete atomic operation, so writer-level
        // deduplication is unnecessary unless the caller explicitly requests it.
        let producer_id = self.producer_id.unwrap_or_default();
        let mut options = TopicWriterOptions::builder()
            .topic_path(self.topic_path)
            .producer_id(producer_id)
            .partitioning(self.partitioning)
            // Current WriterTx should not reconnect
            .retry_settings(RetrySettings::dont_retry())
            .codec_selector(self.codec_selector)
            .build();

        options.extra_encoders = self.extra_encoders;

        options
    }
}