2026-01-06 16:19:15 -05:00
|
|
|
use crate::{
|
2026-02-13 12:00:39 -05:00
|
|
|
action::{Field, FieldType},
|
2026-02-12 12:24:20 -05:00
|
|
|
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)]
|
2026-02-12 22:49:19 -05:00
|
|
|
pub enum ErrorID {
|
2026-02-25 10:16:50 -05:00
|
|
|
Document(NameType),
|
2026-02-12 22:49:19 -05:00
|
|
|
DocumentNameAlreadyExists,
|
|
|
|
|
DocumentNotFound,
|
|
|
|
|
FieldDataMustBeUnique,
|
|
|
|
|
FieldInvalidNone,
|
2025-12-24 17:54:25 -05:00
|
|
|
FieldInvalidType,
|
|
|
|
|
FieldMissingData,
|
2026-02-12 22:49:19 -05:00
|
|
|
FieldNameAlreadyExists,
|
|
|
|
|
IndexEntryAlreadyExists,
|
2026-02-12 12:24:20 -05:00
|
|
|
InvalidFieldName(Name),
|
2026-02-12 22:49:19 -05:00
|
|
|
NameAlreadyExists,
|
|
|
|
|
NameLanguageNotUnique,
|
|
|
|
|
NameNotFound,
|
2026-02-19 14:26:29 -05:00
|
|
|
TimeOut,
|
2026-02-12 12:24:20 -05:00
|
|
|
}
|
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-12 12:24:20 -05:00
|
|
|
#[derive(Clone, Debug)]
|
2026-02-12 22:49:19 -05:00
|
|
|
pub struct MTTError {
|
2026-02-25 10:16:50 -05:00
|
|
|
errors: VecDeque<ErrorID>,
|
2026-02-12 12:24:20 -05:00
|
|
|
}
|
|
|
|
|
|
2026-02-12 22:49:19 -05:00
|
|
|
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-12 12:24:20 -05:00
|
|
|
}
|
|
|
|
|
|
2026-02-25 10:16:50 -05:00
|
|
|
pub fn get_error_ids(&self) -> &VecDeque<ErrorID> {
|
|
|
|
|
&self.errors
|
2026-02-12 12:24:20 -05:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-12 22:49:19 -05:00
|
|
|
impl fmt::Display for MTTError {
|
2026-02-12 12:24:20 -05:00
|
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
2026-02-25 10:16:50 -05:00
|
|
|
write!(f, "error: {:?}", self.errors)
|
2026-02-12 12:24:20 -05:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-12 22:49:19 -05:00
|
|
|
impl Error for MTTError {}
|
2026-02-12 12:24:20 -05:00
|
|
|
|
2026-02-12 22:49:19 -05:00
|
|
|
impl MessageAction for MTTError {
|
2026-02-12 12:24:20 -05:00
|
|
|
fn doc_name(&self) -> &NameType {
|
2026-02-25 10:16:50 -05:00
|
|
|
self.errors.front().unwrap().doc_name()
|
2026-02-12 12:24:20 -05:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
|
mod errors {
|
|
|
|
|
use super::*;
|
2026-02-25 10:16:50 -05:00
|
|
|
use crate::support_tests::random_name;
|
2026-02-12 12:24:20 -05:00
|
|
|
|
|
|
|
|
#[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);
|
2026-02-12 12:24:20 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[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);
|
2026-02-12 12:24:20 -05:00
|
|
|
}
|
|
|
|
|
}
|