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

Commit 68570f67 authored by Dennis Shen's avatar Dennis Shen Committed by Gerrit Code Review
Browse files

Merge "aconfig: add assign_flag_ids function" into main

parents a7932967 ba72cc7a
Loading
Loading
Loading
Loading
+39 −0
Original line number Diff line number Diff line
@@ -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<Ve
        bail!("no parsed flags, or the parsed flags use different packages");
    };
    let package = package.to_string();
    let _flag_ids = assign_flag_ids(&package, modified_parsed_flags.iter())?;
    generate_java_code(&package, modified_parsed_flags.into_iter(), codegen_mode)
}

@@ -205,6 +208,7 @@ pub fn create_cpp_lib(mut input: Input, codegen_mode: CodegenMode) -> Result<Vec
        bail!("no parsed flags, or the parsed flags use different packages");
    };
    let package = package.to_string();
    let _flag_ids = assign_flag_ids(&package, modified_parsed_flags.iter())?;
    generate_cpp_code(&package, modified_parsed_flags.into_iter(), codegen_mode)
}

@@ -215,6 +219,7 @@ pub fn create_rust_lib(mut input: Input, codegen_mode: CodegenMode) -> Result<Ou
        bail!("no parsed flags, or the parsed flags use different packages");
    };
    let package = package.to_string();
    let _flag_ids = assign_flag_ids(&package, modified_parsed_flags.iter())?;
    generate_rust_code(&package, modified_parsed_flags.into_iter(), codegen_mode)
}

@@ -345,6 +350,21 @@ pub fn modify_parsed_flags_based_on_mode(
    Ok(modified_parsed_flags)
}

fn assign_flag_ids<'a, I>(package: &str, parsed_flags_iter: I) -> Result<HashMap<String, u32>>
where
    I: Iterator<Item = &'a ProtoParsedFlag> + 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);
    }
}