Search for base locale if extended locale is not found + remove code duplication

This commit is contained in:
Alessandro Pellizzari 2018-12-09 07:53:30 +00:00
parent 85266ad161
commit 7c8289ef82

View file

@ -3,6 +3,7 @@ extern crate lazy_static;
extern crate chrono; extern crate chrono;
extern crate num_integer; extern crate num_integer;
use std::collections::HashMap;
use std::fmt; use std::fmt;
use chrono::format::{Fixed, Item, Numeric, Pad, StrftimeItems}; use chrono::format::{Fixed, Item, Numeric, Pad, StrftimeItems};
@ -271,47 +272,36 @@ where
Ok(()) Ok(())
} }
fn short_month(month: usize, locale: &str) -> &'static str { fn short_month(key: usize, locale: &str) -> &'static str {
locales::LOCALES find_key(key, &locales::LOCALES.short_months, locale).expect("Internal error: missing short months in the C locale")
.short_months
.get(locale)
.and_then(|res| res.get(month))
.or_else(|| locales::LOCALES.short_months.get("C").and_then(|res| res.get(month)))
.expect("Internal error: missing short months in the C locale")
} }
fn long_month(month: usize, locale: &str) -> &'static str { fn long_month(key: usize, locale: &str) -> &'static str {
locales::LOCALES find_key(key, &locales::LOCALES.long_months, locale).expect("Internal error: missing long months in the C locale")
.long_months
.get(locale)
.and_then(|res| res.get(month))
.or_else(|| locales::LOCALES.long_months.get("C").and_then(|res| res.get(month)))
.expect("Internal error: missing long months in the C locale")
} }
fn short_weekday(day: usize, locale: &str) -> &'static str { fn short_weekday(key: usize, locale: &str) -> &'static str {
locales::LOCALES find_key(key, &locales::LOCALES.short_weekdays, locale).expect("Internal error: missing short weekdays in the C locale")
.short_weekdays
.get(locale)
.and_then(|res| res.get(day))
.or_else(|| locales::LOCALES.short_weekdays.get("C").and_then(|res| res.get(day)))
.expect("Internal error: missing short weekdays in the C locale")
} }
fn long_weekday(day: usize, locale: &str) -> &'static str { fn long_weekday(key: usize, locale: &str) -> &'static str {
locales::LOCALES find_key(key, &locales::LOCALES.long_weekdays, locale).expect("Internal error: missing long weekdays in the C locale")
.long_weekdays
.get(locale)
.and_then(|res| res.get(day))
.or_else(|| locales::LOCALES.long_weekdays.get("C").and_then(|res| res.get(day)))
.expect("Internal error: missing long weekdays in the C locale")
} }
fn ampm(spec: usize, locale: &str) -> &'static str { fn ampm(key: usize, locale: &str) -> &'static str {
locales::LOCALES find_key(key, &locales::LOCALES.ampm, locale).expect("Internal error: missing AM/PM in the C locale")
.ampm }
.get(locale)
.and_then(|res| res.get(spec)) fn find_key(key: usize, data: &'static HashMap<String, Vec<&'static str>>, locale: &str) -> Option<&'static &'static str> {
.or_else(|| locales::LOCALES.ampm.get("C").and_then(|res| res.get(spec))) data.get(locale)
.expect("Internal error: missing AM/PM in the C locale") .and_then(|res| res.get(key))
.or_else(|| {
locale
.split(|c| c == '-' || c == '_')
.collect::<Vec<&str>>()
.get(0)
.cloned()
.and_then(|locale| data.get(locale).and_then(|res| res.get(key)))
})
.or_else(|| data.get("C").and_then(|res| res.get(key)))
} }