use std::fmt;
use std::ops::Deref;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serde", serde(transparent))]
pub struct DiagnosticCode(String);
impl DiagnosticCode {
#[must_use]
pub fn new(code: impl Into<String>) -> Self {
Self(code.into())
}
#[must_use]
pub fn as_str(&self) -> &str {
&self.0
}
}
impl fmt::Display for DiagnosticCode {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(self.as_str())
}
}
impl AsRef<str> for DiagnosticCode {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl Deref for DiagnosticCode {
type Target = str;
fn deref(&self) -> &Self::Target {
self.as_str()
}
}
impl From<&str> for DiagnosticCode {
fn from(code: &str) -> Self {
Self::new(code)
}
}
impl From<String> for DiagnosticCode {
fn from(code: String) -> Self {
Self::new(code)
}
}
impl PartialEq<&str> for DiagnosticCode {
fn eq(&self, other: &&str) -> bool {
self.as_str() == *other
}
}
impl PartialEq<DiagnosticCode> for &str {
fn eq(&self, other: &DiagnosticCode) -> bool {
*self == other.as_str()
}
}
pub mod icu {
pub const UNSUPPORTED_FORMATTER_KIND: &str = "icu.unsupported_formatter_kind";
pub const UNSUPPORTED_FORMATTER_STYLE: &str = "icu.unsupported_formatter_style";
pub const MISSING_ARGUMENT: &str = "icu.missing_argument";
pub const ARGUMENT_KIND_CHANGED: &str = "icu.argument_kind_changed";
pub const EXTRA_ARGUMENT: &str = "icu.extra_argument";
pub const FORMATTER_STYLE_CHANGED: &str = "icu.formatter_style_changed";
pub const MISSING_TAG: &str = "icu.missing_tag";
pub const EXTRA_TAG: &str = "icu.extra_tag";
pub const MISSING_SELECT_SELECTOR: &str = "icu.missing_select_selector";
pub const EXTRA_SELECT_SELECTOR: &str = "icu.extra_select_selector";
pub const PLURAL_OFFSET_CHANGED: &str = "icu.plural_offset_changed";
pub const MISSING_PLURAL_SELECTOR: &str = "icu.missing_plural_selector";
pub const PATTERN_STYLE_DISCOURAGED: &str = "icu.pattern_style_discouraged";
pub const ALL: &[&str] = &[
UNSUPPORTED_FORMATTER_KIND,
UNSUPPORTED_FORMATTER_STYLE,
MISSING_ARGUMENT,
ARGUMENT_KIND_CHANGED,
EXTRA_ARGUMENT,
FORMATTER_STYLE_CHANGED,
MISSING_TAG,
EXTRA_TAG,
MISSING_SELECT_SELECTOR,
EXTRA_SELECT_SELECTOR,
PLURAL_OFFSET_CHANGED,
MISSING_PLURAL_SELECTOR,
PATTERN_STYLE_DISCOURAGED,
];
}
pub mod metadata {
pub const INVALID_MSGID: &str = "metadata.invalid_msgid";
pub const MISSING_ARGUMENT: &str = "metadata.missing_argument";
pub const EXTRA_ARGUMENT: &str = "metadata.extra_argument";
pub const ARGUMENT_KIND_MISMATCH: &str = "metadata.argument_kind_mismatch";
pub const MISSING_TAG: &str = "metadata.missing_tag";
pub const EXTRA_TAG: &str = "metadata.extra_tag";
pub const MISSING_SELECTOR: &str = "metadata.missing_selector";
pub const EXTRA_SELECTOR: &str = "metadata.extra_selector";
pub const SELECTOR_KIND_MISMATCH: &str = "metadata.selector_kind_mismatch";
pub const MISSING_SELECTOR_CASE: &str = "metadata.missing_selector_case";
pub const EXTRA_SELECTOR_CASE: &str = "metadata.extra_selector_case";
pub const SELECTOR_OFFSET_MISMATCH: &str = "metadata.selector_offset_mismatch";
pub const ALL: &[&str] = &[
INVALID_MSGID,
MISSING_ARGUMENT,
EXTRA_ARGUMENT,
ARGUMENT_KIND_MISMATCH,
MISSING_TAG,
EXTRA_TAG,
MISSING_SELECTOR,
EXTRA_SELECTOR,
SELECTOR_KIND_MISMATCH,
MISSING_SELECTOR_CASE,
EXTRA_SELECTOR_CASE,
SELECTOR_OFFSET_MISMATCH,
];
}
#[cfg(test)]
mod tests {
use super::DiagnosticCode;
#[test]
fn diagnostic_code_preserves_canonical_string_access() {
let code = DiagnosticCode::from(String::from("icu.missing_argument"));
assert_eq!(code.as_str(), "icu.missing_argument");
assert_eq!(code.as_ref(), "icu.missing_argument");
assert_eq!(&*code, "icu.missing_argument");
assert_eq!(code.to_string(), "icu.missing_argument");
assert_eq!(code, "icu.missing_argument");
assert_eq!("icu.missing_argument", code);
}
}