use macro_magic::export_tokens;
use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
use std::time::Duration;
use typed_builder::TypedBuilder;
use crate::{
bson::{Bson, Timestamp},
change_stream::event::ResumeToken,
collation::Collation,
concern::ReadConcern,
options::AggregateOptions,
selection_criteria::SelectionCriteria,
};
#[skip_serializing_none]
#[derive(Clone, Debug, Default, Deserialize, Serialize, TypedBuilder)]
#[builder(field_defaults(default, setter(into)))]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
#[export_tokens]
pub struct ChangeStreamOptions {
#[rustfmt::skip]
pub full_document: Option<FullDocumentType>,
pub full_document_before_change: Option<FullDocumentBeforeChangeType>,
pub resume_after: Option<ResumeToken>,
pub start_at_operation_time: Option<Timestamp>,
pub start_after: Option<ResumeToken>,
#[builder(setter(skip))]
pub(crate) all_changes_for_cluster: Option<bool>,
#[serde(skip_serializing)]
pub max_await_time: Option<Duration>,
#[serde(skip_serializing)]
pub batch_size: Option<u32>,
#[serde(skip_serializing)]
pub collation: Option<Collation>,
#[serde(skip_serializing)]
pub read_concern: Option<ReadConcern>,
#[serde(skip_serializing)]
pub selection_criteria: Option<SelectionCriteria>,
pub show_expanded_events: Option<bool>,
pub comment: Option<Bson>,
}
impl ChangeStreamOptions {
pub(crate) fn aggregate_options(&self) -> AggregateOptions {
AggregateOptions::builder()
.batch_size(self.batch_size)
.collation(self.collation.clone())
.max_await_time(self.max_await_time)
.read_concern(self.read_concern.clone())
.selection_criteria(self.selection_criteria.clone())
.comment(self.comment.clone())
.build()
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub enum FullDocumentType {
UpdateLookup,
WhenAvailable,
Required,
Other(String),
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub enum FullDocumentBeforeChangeType {
WhenAvailable,
Required,
Off,
Other(String),
}