use std::time::Duration;
use bson::doc;
use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
use typed_builder::TypedBuilder;
use crate::{
bson::Document,
bson_util,
concern::{ReadConcern, WriteConcern},
options::Collation,
selection_criteria::SelectionCriteria,
};
#[derive(Clone, Debug, Default, Deserialize, TypedBuilder)]
#[builder(field_defaults(default, setter(into)))]
#[non_exhaustive]
pub struct DatabaseOptions {
pub selection_criteria: Option<SelectionCriteria>,
pub read_concern: Option<ReadConcern>,
pub write_concern: Option<WriteConcern>,
}
#[skip_serializing_none]
#[derive(Clone, Debug, Default, Deserialize, TypedBuilder, Serialize)]
#[serde(rename_all = "camelCase")]
#[builder(field_defaults(default, setter(into)))]
#[non_exhaustive]
pub struct CreateCollectionOptions {
pub capped: Option<bool>,
#[serde(serialize_with = "bson_util::serialize_u64_option_as_i64")]
pub size: Option<u64>,
#[serde(serialize_with = "bson_util::serialize_u64_option_as_i64")]
pub max: Option<u64>,
pub storage_engine: Option<Document>,
pub validator: Option<Document>,
pub validation_level: Option<ValidationLevel>,
pub validation_action: Option<ValidationAction>,
pub view_on: Option<String>,
pub pipeline: Option<Vec<Document>>,
pub collation: Option<Collation>,
pub write_concern: Option<WriteConcern>,
pub index_option_defaults: Option<IndexOptionDefaults>,
pub timeseries: Option<TimeseriesOptions>,
#[serde(
default,
deserialize_with = "bson_util::deserialize_duration_option_from_u64_seconds",
serialize_with = "bson_util::serialize_duration_option_as_int_secs"
)]
pub expire_after_seconds: Option<Duration>,
pub change_stream_pre_and_post_images: Option<ChangeStreamPreAndPostImages>,
pub clustered_index: Option<ClusteredIndex>,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub enum ValidationLevel {
Off,
Strict,
Moderate,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub enum ValidationAction {
Error,
Warn,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct ClusteredIndex {
pub key: Document,
pub unique: bool,
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub v: Option<i32>,
}
impl Default for ClusteredIndex {
fn default() -> Self {
Self {
key: doc! { "_id": 1 },
unique: true,
name: None,
v: None,
}
}
}
#[derive(Clone, Debug, TypedBuilder, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct IndexOptionDefaults {
pub storage_engine: Document,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, TypedBuilder)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct TimeseriesOptions {
pub time_field: String,
pub meta_field: Option<String>,
pub granularity: Option<TimeseriesGranularity>,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub enum TimeseriesGranularity {
Seconds,
Minutes,
Hours,
}
#[derive(Clone, Debug, Default, TypedBuilder, Serialize)]
#[serde(rename_all = "camelCase")]
#[builder(field_defaults(default, setter(into)))]
#[non_exhaustive]
pub struct DropDatabaseOptions {
pub write_concern: Option<WriteConcern>,
}
#[derive(Clone, Debug, Default, Deserialize, TypedBuilder, Serialize)]
#[serde(rename_all = "camelCase")]
#[builder(field_defaults(default, setter(into)))]
#[non_exhaustive]
pub struct ListCollectionsOptions {
#[serde(
serialize_with = "bson_util::serialize_u32_option_as_batch_size",
rename(serialize = "cursor")
)]
pub batch_size: Option<u32>,
}
#[derive(Clone, Debug, Default, Deserialize, TypedBuilder, Serialize)]
#[serde(rename_all = "camelCase")]
#[builder(field_defaults(default, setter(into)))]
#[non_exhaustive]
pub struct ListDatabasesOptions {
pub authorized_databases: Option<bool>,
}
#[derive(Clone, Debug, Default, Deserialize, TypedBuilder, Serialize)]
#[serde(rename_all = "camelCase")]
#[builder(field_defaults(default, setter(into)))]
#[non_exhaustive]
pub struct ChangeStreamPreAndPostImages {
pub enabled: bool,
}