diff --git a/tools/aconfig/src/codegen/mod.rs b/tools/aconfig/src/codegen/mod.rs index 476d2b39b1..4af1327303 100644 --- a/tools/aconfig/src/codegen/mod.rs +++ b/tools/aconfig/src/codegen/mod.rs @@ -56,6 +56,7 @@ pub fn create_device_config_ident(package: &str, flag_name: &str) -> Result std::fmt::Result { match self { CodegenMode::Exported => write!(f, "exported"), + CodegenMode::ForceReadOnly => write!(f, "force-read-only"), CodegenMode::Production => write!(f, "production"), CodegenMode::Test => write!(f, "test"), } diff --git a/tools/aconfig/src/codegen/rust.rs b/tools/aconfig/src/codegen/rust.rs index 56cb311754..05c012886d 100644 --- a/tools/aconfig/src/codegen/rust.rs +++ b/tools/aconfig/src/codegen/rust.rs @@ -47,6 +47,7 @@ where CodegenMode::Production => include_str!("../../templates/rust_prod.template"), CodegenMode::Test => include_str!("../../templates/rust_test.template"), CodegenMode::Exported => include_str!("../../templates/rust_exported.template"), + CodegenMode::ForceReadOnly => todo!(), }, )?; let contents = template.render("rust_code_gen", &context)?; @@ -569,6 +570,7 @@ pub fn enabled_ro_exported() -> bool { CodegenMode::Production => PROD_EXPECTED, CodegenMode::Test => TEST_EXPECTED, CodegenMode::Exported => EXPORTED_EXPECTED, + codegen::CodegenMode::ForceReadOnly => todo!(), }, &String::from_utf8(generated.contents).unwrap() ) diff --git a/tools/aconfig/src/commands.rs b/tools/aconfig/src/commands.rs index a121b5ec29..ffd89a321a 100644 --- a/tools/aconfig/src/commands.rs +++ b/tools/aconfig/src/commands.rs @@ -332,6 +332,11 @@ pub fn modify_parsed_flags_based_on_mode( parsed_flag } + fn force_read_only_mode_flag_modifier(mut parsed_flag: ProtoParsedFlag) -> ProtoParsedFlag { + parsed_flag.set_permission(ProtoFlagPermission::READ_ONLY); + parsed_flag + } + let modified_parsed_flags: Vec<_> = match codegen_mode { CodegenMode::Exported => parsed_flags .parsed_flag @@ -339,6 +344,12 @@ pub fn modify_parsed_flags_based_on_mode( .filter(|pf| pf.is_exported()) .map(exported_mode_flag_modifier) .collect(), + CodegenMode::ForceReadOnly => parsed_flags + .parsed_flag + .into_iter() + .filter(|pf| !pf.is_exported()) + .map(force_read_only_mode_flag_modifier) + .collect(), CodegenMode::Production | CodegenMode::Test => { parsed_flags.parsed_flag.into_iter().collect() } @@ -694,4 +705,25 @@ mod tests { ]); assert_eq!(flag_ids, expected_flag_ids); } + + #[test] + fn test_modify_parsed_flags_based_on_mode_force_read_only() { + let parsed_flags = crate::test::parse_test_flags(); + let p_parsed_flags = + modify_parsed_flags_based_on_mode(parsed_flags.clone(), CodegenMode::ForceReadOnly) + .unwrap(); + assert_eq!(6, p_parsed_flags.len()); + for pf in p_parsed_flags { + assert_eq!(ProtoFlagPermission::READ_ONLY, pf.permission()); + } + + let mut parsed_flags = crate::test::parse_test_flags(); + parsed_flags.parsed_flag.retain_mut(|pf| pf.is_exported()); + let error = modify_parsed_flags_based_on_mode(parsed_flags, CodegenMode::ForceReadOnly) + .unwrap_err(); + assert_eq!( + "force-read-only library contains no force-read-only flags", + format!("{:?}", error) + ); + } }