env_lang/
to_struct.rs

1use crate::EnvLang;
2use crate::EnvLangError;
3use crate::EnvLangErrorKind;
4
5// ------------------------------------------------------------------------------------
6// to_struct()
7// ------------------------------------------------------------------------------------
8/// return struct EnvLang or an error EnvLangErrorKind
9///
10/// # Examples
11/// ```rust
12/// extern crate env_lang;
13/// use env_lang::{to_struct, EnvLang};
14/// fn main() {
15///     let lang_env = "fr_FR.UTF-8@euro"; // or std::env::var("LANG")
16///     let result: EnvLang = to_struct(&lang_env).unwrap();
17///     assert!(result == EnvLang{
18///         language: Some("fr"),
19///         localisation: Some("FR"),
20///         charset: Some("UTF-8"),
21///         variant: Some("euro")
22///     });
23/// }
24/// ```
25// ------------------------------------------------------------------------------------
26pub fn to_struct(lang_env: &str) -> Result<EnvLang, EnvLangError> {
27
28    // init
29    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        // split by space  `` ``
39        let split: Vec<&str> = lang_env.split(' ').collect();
40        if split.len() > 1 {
41            return Err(EnvLangError::from(EnvLangErrorKind::SpaceNotAllow))
42        }
43
44        // split by point ``.``
45        let split: Vec<&str> = lang_env.split('.').collect();
46        if split.len() > 2 {
47            return Err(EnvLangError::from(EnvLangErrorKind::TooManyPoint))
48        }
49
50        // left and right point
51        let left_point = split[0];
52        let mut right_point = "";
53        if split.len() == 2 {
54            right_point = split[1]
55        }
56
57        // split left_point by underscore ``_``
58        let split: Vec<&str> = left_point.split('_').collect();
59        if split.len() > 2 {
60            return Err(EnvLangError::from(EnvLangErrorKind::TooManyUnderscore))
61        }
62
63        // left and right underscore
64        let left_underscore = split[0];
65        let mut right_underscore = "";
66        if split.len() == 2 {
67            right_underscore = split[1]
68        }
69
70        // language and localisation
71        if left_underscore.len() > 0 { result.language = Some(left_underscore); }
72        if right_underscore.len() > 0 { result.localisation = Some(right_underscore); }
73
74        // with string after point ?
75        if right_point.len() > 0 {
76
77            // split right_point by arobase ``@``
78            let split: Vec<&str> = right_point.split('@').collect();
79            if split.len() > 2 {
80                return Err(EnvLangError::from(EnvLangErrorKind::TooManyArobase))
81            }
82
83            // left and right arobase
84            let left_arobase = split[0];
85            let mut right_arobase = "";
86            if split.len() == 2 {
87                right_arobase = split[1]
88            }
89
90            // charset and variant
91            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}