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-12 12:24:20 -05:00
|
|
|
use std::{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 {
|
|
|
|
|
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-12 12:24:20 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[derive(Clone, Debug)]
|
2026-02-12 22:49:19 -05:00
|
|
|
pub struct MTTError {
|
2026-02-12 12:24:20 -05:00
|
|
|
doc_name: NameType,
|
|
|
|
|
error_id: ErrorID,
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-12 22:49:19 -05:00
|
|
|
impl MTTError {
|
|
|
|
|
pub fn new<NT>(doc_name: NT, error: ErrorID) -> MTTError
|
2026-02-12 12:24:20 -05:00
|
|
|
where
|
|
|
|
|
NT: Into<NameType>,
|
|
|
|
|
{
|
|
|
|
|
Self {
|
|
|
|
|
doc_name: doc_name.into(),
|
|
|
|
|
error_id: error,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn error_id(&self) -> &ErrorID {
|
|
|
|
|
&self.error_id
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
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 {
|
|
|
|
|
write!(f, "{:?} error: {:?}", self.doc_name, self.error_id)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
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 {
|
|
|
|
|
&self.doc_name
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
|
mod errors {
|
|
|
|
|
use super::*;
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn can_create_error() {
|
|
|
|
|
let doc_name = Name::english(Uuid::new_v4().to_string().as_str());
|
|
|
|
|
let expected_name: NameType = doc_name.clone().into();
|
2026-02-12 22:49:19 -05:00
|
|
|
let error = ErrorID::DocumentNameAlreadyExists;
|
|
|
|
|
let err = MTTError::new(doc_name.clone(), error.clone());
|
2026-02-12 12:24:20 -05:00
|
|
|
assert_eq!(err.doc_name(), &expected_name);
|
|
|
|
|
let err_id = err.error_id();
|
|
|
|
|
match err_id {
|
2026-02-12 22:49:19 -05:00
|
|
|
ErrorID::DocumentNameAlreadyExists => {}
|
2026-02-12 12:24:20 -05:00
|
|
|
_ => unreachable!("got {:?}, should have been invalid document name", err_id),
|
|
|
|
|
}
|
|
|
|
|
assert_eq!(
|
|
|
|
|
err.to_string(),
|
|
|
|
|
format!("{:?} error: {:?}", NameType::Name(doc_name), error)
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn does_error_ids_contain_data() {
|
|
|
|
|
let doc_name = Name::english(Uuid::new_v4().to_string().as_str());
|
|
|
|
|
let expected_name: NameType = doc_name.clone().into();
|
|
|
|
|
let field_name = Name::english(Uuid::new_v4().to_string().as_str());
|
|
|
|
|
let error = ErrorID::InvalidFieldName(field_name.clone());
|
2026-02-12 22:49:19 -05:00
|
|
|
let err = MTTError::new(doc_name.clone(), error.clone());
|
2026-02-12 12:24:20 -05:00
|
|
|
assert_eq!(err.doc_name(), &expected_name);
|
|
|
|
|
let err_id = err.error_id();
|
|
|
|
|
match err_id {
|
|
|
|
|
ErrorID::InvalidFieldName(data) => assert_eq!(data, &field_name),
|
|
|
|
|
_ => unreachable!("got {:?}, should have been invalid field name", err_id),
|
|
|
|
|
}
|
|
|
|
|
assert_eq!(
|
|
|
|
|
err.to_string(),
|
|
|
|
|
format!("{:?} error: {:?}", NameType::Name(doc_name), error)
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|