Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 80040d2d authored by Zhi Dou's avatar Zhi Dou
Browse files

aconfig: modify_parsed_flags_based_on_mode return Result

This commit changes modify_parsed_flags_based_on_mode to return Result
instead of vector. This change will have two consequences.
1. Error will be thrown if no flags fit into the current codegen mode
2. Error will be thrown if the flag declaration is empty

Bug: 311152507
Test: atest aconfig.test
Change-Id: I69b9a84312faed9f757bf3974b3cea49c5c5e285
parent 8351b782
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -1028,7 +1028,7 @@ bool com_android_aconfig_test_enabled_ro() {
        expected_src: &str,
        expected_src: &str,
    ) {
    ) {
        let modified_parsed_flags =
        let modified_parsed_flags =
            crate::commands::modify_parsed_flags_based_on_mode(parsed_flags, mode);
            crate::commands::modify_parsed_flags_based_on_mode(parsed_flags, mode).unwrap();
        let generated =
        let generated =
            generate_cpp_code(crate::test::TEST_PACKAGE, modified_parsed_flags.into_iter(), mode)
            generate_cpp_code(crate::test::TEST_PACKAGE, modified_parsed_flags.into_iter(), mode)
                .unwrap();
                .unwrap();
+11 −1
Original line number Original line Diff line number Diff line
@@ -55,9 +55,19 @@ pub fn create_device_config_ident(package: &str, flag_name: &str) -> Result<Stri


#[derive(Copy, Clone, Debug, PartialEq, Eq, ValueEnum)]
#[derive(Copy, Clone, Debug, PartialEq, Eq, ValueEnum)]
pub enum CodegenMode {
pub enum CodegenMode {
    Exported,
    Production,
    Production,
    Test,
    Test,
    Exported,
}

impl std::fmt::Display for CodegenMode {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
        match self {
            CodegenMode::Exported => write!(f, "exported"),
            CodegenMode::Production => write!(f, "production"),
            CodegenMode::Test => write!(f, "test"),
        }
    }
}
}


