ferrocat_icu/
diagnostic_codes.rs1use std::fmt;
12use std::ops::Deref;
13
14#[cfg(feature = "serde")]
15use serde::{Deserialize, Serialize};
16
17#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
23#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
24#[cfg_attr(feature = "serde", serde(transparent))]
25pub struct DiagnosticCode(String);
26
27impl DiagnosticCode {
28 #[must_use]
30 pub fn new(code: impl Into<String>) -> Self {
31 Self(code.into())
32 }
33
34 #[must_use]
36 pub fn as_str(&self) -> &str {
37 &self.0
38 }
39}
40
41impl fmt::Display for DiagnosticCode {
42 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
43 formatter.write_str(self.as_str())
44 }
45}
46
47impl AsRef<str> for DiagnosticCode {
48 fn as_ref(&self) -> &str {
49 self.as_str()
50 }
51}
52
53impl Deref for DiagnosticCode {
54 type Target = str;
55
56 fn deref(&self) -> &Self::Target {
57 self.as_str()
58 }
59}
60
61impl From<&str> for DiagnosticCode {
62 fn from(code: &str) -> Self {
63 Self::new(code)
64 }
65}
66
67impl From<String> for DiagnosticCode {
68 fn from(code: String) -> Self {
69 Self::new(code)
70 }
71}
72
73impl PartialEq<&str> for DiagnosticCode {
74 fn eq(&self, other: &&str) -> bool {
75 self.as_str() == *other
76 }
77}
78
79impl PartialEq<DiagnosticCode> for &str {
80 fn eq(&self, other: &DiagnosticCode) -> bool {
81 *self == other.as_str()
82 }
83}
84pub mod icu {
88 pub const UNSUPPORTED_FORMATTER_KIND: &str = "icu.unsupported_formatter_kind";
90 pub const UNSUPPORTED_FORMATTER_STYLE: &str = "icu.unsupported_formatter_style";
92 pub const MISSING_ARGUMENT: &str = "icu.missing_argument";
94 pub const ARGUMENT_KIND_CHANGED: &str = "icu.argument_kind_changed";
96 pub const EXTRA_ARGUMENT: &str = "icu.extra_argument";
98 pub const FORMATTER_STYLE_CHANGED: &str = "icu.formatter_style_changed";
100 pub const MISSING_TAG: &str = "icu.missing_tag";
102 pub const EXTRA_TAG: &str = "icu.extra_tag";
104 pub const MISSING_SELECT_SELECTOR: &str = "icu.missing_select_selector";
106 pub const EXTRA_SELECT_SELECTOR: &str = "icu.extra_select_selector";
108 pub const PLURAL_OFFSET_CHANGED: &str = "icu.plural_offset_changed";
110 pub const MISSING_PLURAL_SELECTOR: &str = "icu.missing_plural_selector";
112 pub const PATTERN_STYLE_DISCOURAGED: &str = "icu.pattern_style_discouraged";
114
115 pub const ALL: &[&str] = &[
117 UNSUPPORTED_FORMATTER_KIND,
118 UNSUPPORTED_FORMATTER_STYLE,
119 MISSING_ARGUMENT,
120 ARGUMENT_KIND_CHANGED,
121 EXTRA_ARGUMENT,
122 FORMATTER_STYLE_CHANGED,
123 MISSING_TAG,
124 EXTRA_TAG,
125 MISSING_SELECT_SELECTOR,
126 EXTRA_SELECT_SELECTOR,
127 PLURAL_OFFSET_CHANGED,
128 MISSING_PLURAL_SELECTOR,
129 PATTERN_STYLE_DISCOURAGED,
130 ];
131}
132
133pub mod metadata {
135 pub const INVALID_MSGID: &str = "metadata.invalid_msgid";
137 pub const MISSING_ARGUMENT: &str = "metadata.missing_argument";
139 pub const EXTRA_ARGUMENT: &str = "metadata.extra_argument";
141 pub const ARGUMENT_KIND_MISMATCH: &str = "metadata.argument_kind_mismatch";
143 pub const MISSING_TAG: &str = "metadata.missing_tag";
145 pub const EXTRA_TAG: &str = "metadata.extra_tag";
147 pub const MISSING_SELECTOR: &str = "metadata.missing_selector";
149 pub const EXTRA_SELECTOR: &str = "metadata.extra_selector";
151 pub const SELECTOR_KIND_MISMATCH: &str = "metadata.selector_kind_mismatch";
153 pub const MISSING_SELECTOR_CASE: &str = "metadata.missing_selector_case";
155 pub const EXTRA_SELECTOR_CASE: &str = "metadata.extra_selector_case";
157 pub const SELECTOR_OFFSET_MISMATCH: &str = "metadata.selector_offset_mismatch";
159
160 pub const ALL: &[&str] = &[
162 INVALID_MSGID,
163 MISSING_ARGUMENT,
164 EXTRA_ARGUMENT,
165 ARGUMENT_KIND_MISMATCH,
166 MISSING_TAG,
167 EXTRA_TAG,
168 MISSING_SELECTOR,
169 EXTRA_SELECTOR,
170 SELECTOR_KIND_MISMATCH,
171 MISSING_SELECTOR_CASE,
172 EXTRA_SELECTOR_CASE,
173 SELECTOR_OFFSET_MISMATCH,
174 ];
175}
176
177#[cfg(test)]
178mod tests {
179 use super::DiagnosticCode;
180
181 #[test]
182 fn diagnostic_code_preserves_canonical_string_access() {
183 let code = DiagnosticCode::from(String::from("icu.missing_argument"));
184
185 assert_eq!(code.as_str(), "icu.missing_argument");
186 assert_eq!(code.as_ref(), "icu.missing_argument");
187 assert_eq!(&*code, "icu.missing_argument");
188 assert_eq!(code.to_string(), "icu.missing_argument");
189 assert_eq!(code, "icu.missing_argument");
190 assert_eq!("icu.missing_argument", code);
191 }
192}