morethantext/src/mtterror.rs

130 lines
3.3 KiB
Rust
Raw Normal View History

2026-01-06 16:19:15 -05:00
use crate::{
action::{Field, FieldType},
message::MessageAction,
name::{Name, NameType},
2026-01-06 16:19:15 -05:00
};
2025-12-24 17:54:25 -05:00
use isolang::Language;
2026-02-25 10:16:50 -05:00
use std::{collections::VecDeque, error::Error, fmt};
2025-12-24 17:54:25 -05:00
use uuid::Uuid;
#[derive(Clone, Debug)]
pub enum ErrorID {
2026-02-25 10:16:50 -05:00
Document(NameType),
DocumentNameAlreadyExists,
DocumentNotFound,
FieldDataMustBeUnique,
FieldInvalidNone,
2025-12-24 17:54:25 -05:00
FieldInvalidType,
FieldMissingData,
FieldNameAlreadyExists,
IndexEntryAlreadyExists,
InvalidFieldName(Name),
NameAlreadyExists,
NameLanguageNotUnique,
NameNotFound(NameType),
2026-02-19 14:26:29 -05:00
TimeOut,
}
2026-02-25 10:16:50 -05:00
impl MessageAction for ErrorID {
fn doc_name(&self) -> &NameType {
match self {
Self::Document(data) => data,
_ => &NameType::None,
}
}
}
#[cfg(test)]
mod error_ids {
use super::*;
use crate::support_tests::random_name;
#[test]
fn do_errors_return_none_doc_name() {
let errors = [ErrorID::FieldInvalidNone, ErrorID::FieldMissingData];
for err in errors.iter() {
assert_eq!(err.doc_name(), &NameType::None);
}
}
#[test]
fn does_document_error_return_document_name() {
let name: NameType = random_name().into();
let err = ErrorID::Document(name.clone());
assert_eq!(err.doc_name(), &name);
}
}
#[derive(Clone, Debug)]
pub struct MTTError {
2026-02-25 10:16:50 -05:00
errors: VecDeque<ErrorID>,
}
impl MTTError {
2026-02-25 10:16:50 -05:00
pub fn new(err: ErrorID) -> Self {
let mut errs = VecDeque::new();
errs.push_front(err);
Self { errors: errs }
}
pub fn add_parent(&mut self, err: ErrorID) {
self.errors.push_front(err);
}
2026-02-25 10:16:50 -05:00
pub fn get_error_ids(&self) -> &VecDeque<ErrorID> {
&self.errors
}
}
impl fmt::Display for MTTError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2026-02-25 10:16:50 -05:00
write!(f, "error: {:?}", self.errors)
}
}
impl Error for MTTError {}
impl MessageAction for MTTError {
fn doc_name(&self) -> &NameType {
2026-02-25 10:16:50 -05:00
self.errors.front().unwrap().doc_name()
}
}
#[cfg(test)]
mod errors {
use super::*;
2026-02-25 10:16:50 -05:00
use crate::support_tests::random_name;
#[test]
2026-02-25 10:16:50 -05:00
fn can_create_new_error() {
let err = MTTError::new(ErrorID::FieldInvalidNone);
assert_eq!(err.doc_name(), &NameType::None);
}
#[test]
2026-02-25 10:16:50 -05:00
fn does_error_return_none_for_most_errors() {
let base_err = ErrorID::FieldInvalidNone;
let mut holder: VecDeque<ErrorID> = VecDeque::new();
holder.push_front(base_err.clone());
let expected = format!("error: {:?}", holder);
let err = MTTError::new(base_err.clone());
assert_eq!(err.to_string(), expected);
assert_eq!(err.doc_name(), &NameType::None);
}
#[test]
fn can_add_parent_error() {
let base_err = ErrorID::FieldInvalidNone;
let name: NameType = random_name().into();
let doc_err = ErrorID::Document(name.clone());
let mut err = MTTError::new(ErrorID::FieldInvalidNone);
err.add_parent(doc_err.clone());
let mut holder: VecDeque<ErrorID> = VecDeque::new();
holder.push_front(base_err.clone());
holder.push_front(doc_err.clone());
let expected = format!("error: {:?}", holder);
assert_eq!(err.to_string(), expected);
assert_eq!(err.doc_name(), &name);
}
}