#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Language {
#[default]
English,
Indonesian,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MessageKey {
InvalidProject,
InvalidApiKey,
InvalidAmount,
InvalidOrderId,
InvalidPaymentMethod,
FailedToEncode,
FailedToDecode,
RequestFailedPermanent,
RequestFailedAfterRetries,
}
pub fn get(lang: Language, key: MessageKey) -> &'static str {
match lang {
Language::English => match key {
MessageKey::InvalidProject => "project slug is required",
MessageKey::InvalidApiKey => "API key is required",
MessageKey::InvalidAmount => "amount must be greater than 0",
MessageKey::InvalidOrderId => "order ID is required",
MessageKey::InvalidPaymentMethod => "unsupported payment method: %s",
MessageKey::FailedToEncode => "failed to encode request as JSON",
MessageKey::FailedToDecode => "failed to decode response",
MessageKey::RequestFailedPermanent => "request failed due to permanent error",
MessageKey::RequestFailedAfterRetries => "request failed after %d retries",
},
Language::Indonesian => match key {
MessageKey::InvalidProject => "slug proyek wajib diisi",
MessageKey::InvalidApiKey => "API key wajib diisi",
MessageKey::InvalidAmount => "jumlah harus lebih dari 0",
MessageKey::InvalidOrderId => "ID pesanan wajib diisi",
MessageKey::InvalidPaymentMethod => "metode pembayaran tidak didukung: %s",
MessageKey::FailedToEncode => "gagal mengenkode permintaan sebagai JSON",
MessageKey::FailedToDecode => "gagal mendekode respons",
MessageKey::RequestFailedPermanent => "permintaan gagal karena kesalahan permanen",
MessageKey::RequestFailedAfterRetries => "permintaan gagal setelah %d percobaan ulang",
},
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn every_combination_resolves_to_a_unique_string() {
let keys = [
MessageKey::InvalidProject,
MessageKey::InvalidApiKey,
MessageKey::InvalidAmount,
MessageKey::InvalidOrderId,
MessageKey::InvalidPaymentMethod,
MessageKey::FailedToEncode,
MessageKey::FailedToDecode,
MessageKey::RequestFailedPermanent,
MessageKey::RequestFailedAfterRetries,
];
for key in keys {
let en = get(Language::English, key);
let id = get(Language::Indonesian, key);
assert!(!en.is_empty(), "missing English for {key:?}");
assert!(!id.is_empty(), "missing Indonesian for {key:?}");
assert_ne!(en, id, "English and Indonesian must differ for {key:?}");
}
}
#[test]
fn english_messages_match_expected_text() {
assert_eq!(
get(Language::English, MessageKey::InvalidProject),
"project slug is required"
);
assert_eq!(
get(Language::English, MessageKey::InvalidApiKey),
"API key is required"
);
assert_eq!(
get(Language::English, MessageKey::InvalidAmount),
"amount must be greater than 0"
);
assert_eq!(
get(Language::English, MessageKey::InvalidOrderId),
"order ID is required"
);
assert_eq!(
get(Language::English, MessageKey::InvalidPaymentMethod),
"unsupported payment method: %s"
);
assert_eq!(
get(Language::English, MessageKey::FailedToEncode),
"failed to encode request as JSON"
);
assert_eq!(
get(Language::English, MessageKey::FailedToDecode),
"failed to decode response"
);
assert_eq!(
get(Language::English, MessageKey::RequestFailedPermanent),
"request failed due to permanent error"
);
assert_eq!(
get(Language::English, MessageKey::RequestFailedAfterRetries),
"request failed after %d retries"
);
}
#[test]
fn indonesian_messages_match_expected_text() {
assert_eq!(
get(Language::Indonesian, MessageKey::InvalidProject),
"slug proyek wajib diisi"
);
assert_eq!(
get(Language::Indonesian, MessageKey::InvalidApiKey),
"API key wajib diisi"
);
assert_eq!(
get(Language::Indonesian, MessageKey::InvalidAmount),
"jumlah harus lebih dari 0"
);
assert_eq!(
get(Language::Indonesian, MessageKey::InvalidOrderId),
"ID pesanan wajib diisi"
);
assert_eq!(
get(Language::Indonesian, MessageKey::InvalidPaymentMethod),
"metode pembayaran tidak didukung: %s"
);
assert_eq!(
get(Language::Indonesian, MessageKey::FailedToEncode),
"gagal mengenkode permintaan sebagai JSON"
);
assert_eq!(
get(Language::Indonesian, MessageKey::FailedToDecode),
"gagal mendekode respons"
);
assert_eq!(
get(Language::Indonesian, MessageKey::RequestFailedPermanent),
"permintaan gagal karena kesalahan permanen"
);
assert_eq!(
get(Language::Indonesian, MessageKey::RequestFailedAfterRetries),
"permintaan gagal setelah %d percobaan ulang"
);
}
#[test]
fn language_default_is_english() {
assert_eq!(Language::default(), Language::English);
}
}