diff --git a/tools/aconfig/src/commands.rs b/tools/aconfig/src/commands.rs index 261acec733..a121b5ec29 100644 --- a/tools/aconfig/src/commands.rs +++ b/tools/aconfig/src/commands.rs @@ -15,7 +15,9 @@ */ use anyhow::{bail, ensure, Context, Result}; +use itertools::Itertools; use protobuf::Message; +use std::collections::HashMap; use std::io::Read; use std::path::PathBuf; @@ -195,6 +197,7 @@ pub fn create_java_lib(mut input: Input, codegen_mode: CodegenMode) -> Result Result Result(package: &str, parsed_flags_iter: I) -> Result> +where + I: Iterator + Clone, +{ + assert!(parsed_flags_iter.clone().tuple_windows().all(|(a, b)| a.name() <= b.name())); + let mut flag_ids = HashMap::new(); + for (id_to_assign, pf) in (0_u32..).zip(parsed_flags_iter) { + if package != pf.package() { + return Err(anyhow::anyhow!("encountered a flag not in current package")); + } + flag_ids.insert(pf.name().to_string(), id_to_assign); + } + Ok(flag_ids) +} + #[cfg(test)] mod tests { use super::*; @@ -655,4 +675,23 @@ mod tests { modify_parsed_flags_based_on_mode(parsed_flags, CodegenMode::Exported).unwrap_err(); assert_eq!("exported library contains no exported flags", format!("{:?}", error)); } + + #[test] + fn test_assign_flag_ids() { + let parsed_flags = crate::test::parse_test_flags(); + let package = find_unique_package(&parsed_flags.parsed_flag).unwrap().to_string(); + let flag_ids = assign_flag_ids(&package, parsed_flags.parsed_flag.iter()).unwrap(); + let expected_flag_ids = HashMap::from([ + (String::from("disabled_ro"), 0_u32), + (String::from("disabled_rw"), 1_u32), + (String::from("disabled_rw_exported"), 2_u32), + (String::from("disabled_rw_in_other_namespace"), 3_u32), + (String::from("enabled_fixed_ro"), 4_u32), + (String::from("enabled_fixed_ro_exported"), 5_u32), + (String::from("enabled_ro"), 6_u32), + (String::from("enabled_ro_exported"), 7_u32), + (String::from("enabled_rw"), 8_u32), + ]); + assert_eq!(flag_ids, expected_flag_ids); + } }