Skip to main content

wasm_dbms_api/dbms/validate/
locale.rs

1use crate::prelude::{Validate, Value};
2
3const ISO_3166_COUNTRIES: &[&str] = &[
4    "AD", "AE", "AF", "AG", "AI", "AL", "AM", "AO", "AQ", "AR", "AS", "AT", "AU", "AW", "AX", "AZ",
5    "BA", "BB", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BL", "BM", "BN", "BO", "BQ", "BR", "BS",
6    "BT", "BV", "BW", "BY", "BZ", "CA", "CC", "CD", "CF", "CG", "CH", "CI", "CK", "CL", "CM", "CN",
7    "CO", "CR", "CU", "CV", "CW", "CX", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE",
8    "EG", "EH", "ER", "ES", "ET", "FI", "FJ", "FM", "FO", "FR", "GA", "GB", "GD", "GE", "GF", "GG",
9    "GH", "GI", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GW", "GY", "HK", "HM", "HN",
10    "HR", "HT", "HU", "ID", "IE", "IL", "IM", "IN", "IO", "IQ", "IR", "IS", "IT", "JE", "JM", "JO",
11    "JP", "KE", "KG", "KH", "KI", "KM", "KN", "KP", "KR", "KW", "KY", "KZ", "LA", "LB", "LC", "LI",
12    "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "ME", "MF", "MG", "MH", "MK", "ML",
13    "MM", "MN", "MO", "MP", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "NA", "NC",
14    "NE", "NF", "NG", "NI", "NL", "NO", "NP", "NR", "NU", "NZ", "OM", "PA", "PE", "PF", "PG", "PH",
15    "PK", "PL", "PM", "PN", "PR", "PS", "PT", "PW", "PY", "QA", "RE", "RO", "RS", "RU", "RW", "SA",
16    "SB", "SC", "SD", "SE", "SG", "SH", "SI", "SJ", "SK", "SL", "SM", "SN", "SO", "SR", "SS", "ST",
17    "SV", "SX", "SY", "SZ", "TC", "TD", "TF", "TG", "TH", "TJ", "TK", "TL", "TM", "TN", "TO", "TR",
18    "TT", "TV", "TZ", "UA", "UG", "UM", "US", "UY", "UZ", "VA", "VC", "VE", "VG", "VI", "VN", "VU",
19    "WF", "WS", "YE", "YT", "ZA", "ZM", "ZW",
20];
21
22const ISO_639_1_COUNTRIES: &[&str] = &[
23    "aa", "ab", "ae", "af", "ak", "am", "an", "ar", "as", "av", "ay", "az", "ba", "be", "bg", "bh",
24    "bi", "bm", "bn", "bo", "br", "bs", "ca", "ce", "ch", "co", "cr", "cs", "cu", "cv", "cy", "da",
25    "de", "dv", "dz", "ee", "el", "en", "eo", "es", "et", "eu", "fa", "ff", "fi", "fj", "fo", "fr",
26    "fy", "ga", "gd", "gl", "gn", "gu", "gv", "ha", "he", "hi", "ho", "hr", "ht", "hu", "hy", "hz",
27    "ia", "id", "ie", "ig", "ii", "ik", "io", "is", "it", "iu", "ja", "jv", "ka", "kg", "ki", "kj",
28    "kk", "kl", "km", "kn", "ko", "kr", "ks", "ku", "kv", "kw", "ky", "la", "lb", "lg", "li", "ln",
29    "lo", "lt", "lu", "lv", "mg", "mh", "mi", "mk", "ml", "mn", "mr", "ms", "mt", "my", "na", "nb",
30    "nd", "ne", "ng", "nl", "nn", "no", "nr", "nv", "ny", "oc", "oj", "om", "or", "os", "pa", "pi",
31    "pl", "ps", "pt", "qu", "rm", "rn", "ro", "ru", "rw", "sa", "sc", "sd", "se", "sg", "si", "sk",
32    "sl", "sm", "sn", "so", "sq", "sr", "ss", "st", "su", "sv", "sw", "ta", "te", "tg", "th", "ti",
33    "tk", "tl", "tn", "to", "tr", "ts", "tt", "tw", "ty", "ug", "uk", "ur", "uz", "ve", "vi", "vo",
34    "wa", "wo", "xh", "yi", "yo", "za", "zh", "zu",
35];
36
37/// Validator for ISO3166 country codes.
38///
39/// # Examples
40///
41/// ```rust
42/// use wasm_dbms_api::prelude::{CountryIso3166Validator, Validate, Value};
43///
44/// let validator = CountryIso3166Validator;
45/// let valid_country = Value::Text("US".into());
46/// let invalid_country = Value::Text("XX".into());
47///
48/// assert!(validator.validate(&valid_country).is_ok());
49/// assert!(validator.validate(&invalid_country).is_err());
50/// ```
51pub struct CountryIso3166Validator;
52
53impl Validate for CountryIso3166Validator {
54    fn validate(&self, value: &Value) -> crate::prelude::DbmsResult<()> {
55        let Value::Text(text) = value else {
56            return Err(crate::prelude::DbmsError::Validation(
57                "Country ISO3166 validator only works on text values".to_string(),
58            ));
59        };
60
61        if !ISO_3166_COUNTRIES.contains(&text.as_str()) {
62            return Err(crate::prelude::DbmsError::Validation(format!(
63                "Value '{}' is not a valid ISO3166 country code",
64                text
65            )));
66        }
67
68        Ok(())
69    }
70}
71
72/// Validator for ISO639 country codes.
73///
74/// # Examples
75///
76/// ```rust
77/// use wasm_dbms_api::prelude::{CountryIso639Validator, Validate, Value};
78/// let validator = CountryIso639Validator;
79/// let valid_country = Value::Text("en".into());
80/// let invalid_country = Value::Text("xx".into());
81/// assert!(validator.validate(&valid_country).is_ok());
82/// assert!(validator.validate(&invalid_country).is_err());
83/// ```
84pub struct CountryIso639Validator;
85
86impl Validate for CountryIso639Validator {
87    fn validate(&self, value: &Value) -> crate::prelude::DbmsResult<()> {
88        let Value::Text(text) = value else {
89            return Err(crate::prelude::DbmsError::Validation(
90                "Country ISO639 validator only works on text values".to_string(),
91            ));
92        };
93
94        if !ISO_639_1_COUNTRIES.contains(&text.as_str()) {
95            return Err(crate::prelude::DbmsError::Validation(format!(
96                "Value '{}' is not a valid ISO639 country code",
97                text
98            )));
99        }
100
101        Ok(())
102    }
103}
104
105#[cfg(test)]
106mod tests {
107    use super::*;
108
109    #[test]
110    fn test_country_iso3166_validator() {
111        let validator = CountryIso3166Validator;
112        let valid_country = Value::Text("US".into());
113        let invalid_country = Value::Text("XX".into());
114        let wrong_type = Value::Int32(123i32.into());
115
116        assert!(validator.validate(&valid_country).is_ok());
117        assert!(validator.validate(&invalid_country).is_err());
118        assert!(validator.validate(&wrong_type).is_err());
119    }
120
121    #[test]
122    fn test_country_iso639_validator() {
123        let validator = CountryIso639Validator;
124        let valid_country = Value::Text("en".into());
125        let invalid_country = Value::Text("xx".into());
126        let wrong_type = Value::Int32(123i32.into());
127        assert!(validator.validate(&valid_country).is_ok());
128        assert!(validator.validate(&invalid_country).is_err());
129        assert!(validator.validate(&wrong_type).is_err());
130    }
131}