From 2c1c5eaaa7b698ea1d7ba6331b5c5da6c685b0c6 Mon Sep 17 00:00:00 2001 From: Robert Bastian Date: Wed, 27 Apr 2022 13:29:19 +0200 Subject: [PATCH] key convenience fns --- provider/datagen/src/bin/datagen.rs | 38 ++++++--------------- provider/datagen/src/lib.rs | 53 +++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 27 deletions(-) diff --git a/provider/datagen/src/bin/datagen.rs b/provider/datagen/src/bin/datagen.rs index 1db9e56fc59..de1c6757d9a 100644 --- a/provider/datagen/src/bin/datagen.rs +++ b/provider/datagen/src/bin/datagen.rs @@ -10,11 +10,7 @@ use icu_locid::LanguageIdentifier; use icu_provider::hello_world::HelloWorldV1Marker; use icu_provider::prelude::*; use simple_logger::SimpleLogger; -use std::borrow::Cow; -use std::collections::HashSet; use std::fs::File; -use std::io; -use std::io::BufRead; use std::path::PathBuf; use std::str::FromStr; @@ -254,32 +250,20 @@ fn main() -> eyre::Result<()> { all_keys } else if matches.is_present("HELLO_WORLD") { vec![HelloWorldV1Marker::KEY] + } else if let Some(paths) = matches.values_of("KEYS") { + icu_datagen::keys(&paths.collect::>()) + } else if let Some(key_file_path) = matches.value_of_os("KEY_FILE") { + File::open(key_file_path) + .and_then(icu_datagen::keys_from_file) + .with_context(|| key_file_path.to_string_lossy().into_owned())? } else { - let mut keys = HashSet::new(); - - if let Some(paths) = matches.values_of("KEYS") { - keys.extend(paths.map(Cow::Borrowed)); - } else if let Some(key_file_path) = matches.value_of_os("KEY_FILE") { - let file = File::open(key_file_path) - .with_context(|| key_file_path.to_string_lossy().into_owned())?; - for line in io::BufReader::new(file).lines() { - let path = line.with_context(|| key_file_path.to_string_lossy().into_owned())?; - keys.insert(Cow::Owned(path)); - } - } - - let filtered: Vec<_> = all_keys - .into_iter() - .filter(|k| keys.contains(k.get_path())) - .collect(); - - if filtered.is_empty() { - eyre::bail!("No keys selected"); - } - - filtered + unreachable!(); }; + if selected_keys.is_empty() { + eyre::bail!("No keys selected"); + } + let mut source_data = SourceData::default(); if matches.is_present("INPUT_FROM_TESTDATA") { diff --git a/provider/datagen/src/lib.rs b/provider/datagen/src/lib.rs index 563091dc46a..cfdea2462e7 100644 --- a/provider/datagen/src/lib.rs +++ b/provider/datagen/src/lib.rs @@ -61,8 +61,61 @@ use icu_provider::serde::SerializeMarker; use icu_provider_adapters::filter::Filterable; use icu_provider_fs::export::serializers; use rayon::prelude::*; +use std::collections::HashSet; +use std::io::{Read, BufRead, BufReader}; use std::path::PathBuf; +/// Parses a list of human-readable key identifiers and returns a +/// list of [`ResourceKey`]s. Invalid key names are ignored. +/// +/// # Example +/// ``` +/// # use icu_provider::ResourceMarker; +/// assert_eq!( +/// icu_datagen::keys(&["list/and@1", "list/or@1"]), +/// vec![ +/// icu_list::provider::AndListV1Marker::KEY, +/// icu_list::provider::OrListV1Marker::KEY, +/// ], +/// ); +/// ``` +pub fn keys>(strings: &[S]) -> Vec { + let keys = strings.iter().map(AsRef::as_ref).collect::>(); + get_all_keys() + .into_iter() + .filter(|k| keys.contains(k.get_path())) + .collect() +} + +/// Parses a file of human-readable key identifiers and returns a +/// list of [`ResourceKey`]s. Invalid key names are ignored. +/// +/// # Example +/// +/// #### keys.txt +/// ```text +/// list/and@1 +/// list/or@1 +/// ``` +/// #### build.rs +/// ```no_run +/// # use icu_provider::ResourceMarker; +/// # use std::fs::File; +/// # fn main() -> std::io::Result<()> { +/// assert_eq!( +/// icu_datagen::keys_from_file(File::open("keys.txt")?)?, +/// vec![ +/// icu_list::provider::AndListV1Marker::KEY, +/// icu_list::provider::OrListV1Marker::KEY, +/// ], +/// ); +/// # Ok(()) +/// # } +/// ``` +pub fn keys_from_file(file: R) -> std::io::Result> { + Ok(keys(&BufReader::new(file).lines().collect::>>()?)) +} + /// The output format. #[non_exhaustive] pub enum Out {