#[cfg(test)]
#[cfg(test)]
+1 −1
Original line number Original line Diff line number Diff line
@@ -557,7 +557,7 @@ pub fn enabled_ro_exported() -> bool {
    fn test_generate_rust_code(mode: CodegenMode) {
    fn test_generate_rust_code(mode: CodegenMode) {
        let parsed_flags = crate::test::parse_test_flags();
        let parsed_flags = crate::test::parse_test_flags();
        let modified_parsed_flags =
        let modified_parsed_flags =
            crate::commands::modify_parsed_flags_based_on_mode(parsed_flags, mode);
            crate::commands::modify_parsed_flags_based_on_mode(parsed_flags, mode).unwrap();
        let generated =
        let generated =
            generate_rust_code(crate::test::TEST_PACKAGE, modified_parsed_flags.into_iter(), mode)
            generate_rust_code(crate::test::TEST_PACKAGE, modified_parsed_flags.into_iter(), mode)
                .unwrap();
                .unwrap();
+22 −6
Original line number Original line Diff line number Diff line
@@ -200,7 +200,7 @@ pub fn create_java_lib(mut input: Input, codegen_mode: CodegenMode) -> Result<Ve


pub fn create_cpp_lib(mut input: Input, codegen_mode: CodegenMode) -> Result<Vec<OutputFile>> {
pub fn create_cpp_lib(mut input: Input, codegen_mode: CodegenMode) -> Result<Vec<OutputFile>> {
    let parsed_flags = input.try_parse_flags()?;
    let parsed_flags = input.try_parse_flags()?;
    let modified_parsed_flags = modify_parsed_flags_based_on_mode(parsed_flags, codegen_mode);
    let modified_parsed_flags = modify_parsed_flags_based_on_mode(parsed_flags, codegen_mode)?;
    let Some(package) = find_unique_package(&modified_parsed_flags) else {
    let Some(package) = find_unique_package(&modified_parsed_flags) else {
        bail!("no parsed flags, or the parsed flags use different packages");
        bail!("no parsed flags, or the parsed flags use different packages");
    };
    };
@@ -210,7 +210,7 @@ pub fn create_cpp_lib(mut input: Input, codegen_mode: CodegenMode) -> Result<Vec


pub fn create_rust_lib(mut input: Input, codegen_mode: CodegenMode) -> Result<OutputFile> {
pub fn create_rust_lib(mut input: Input, codegen_mode: CodegenMode) -> Result<OutputFile> {
    let parsed_flags = input.try_parse_flags()?;
    let parsed_flags = input.try_parse_flags()?;
    let modified_parsed_flags = modify_parsed_flags_based_on_mode(parsed_flags, codegen_mode);
    let modified_parsed_flags = modify_parsed_flags_based_on_mode(parsed_flags, codegen_mode)?;
    let Some(package) = find_unique_package(&modified_parsed_flags) else {
    let Some(package) = find_unique_package(&modified_parsed_flags) else {
        bail!("no parsed flags, or the parsed flags use different packages");
        bail!("no parsed flags, or the parsed flags use different packages");
    };
    };
@@ -331,7 +331,7 @@ fn filter_parsed_flags(
pub fn modify_parsed_flags_based_on_mode(
pub fn modify_parsed_flags_based_on_mode(
    parsed_flags: ProtoParsedFlags,
    parsed_flags: ProtoParsedFlags,
    codegen_mode: CodegenMode,
    codegen_mode: CodegenMode,
) -> Vec<ProtoParsedFlag> {
) -> Result<Vec<ProtoParsedFlag>> {
    fn exported_mode_flag_modifier(mut parsed_flag: ProtoParsedFlag) -> ProtoParsedFlag {
    fn exported_mode_flag_modifier(mut parsed_flag: ProtoParsedFlag) -> ProtoParsedFlag {
        parsed_flag.set_state(ProtoFlagState::DISABLED);
        parsed_flag.set_state(ProtoFlagState::DISABLED);
        parsed_flag.set_permission(ProtoFlagPermission::READ_WRITE);
        parsed_flag.set_permission(ProtoFlagPermission::READ_WRITE);
@@ -339,7 +339,7 @@ pub fn modify_parsed_flags_based_on_mode(
        parsed_flag
        parsed_flag
    }
    }


    match codegen_mode {
    let modified_parsed_flags: Vec<_> = match codegen_mode {
        CodegenMode::Exported => parsed_flags
        CodegenMode::Exported => parsed_flags
            .parsed_flag
            .parsed_flag
            .into_iter()
            .into_iter()
@@ -349,7 +349,12 @@ pub fn modify_parsed_flags_based_on_mode(
        CodegenMode::Production | CodegenMode::Test => {
        CodegenMode::Production | CodegenMode::Test => {
            parsed_flags.parsed_flag.into_iter().collect()
            parsed_flags.parsed_flag.into_iter().collect()
        }
        }
    };
    if modified_parsed_flags.is_empty() {
        bail!("{} library contains no exported flags.", codegen_mode);
    }
    }

    Ok(modified_parsed_flags)
}
}


#[cfg(test)]
#[cfg(test)]
@@ -652,7 +657,8 @@ mod tests {
    fn test_modify_parsed_flags_based_on_mode_prod() {
    fn test_modify_parsed_flags_based_on_mode_prod() {
        let parsed_flags = crate::test::parse_test_flags();
        let parsed_flags = crate::test::parse_test_flags();
        let p_parsed_flags =
        let p_parsed_flags =
            modify_parsed_flags_based_on_mode(parsed_flags.clone(), CodegenMode::Production);
            modify_parsed_flags_based_on_mode(parsed_flags.clone(), CodegenMode::Production)
                .unwrap();
        assert_eq!(parsed_flags.parsed_flag.len(), p_parsed_flags.len());
        assert_eq!(parsed_flags.parsed_flag.len(), p_parsed_flags.len());
        for (i, item) in p_parsed_flags.iter().enumerate() {
        for (i, item) in p_parsed_flags.iter().enumerate() {
            assert!(parsed_flags.parsed_flag[i].eq(item));
            assert!(parsed_flags.parsed_flag[i].eq(item));
@@ -662,7 +668,8 @@ mod tests {
    #[test]
    #[test]
    fn test_modify_parsed_flags_based_on_mode_exported() {
    fn test_modify_parsed_flags_based_on_mode_exported() {
        let parsed_flags = crate::test::parse_test_flags();
        let parsed_flags = crate::test::parse_test_flags();
        let p_parsed_flags = modify_parsed_flags_based_on_mode(parsed_flags, CodegenMode::Exported);
        let p_parsed_flags =
            modify_parsed_flags_based_on_mode(parsed_flags, CodegenMode::Exported).unwrap();
        assert_eq!(3, p_parsed_flags.len());
        assert_eq!(3, p_parsed_flags.len());
        for flag in p_parsed_flags.iter() {
        for flag in p_parsed_flags.iter() {
            assert_eq!(ProtoFlagState::DISABLED, flag.state());
            assert_eq!(ProtoFlagState::DISABLED, flag.state());
@@ -670,5 +677,14 @@ mod tests {
            assert!(!flag.is_fixed_read_only());
            assert!(!flag.is_fixed_read_only());
            assert!(flag.is_exported());
            assert!(flag.is_exported());
        }
        }

        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::Exported).unwrap_err();
        assert_eq!(
            format!("{} library contains no exported flags.", CodegenMode::Exported),
            format!("{:?}", error)
        );
    }
    }
}
}