use crate::ffi::utils::*;
use crate::ffi::*;
use crate::settings::locale::Category;
use crate::{Locale, LocaleResult};
#[derive(Debug, Clone, PartialEq)]
pub struct Name {
name: Option<String>,
abbreviated: Option<String>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct CalendarNames {
week_day_names: Vec<Name>,
month_names: Vec<Name>,
am_string: Option<String>,
pm_string: Option<String>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct DateTimeFormat {
date_time_format: Option<String>,
date_format: Option<String>,
time_format: Option<String>,
time_ampm_format: Option<String>,
era: Option<String>,
era_date_time_format: Option<String>,
era_date_format: Option<String>,
era_time_format: Option<String>,
alternate_digit_symbol: Option<String>,
}
pub fn get_calendar_names() -> CalendarNames {
CalendarNames {
week_day_names: make_name_vector(7, DAY_1, ABDAY_1),
month_names: make_name_vector(12, MON_1, ABMON_1),
am_string: get_nl_string(AM_STR),
pm_string: get_nl_string(PM_STR),
}
}
pub fn get_calendar_names_for_locale(
locale: Locale,
inherit_current: bool,
) -> LocaleResult<CalendarNames> {
get_format_for_locale(Category::Time, locale, &get_calendar_names, inherit_current)
}
pub fn get_date_time_format() -> DateTimeFormat {
DateTimeFormat {
date_time_format: get_nl_string(D_T_FMT),
date_format: get_nl_string(D_FMT),
time_format: get_nl_string(T_FMT),
time_ampm_format: get_nl_string(T_FMT_AMPM),
era: get_nl_string(ERA),
era_date_time_format: get_nl_string(ERA_D_T_FMT),
era_date_format: get_nl_string(ERA_D_FMT),
era_time_format: get_nl_string(ERA_T_FMT),
alternate_digit_symbol: get_nl_string(ALT_DIGITS),
}
}
pub fn get_date_time_format_for_locale(
locale: Locale,
inherit_current: bool,
) -> LocaleResult<DateTimeFormat> {
get_format_for_locale(
Category::Time,
locale,
&get_date_time_format,
inherit_current,
)
}
fn make_name_vector(count: u32, n_st: u32, ab_st: u32) -> Vec<Name> {
(0..count)
.map(|offset| Name {
name: get_nl_string(n_st + offset),
abbreviated: get_nl_string(ab_st + offset),
})
.collect()
}
#[cfg(test)]
mod tests {
use super::{get_calendar_names, get_date_time_format};
use crate::settings::locale::{set_locale, Category};
use crate::settings::time::Name;
use crate::Locale;
#[test]
fn test_week_day_names() {
if set_locale(&Locale::POSIX, &Category::Time) {
let names = get_calendar_names();
assert_eq!(names.week_day_names.len(), 7);
let sunday = names.week_day_names.get(0).unwrap();
assert_eq!(
sunday,
&Name {
name: Some("Sunday".to_string()),
abbreviated: Some("Sun".to_string())
}
);
} else {
panic!("set_locale returned false");
}
}
#[test]
fn test_month_names() {
if set_locale(&Locale::POSIX, &Category::Time) {
let names = get_calendar_names();
assert_eq!(names.month_names.len(), 12);
let january = names.month_names.get(0).unwrap();
assert_eq!(
january,
&Name {
name: Some("January".to_string()),
abbreviated: Some("Jan".to_string())
}
);
} else {
panic!("set_locale returned false");
}
}
#[test]
fn test_ampm_names() {
if set_locale(&Locale::POSIX, &Category::Time) {
let names = get_calendar_names();
assert_eq!(names.am_string, Some("AM".to_string()));
assert_eq!(names.pm_string, Some("PM".to_string()));
} else {
panic!("set_locale returned false");
}
}
#[test]
fn test_date_time_formats() {
if set_locale(&Locale::POSIX, &Category::Time) {
let formats = get_date_time_format();
println!("{:#?}", formats);
assert_eq!(formats.date_format, Some("%m/%d/%y".to_string()));
assert_eq!(formats.era, None);
} else {
panic!("set_locale returned false");
}
}
}