Skip to content

Commit 8fa1437

Browse files
committed
Generate tzif baked data
1 parent 2f115fe commit 8fa1437

File tree

346 files changed

+61681
-13
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

346 files changed

+61681
-13
lines changed

bakeddata/src/main.rs

Lines changed: 49 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
use databake::{quote, Bake};
22
use std::{
3+
collections::{BTreeMap, BTreeSet, HashMap},
34
fs::{self, File},
5+
hash::{DefaultHasher, Hash, Hasher},
46
io::{self, BufWriter, Write},
57
path::Path,
68
};
7-
use temporal_provider::{tzif::ZoneInfoProvider, IanaIdentifierNormalizer};
9+
use temporal_provider::{
10+
tzif::{ZeroTzifULE, ZoneInfoProvider},
11+
IanaIdentifierNormalizer,
12+
};
813

914
trait BakedDataProvider {
1015
fn write_data(&self, data_path: &Path) -> io::Result<()>;
@@ -20,7 +25,7 @@ impl BakedDataProvider for ZoneInfoProvider<'_> {
2025

2126
let baked_macro = quote! {
2227
#[macro_export]
23-
macro_rules! zone_info_provider {
28+
macro_rules! zone_info_provider_baked {
2429
() => {
2530
pub const ZONE_INFO_PROVIDER: &'static temporal_provider::ZoneInfoProvider = &#baked;
2631
}
@@ -41,26 +46,57 @@ impl BakedDataProvider for ZoneInfoProvider<'_> {
4146
// Recreate directory.
4247
fs::create_dir_all(zoneinfo_debug_path.clone())?;
4348

49+
let map_file = zoneinfo_debug_path.join("map.json");
50+
51+
// Create id sets for the tzifs
52+
let mut tzif_ids: HashMap<usize, BTreeSet<String>> = HashMap::new();
4453
for (identifier, index) in self.ids.to_btreemap().iter() {
45-
let (directory, filename) = if identifier.contains('/') {
46-
let (directory, filename) = identifier.rsplit_once('/').expect("'/' must exist");
47-
let identifier_dir = zoneinfo_debug_path.join(directory);
48-
fs::create_dir_all(identifier_dir.clone())?;
49-
(identifier_dir, filename)
54+
if let Some(id_set) = tzif_ids.get_mut(index) {
55+
id_set.insert(identifier.clone());
5056
} else {
51-
(zoneinfo_debug_path.clone(), identifier.as_str())
52-
};
53-
let mut filepath = directory.join(filename);
54-
filepath.set_extension("json");
55-
let json = serde_json::to_string_pretty(&self.tzifs[*index])?;
56-
fs::write(filepath, json)?;
57+
tzif_ids.insert(*index, BTreeSet::from([identifier.clone()]));
58+
}
59+
}
60+
61+
let tzif_dir_path = zoneinfo_debug_path.join("tzifs");
62+
fs::create_dir_all(tzif_dir_path.clone())?;
63+
64+
let mut id_map: BTreeMap<String, String> = BTreeMap::new();
65+
for (id, tzif) in self.tzifs.iter().enumerate() {
66+
let mut tzif_data = serde_json::Map::new();
67+
let id_set = tzif_ids.get(&id).unwrap();
68+
tzif_data.insert("ids".into(), serde_json::to_value(id_set)?);
69+
tzif_data.insert("tzif".into(), serde_json::to_value(&tzif)?);
70+
let filename = format!("tzif-{}-{}.json", hash_ids(id_set), hash_tzif(&tzif));
71+
let filepath = tzif_dir_path.join(filename.clone());
72+
for id in id_set {
73+
id_map.insert(id.clone(), filename.clone());
74+
}
75+
fs::write(filepath, serde_json::to_string_pretty(&tzif_data)?)?;
5776
}
5877

78+
fs::write(
79+
map_file,
80+
format!("{}\n", serde_json::to_string_pretty(&id_map)?),
81+
)?;
82+
5983
// TODO: Add version
6084
Ok(())
6185
}
6286
}
6387

88+
fn hash_ids(set: &BTreeSet<String>) -> String {
89+
let mut hasher = DefaultHasher::new();
90+
set.hash(&mut hasher);
91+
format!("{:x}", hasher.finish())
92+
}
93+
94+
fn hash_tzif(tzif: &ZeroTzifULE) -> String {
95+
let mut hasher = DefaultHasher::new();
96+
tzif.transitions().as_bytes().hash(&mut hasher);
97+
format!("{:x}", hasher.finish())
98+
}
99+
64100
impl BakedDataProvider for IanaIdentifierNormalizer<'_> {
65101
fn write_data(&self, data_path: &Path) -> io::Result<()> {
66102
fs::create_dir_all(data_path)?;

provider/src/data/debug/zoneinfo/map.json

Lines changed: 599 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
{
2+
"ids": [
3+
"america/cayenne"
4+
],
5+
"tzif": {
6+
"posix": "TODO",
7+
"transition_types": [
8+
1,
9+
2
10+
],
11+
"transitions": [
12+
-1846269040,
13+
-71092800
14+
],
15+
"types": [
16+
{
17+
"is_dst": false,
18+
"offset": -12560
19+
},
20+
{
21+
"is_dst": false,
22+
"offset": -14400
23+
},
24+
{
25+
"is_dst": false,
26+
"offset": -10800
27+
}
28+
]
29+
}
30+
}

0 commit comments

Comments
 (0)