use bson::Document;
use mongodb::options::{ReadConcern, ReadPreference, WriteConcern};
use std::{sync::Arc, time::Duration};
use typed_builder::TypedBuilder;
pub trait ProgressUpdate {
fn update(&self, position: usize);
}
#[derive(Clone, Default, TypedBuilder)]
pub struct GridFSUploadOptions {
#[builder(default = None)]
pub(crate) chunk_size_bytes: Option<u32>,
#[builder(default = None)]
pub(crate) metadata: Option<Document>,
#[allow(dead_code)]
#[builder(default = None)]
content_type: Option<String>,
#[allow(dead_code)]
#[builder(default = None)]
aliases: Option<Vec<String>>,
#[builder(default = None)]
pub(crate) progress_tick: Option<Arc<dyn ProgressUpdate + Send + Sync>>, }
#[derive(Clone, Debug, TypedBuilder)]
pub struct GridFSBucketOptions {
#[builder(default = "fs".into())]
pub bucket_name: String,
#[builder(default = 255 * 1024)]
pub chunk_size_bytes: u32,
#[builder(default)]
pub write_concern: Option<WriteConcern>,
#[builder(default)]
pub read_concern: Option<ReadConcern>,
#[builder(default)]
pub read_preference: Option<ReadPreference>,
#[builder(default = false)]
pub disable_md5: bool,
}
impl Default for GridFSBucketOptions {
fn default() -> Self {
GridFSBucketOptions {
bucket_name: "fs".into(),
chunk_size_bytes: 255 * 1024,
write_concern: None,
read_concern: None,
read_preference: None,
disable_md5: false,
}
}
}
#[derive(Clone, Debug, Default, TypedBuilder)]
pub struct GridFSFindOptions {
#[builder(default)]
pub allow_disk_use: Option<bool>,
#[builder(default)]
pub batch_size: Option<u32>,
#[builder(default)]
pub limit: Option<i64>,
#[builder(default)]
pub max_time: Option<Duration>,
#[builder(default)]
pub no_cursor_timeout: Option<bool>,
#[builder(default)]
pub skip: u64,
#[builder(default)]
pub sort: Option<Document>,
}
#[cfg(test)]
mod tests {
use super::{GridFSBucketOptions, GridFSFindOptions};
#[test]
fn grid_fs_bucket_options_default() {
let options = GridFSBucketOptions::default();
assert_eq!(options.bucket_name, "fs");
assert_eq!(options.chunk_size_bytes, 255 * 1024);
assert_eq!(options.disable_md5, false);
}
#[test]
fn grid_fs_bucket_options_builder_default() {
let options = GridFSBucketOptions::builder().build();
assert_eq!(options.bucket_name, "fs");
assert_eq!(options.chunk_size_bytes, 255 * 1024);
assert_eq!(options.disable_md5, false);
}
#[test]
fn grid_fs_bucket_options_bucket_name() {
let options = GridFSBucketOptions::builder()
.bucket_name("newfs".into())
.build();
assert_eq!(options.bucket_name, "newfs");
}
#[test]
fn grid_fs_bucket_options_chunk_size_bytes() {
let options = GridFSBucketOptions::builder()
.chunk_size_bytes(1023)
.build();
assert_eq!(options.chunk_size_bytes, 1023);
}
#[test]
fn grid_fs_bucket_options_builder_chain() {
let options = GridFSBucketOptions::builder()
.bucket_name("newfs".into())
.chunk_size_bytes(1023)
.build();
assert_eq!(options.bucket_name, "newfs");
assert_eq!(options.chunk_size_bytes, 1023);
}
#[test]
fn grid_fs_find_options_builder_chain() {
let options = GridFSFindOptions::builder().skip(4).build();
assert_eq!(options.skip, 4);
}
#[test]
fn grid_fs_find_options_builder_default() {
let options = GridFSFindOptions::builder().build();
assert_eq!(options.allow_disk_use, None);
assert_eq!(options.batch_size, None);
assert_eq!(options.limit, None);
assert_eq!(options.max_time, None);
assert_eq!(options.no_cursor_timeout, None);
assert_eq!(options.skip, 0);
assert_eq!(options.sort, None);
}
#[test]
fn grid_fs_find_options_default() {
let options = GridFSFindOptions::default();
assert_eq!(options.allow_disk_use, None);
assert_eq!(options.batch_size, None);
assert_eq!(options.limit, None);
assert_eq!(options.max_time, None);
assert_eq!(options.no_cursor_timeout, None);
assert_eq!(options.skip, 0);
assert_eq!(options.sort, None);
}
}