use std::{error::Error, fmt};
#[derive(Debug)]
pub struct MongoStreamError {
message: String,
}
impl MongoStreamError {
pub fn new(message: impl Into<String>) -> Self {
Self {
message: message.into(),
}
}
}
impl Error for MongoStreamError {}
impl fmt::Display for MongoStreamError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "MongoStream error: {}", self.message)
}
}
impl From<mongodb::error::Error> for MongoStreamError {
fn from(error: mongodb::error::Error) -> Self {
Self {
message: error.to_string(),
}
}
}
impl From<tokio::sync::mpsc::error::SendError<()>> for MongoStreamError {
fn from(error: tokio::sync::mpsc::error::SendError<()>) -> Self {
Self {
message: format!("Failed to send close signal: {}", error),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use tokio::sync::mpsc::error::SendError;
#[test]
fn test_new_error() {
let err = MongoStreamError::new("test error");
assert_eq!(err.message, "test error");
}
#[test]
fn test_display_formatting() {
let err = MongoStreamError::new("test error");
assert_eq!(format!("{}", err), "MongoStream error: test error");
}
#[test]
fn test_error_trait() {
let err = MongoStreamError::new("test error");
assert!(err.source().is_none());
}
#[test]
fn test_from_send_error() {
let send_err = SendError(());
let err: MongoStreamError = send_err.into();
assert!(err.message.contains("Failed to send close signal"));
}
}