1use crate::EnvLang;
2use crate::EnvLangError;
3use crate::EnvLangErrorKind;
4
5pub fn to_struct(lang_env: &str) -> Result<EnvLang, EnvLangError> {
27
28 let mut result = EnvLang{
30 language: None,
31 localisation: None,
32 charset: None,
33 variant: None,
34 };
35
36 if lang_env.len() > 0 {
37
38 let split: Vec<&str> = lang_env.split(' ').collect();
40 if split.len() > 1 {
41 return Err(EnvLangError::from(EnvLangErrorKind::SpaceNotAllow))
42 }
43
44 let split: Vec<&str> = lang_env.split('.').collect();
46 if split.len() > 2 {
47 return Err(EnvLangError::from(EnvLangErrorKind::TooManyPoint))
48 }
49
50 let left_point = split[0];
52 let mut right_point = "";
53 if split.len() == 2 {
54 right_point = split[1]
55 }
56
57 let split: Vec<&str> = left_point.split('_').collect();
59 if split.len() > 2 {
60 return Err(EnvLangError::from(EnvLangErrorKind::TooManyUnderscore))
61 }
62
63 let left_underscore = split[0];
65 let mut right_underscore = "";
66 if split.len() == 2 {
67 right_underscore = split[1]
68 }
69
70 if left_underscore.len() > 0 { result.language = Some(left_underscore); }
72 if right_underscore.len() > 0 { result.localisation = Some(right_underscore); }
73
74 if right_point.len() > 0 {
76
77 let split: Vec<&str> = right_point.split('@').collect();
79 if split.len() > 2 {
80 return Err(EnvLangError::from(EnvLangErrorKind::TooManyArobase))
81 }
82
83 let left_arobase = split[0];
85 let mut right_arobase = "";
86 if split.len() == 2 {
87 right_arobase = split[1]
88 }
89
90 if left_arobase.len() > 0 { result.charset = Some(left_arobase); }
92 if right_arobase.len() > 0 { result.variant = Some(right_arobase); }
93
94 }
95
96 }
97
98 Ok(result)
99}