Skip to main content

itools_core/
lib.rs

1#![warn(missing_docs)]
2
3//! iTools 核心功能模块
4//!
5//! 提供核心功能,包括可本地化错误类型、工具函数和通用组件。
6
7/// 可本地化错误 trait
8///
9/// 实现此 trait 的错误类型可以自动生成本地化的错误消息
10pub trait LocalizableError: std::error::Error {
11    /// 获取错误的本地化键
12    ///
13    /// # Returns
14    /// - 错误的本地化键字符串
15    fn localization_key(&self) -> &str;
16
17    /// 获取错误的本地化消息
18    ///
19    /// # Arguments
20    /// - `locale`: 语言代码,如 "en" 或 "zh-CN",
21    ///   传空字符串 "" 使用全局设置的语言
22    ///
23    /// # Returns
24    /// - 本地化的错误消息字符串
25    fn localize(&self, locale: &str) -> String;
26}
27
28/// 错误类型宏
29///
30/// 用于创建可本地化的错误类型
31///
32/// # 语法
33///
34/// 支持两种形式:
35/// 1. 简单形式(无参数):`Variant => "key"`
36/// 2. 带参数形式:`Variant(ty1, ty2) => "key"`
37#[macro_export]
38macro_rules! localizable_error {
39    ($name:ident {
40        $($variant:ident $(($($field:ty),*))? => $key:expr),* $(,)?
41    }) => {
42        #[derive(Debug, Clone, PartialEq)]
43        pub enum $name {
44            $($variant $(($($field),*))?,
45            )*
46        }
47
48        impl std::fmt::Display for $name {
49            fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
50                write!(f, "{}", self.localize(""))
51            }
52        }
53
54        impl std::error::Error for $name {}
55
56        impl $crate::LocalizableError for $name {
57            fn localization_key(&self) -> &str {
58                match self {
59                    $(
60                        Self::$variant $(($($field),*))? => $key,
61                    )*
62                }
63            }
64
65            fn localize(&self, _locale: &str) -> String {
66                match self {
67                    $(
68                        Self::$variant $(($($field),*))? => {
69                            $(let ($($field),*) = ($($field),*);)?
70                            itools_localization::t($key)
71                        }
72                    )*
73                }
74            }
75        }
76    };
77}