ferroui_base/utilities/
text_info.rs1use super::i_culture_data_provider::find_culture_data;
5use super::CultureInfo;
6use std::rc::Rc;
7
8crate::ferro_thread_local! {
9 static INVARIANT: Rc<TextInfo> = Rc::new(TextInfo::new());
10}
11
12#[derive(Clone, Debug, PartialEq, Eq)]
20pub struct TextInfo {
21 list_separator: String,
22}
23
24impl TextInfo {
25 pub fn new() -> TextInfo {
28 TextInfo { list_separator: ",".to_owned() }
29 }
30
31 pub(crate) fn for_culture(culture: &CultureInfo) -> Rc<TextInfo> {
35 find_culture_data(culture, |provider, name| provider.get_text_info(name)).unwrap_or_else(Self::invariant_info)
36 }
37
38 pub fn invariant_info() -> Rc<TextInfo> {
40 INVARIANT.with(Rc::clone)
41 }
42
43 pub fn current_info() -> Rc<TextInfo> {
45 CultureInfo::current_culture().text_info()
46 }
47
48 pub fn list_separator(&self) -> &str {
50 &self.list_separator
51 }
52
53 pub fn set_list_separator(&mut self, value: impl Into<String>) {
55 self.list_separator = value.into();
56 }
57
58 pub fn with_list_separator(mut self, value: impl Into<String>) -> Self {
60 self.set_list_separator(value);
61 self
62 }
63}
64
65impl Default for TextInfo {
66 fn default() -> Self {
67 Self::new()
68 }
69}
70
71#[cfg(test)]
72mod tests {
73 use super::*;
74
75 #[test]
76 fn invariant_list_separator_is_a_comma() {
77 assert_eq!(",", CultureInfo::invariant_culture().text_info().list_separator());
78 assert_eq!(",", TextInfo::invariant_info().list_separator());
79 }
80
81 #[test]
82 fn culture_without_data_uses_the_invariant_list_separator() {
83 assert_eq!(",", CultureInfo::get_culture_info("pl-PL").text_info().list_separator());
84 }
85
86 #[test]
87 fn list_separator_can_be_changed() {
88 let info = TextInfo::new().with_list_separator(";");
89 assert_eq!(";", info.list_separator());
90 }
91}