Files
IronCalc/generate_locale/src/numbers.rs
2023-11-20 10:46:19 +01:00

66 lines
1.7 KiB
Rust

use std::collections::HashMap;
use std::fs;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::constants::{NumbersProperties, LOCAL_TYPE};
#[derive(Serialize, Deserialize)]
struct CaGCalendarsFormat {
format: HashMap<String, HashMap<String, String>>,
}
#[derive(Serialize, Deserialize)]
struct CaGCalendarsII {
months: CaGCalendarsFormat,
days: CaGCalendarsFormat,
}
#[derive(Serialize, Deserialize)]
struct NumbersJSONId {
identity: Value,
numbers: NumbersProperties,
}
#[derive(Serialize, Deserialize)]
struct NumbersJSON {
main: HashMap<String, NumbersJSONId>,
}
pub fn get_numbers_formatting(
cldr_dir: &str,
locale_id: &str,
) -> Result<NumbersProperties, String> {
let numbers_file = format!(
"{}cldr-json/cldr-numbers-{}/main/{}/numbers.json",
cldr_dir, LOCAL_TYPE, locale_id
);
let contents = fs::read_to_string(numbers_file).or(Err("Failed reading 'numbers.json'"))?;
let numbers_json: &NumbersJSON =
&serde_json::from_str(&contents).or(Err("Failed parsing 'numbers.json' file"))?;
// Grouping is either
// * #,##,##0.### (indian way)
// * #,##0.### (standard)
// * 0.###### (posix)
// anything else is an error
let grouping_str = &numbers_json.main[locale_id]
.numbers
.decimal_formats
.standard;
let _grouping = if grouping_str == "#,##0.###" {
"standard"
} else if grouping_str == "#,##,##0.###" {
"indian"
} else if grouping_str == "0.######" {
"posix"
} else {
let message = format!(
"Unexpected grouping {} in locale {}",
grouping_str, locale_id
);
return Err(message);
};
Ok(numbers_json.main[locale_id].numbers.clone())
}