Skip to main content

mongodb/
action.rs

1//! Action builder types.
2
3mod aggregate;
4mod bulk_write;
5mod client_options;
6mod count;
7mod create_collection;
8mod create_index;
9#[cfg(feature = "in-use-encryption")]
10pub mod csfle;
11mod delete;
12mod distinct;
13mod drop;
14mod drop_index;
15mod find;
16mod find_and_modify;
17pub mod gridfs;
18mod insert_many;
19mod insert_one;
20mod list_collections;
21mod list_databases;
22mod list_indexes;
23mod perf;
24mod replace_one;
25mod run_command;
26mod search_index;
27mod session;
28mod shutdown;
29pub(crate) mod transaction;
30mod update;
31mod watch;
32
33use std::{future::IntoFuture, marker::PhantomData, ops::Deref};
34
35use crate::bson::Document;
36
37pub use aggregate::Aggregate;
38pub use bulk_write::BulkWrite;
39pub use client_options::ParseConnectionString;
40pub use count::{CountDocuments, EstimatedDocumentCount};
41pub use create_collection::CreateCollection;
42pub use create_index::CreateIndex;
43pub use delete::Delete;
44pub use distinct::Distinct;
45pub use drop::{DropCollection, DropDatabase};
46pub use drop_index::DropIndex;
47pub use find::{Find, FindOne};
48pub use find_and_modify::{FindOneAndDelete, FindOneAndReplace, FindOneAndUpdate};
49pub use insert_many::InsertMany;
50pub use insert_one::InsertOne;
51pub use list_collections::ListCollections;
52pub use list_databases::ListDatabases;
53pub use list_indexes::ListIndexes;
54pub use perf::WarmConnectionPool;
55pub use replace_one::ReplaceOne;
56pub use run_command::{RunCommand, RunCursorCommand};
57pub use search_index::{CreateSearchIndex, DropSearchIndex, ListSearchIndexes, UpdateSearchIndex};
58pub use session::StartSession;
59pub use shutdown::Shutdown;
60pub use transaction::{AbortTransaction, CommitTransaction, StartTransaction};
61pub use update::Update;
62pub use watch::Watch;
63
64#[allow(missing_docs)]
65pub struct ListSpecifications;
66#[allow(missing_docs)]
67pub struct ListNames;
68
69#[allow(missing_docs)]
70pub struct ImplicitSession;
71#[allow(missing_docs)]
72pub struct ExplicitSession<'a>(&'a mut crate::ClientSession);
73
74#[doc(hidden)]
75pub trait ActionSession<'a> {
76    fn into_opt_session(self) -> Option<&'a mut crate::ClientSession>;
77}
78
79impl<'a> ActionSession<'a> for ImplicitSession {
80    fn into_opt_session(self) -> Option<&'a mut crate::ClientSession> {
81        None
82    }
83}
84
85impl<'a> ActionSession<'a> for ExplicitSession<'a> {
86    fn into_opt_session(self) -> Option<&'a mut crate::ClientSession> {
87        Some(self.0)
88    }
89}
90
91#[allow(missing_docs)]
92pub struct Single;
93#[allow(missing_docs)]
94pub struct Multiple;
95
96use mongodb_internal_macros::{export_doc, option_setters, options_doc};
97
98pub(crate) mod private {
99    pub trait Sealed {}
100}
101
102/// A pending action to execute on the server.  The action can be configured via chained methods and
103/// executed via `await` (or `run` if using the sync client).
104pub trait Action: private::Sealed + IntoFuture {
105    /// If the value is `Some`, call the provided function on `self`.  Convenient for chained
106    /// updates with values that need to be set conditionally.  For example:
107    /// ```rust
108    /// # use mongodb::{Client, error::Result, bson::Document};
109    /// use mongodb::action::Action;
110    /// async fn list_my_collections(client: &Client, filter: Option<Document>) -> Result<Vec<String>> {
111    ///     client.database("my_db")
112    ///         .list_collection_names()
113    ///         .optional(filter, |a, f| a.filter(f))
114    ///         .await
115    /// }
116    /// ```
117    fn optional<Value>(self, value: Option<Value>, f: impl FnOnce(Self, Value) -> Self) -> Self
118    where
119        Self: Sized,
120    {
121        match value {
122            Some(value) => f(self, value),
123            None => self,
124        }
125    }
126}
127
128pub(crate) use mongodb_internal_macros::{action_impl, deeplink};
129
130use crate::Collection;
131
132pub(crate) struct CollRef<'a> {
133    inner: Collection<Document>,
134    _ref: PhantomData<&'a ()>,
135}
136
137impl<'a> CollRef<'a> {
138    fn new<T: Send + Sync>(coll: &'a Collection<T>) -> Self {
139        Self {
140            inner: coll.clone_with_type(),
141            _ref: PhantomData,
142        }
143    }
144
145    pub(crate) fn inner(&self) -> &Collection<Document> {
146        &self.inner
147    }
148}
149
150impl Deref for CollRef<'_> {
151    type Target = Collection<Document>;
152
153    fn deref(&self) -> &Self::Target {
154        &self.inner
155    }
156}