1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
#[cfg(test)] mod test; use serde::Deserialize; use crate::{ bson::{doc, Document}, cmap::{Command, CommandResponse, StreamDescription}, coll::{options::EstimatedDocumentCountOptions, Namespace}, error::Result, operation::{append_options, Operation}, selection_criteria::SelectionCriteria, }; pub(crate) struct Count { ns: Namespace, options: Option<EstimatedDocumentCountOptions>, } impl Count { pub fn new(ns: Namespace, options: Option<EstimatedDocumentCountOptions>) -> Self { Count { ns, options } } #[cfg(test)] pub(crate) fn empty() -> Self { Count { ns: Namespace { db: String::new(), coll: String::new(), }, options: None, } } } impl Operation for Count { type O = i64; const NAME: &'static str = "count"; fn build(&self, description: &StreamDescription) -> Result<Command> { let mut body: Document = doc! { Self::NAME: self.ns.coll.clone(), }; append_options(&mut body, self.options.as_ref())?; Ok(Command::new( Self::NAME.to_string(), self.ns.db.clone(), body, )) } fn handle_response(&self, response: CommandResponse) -> Result<Self::O> { response.body::<ResponseBody>().map(|body| body.n) } fn selection_criteria(&self) -> Option<&SelectionCriteria> { if let Some(ref options) = self.options { return options.selection_criteria.as_ref(); } None } } #[derive(Debug, Deserialize)] struct ResponseBody { n: i64, }