use mongodb::bson::Document;
use super::export::StreamingQuery;
#[derive(Debug, Clone)]
pub struct ExecutionResult {
pub success: bool,
pub data: ResultData,
pub stats: ExecutionStats,
pub error: Option<String>,
}
pub enum ResultData {
Documents(Vec<Document>),
DocumentsWithPagination {
documents: Vec<Document>,
has_more: bool,
displayed: usize,
},
Document(Document),
InsertOne { inserted_id: String },
InsertMany { inserted_ids: Vec<String> },
Update { matched: u64, modified: u64 },
Delete { deleted: u64 },
Count(u64),
Message(String),
List(Vec<String>),
None,
Stream(Box<dyn StreamingQuery>),
}
impl std::fmt::Debug for ResultData {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ResultData::Documents(docs) => f.debug_tuple("Documents").field(docs).finish(),
ResultData::DocumentsWithPagination { documents, has_more, displayed } => {
f.debug_struct("DocumentsWithPagination")
.field("documents", documents)
.field("has_more", has_more)
.field("displayed", displayed)
.finish()
}
ResultData::Document(doc) => f.debug_tuple("Document").field(doc).finish(),
ResultData::InsertOne { inserted_id } => {
f.debug_struct("InsertOne").field("inserted_id", inserted_id).finish()
}
ResultData::InsertMany { inserted_ids } => {
f.debug_struct("InsertMany").field("inserted_ids", inserted_ids).finish()
}
ResultData::Update { matched, modified } => {
f.debug_struct("Update")
.field("matched", matched)
.field("modified", modified)
.finish()
}
ResultData::Delete { deleted } => {
f.debug_struct("Delete").field("deleted", deleted).finish()
}
ResultData::Count(count) => f.debug_tuple("Count").field(count).finish(),
ResultData::Message(msg) => f.debug_tuple("Message").field(msg).finish(),
ResultData::List(list) => f.debug_tuple("List").field(list).finish(),
ResultData::None => f.write_str("None"),
ResultData::Stream(_) => f.write_str("Stream(<streaming query>)"),
}
}
}
impl Clone for ResultData {
fn clone(&self) -> Self {
match self {
ResultData::Documents(docs) => ResultData::Documents(docs.clone()),
ResultData::DocumentsWithPagination { documents, has_more, displayed } => {
ResultData::DocumentsWithPagination {
documents: documents.clone(),
has_more: *has_more,
displayed: *displayed,
}
}
ResultData::Document(doc) => ResultData::Document(doc.clone()),
ResultData::InsertOne { inserted_id } => ResultData::InsertOne {
inserted_id: inserted_id.clone(),
},
ResultData::InsertMany { inserted_ids } => ResultData::InsertMany {
inserted_ids: inserted_ids.clone(),
},
ResultData::Update { matched, modified } => ResultData::Update {
matched: *matched,
modified: *modified,
},
ResultData::Delete { deleted } => ResultData::Delete {
deleted: *deleted,
},
ResultData::Count(count) => ResultData::Count(*count),
ResultData::Message(msg) => ResultData::Message(msg.clone()),
ResultData::List(list) => ResultData::List(list.clone()),
ResultData::None => ResultData::None,
ResultData::Stream(_) => {
panic!("Cannot clone ResultData::Stream - streaming queries are not cloneable")
}
}
}
}
#[derive(Debug, Clone, Default)]
pub struct ExecutionStats {
pub execution_time_ms: u64,
#[allow(dead_code)]
pub documents_returned: usize,
pub documents_affected: Option<u64>,
}
impl ExecutionResult {
#[allow(dead_code)]
pub fn success(data: ResultData, stats: ExecutionStats) -> Self {
Self {
success: true,
data,
stats,
error: None,
}
}
#[allow(dead_code)]
pub fn error(error: String) -> Self {
Self {
success: false,
data: ResultData::None,
stats: ExecutionStats::default(),
error: Some(error),
}
}
}