112a9d9c8Sopenharmony_ciuse bindgen::callbacks::*;
212a9d9c8Sopenharmony_ci
312a9d9c8Sopenharmony_ci#[derive(Debug)]
412a9d9c8Sopenharmony_cipub struct RemovePrefixParseCallback {
512a9d9c8Sopenharmony_ci    pub remove_prefix: Option<String>,
612a9d9c8Sopenharmony_ci}
712a9d9c8Sopenharmony_ci
812a9d9c8Sopenharmony_ciimpl RemovePrefixParseCallback {
912a9d9c8Sopenharmony_ci    pub fn new(prefix: &str) -> Self {
1012a9d9c8Sopenharmony_ci        RemovePrefixParseCallback {
1112a9d9c8Sopenharmony_ci            remove_prefix: Some(prefix.to_string()),
1212a9d9c8Sopenharmony_ci        }
1312a9d9c8Sopenharmony_ci    }
1412a9d9c8Sopenharmony_ci}
1512a9d9c8Sopenharmony_ci
1612a9d9c8Sopenharmony_ciimpl ParseCallbacks for RemovePrefixParseCallback {
1712a9d9c8Sopenharmony_ci    fn generated_name_override(&self, item_info: ItemInfo) -> Option<String> {
1812a9d9c8Sopenharmony_ci        if let Some(prefix) = &self.remove_prefix {
1912a9d9c8Sopenharmony_ci            let (expected_prefix, expected_suffix) = match item_info.kind {
2012a9d9c8Sopenharmony_ci                ItemKind::Function => ("function_", "_name"),
2112a9d9c8Sopenharmony_ci                ItemKind::Var => ("var_", "_name"),
2212a9d9c8Sopenharmony_ci                _ => todo!(),
2312a9d9c8Sopenharmony_ci            };
2412a9d9c8Sopenharmony_ci            if let Some(name) = item_info.name.strip_prefix(prefix) {
2512a9d9c8Sopenharmony_ci                assert!(name.starts_with(expected_prefix));
2612a9d9c8Sopenharmony_ci                assert!(name.ends_with(expected_suffix));
2712a9d9c8Sopenharmony_ci                return Some(name.to_string());
2812a9d9c8Sopenharmony_ci            }
2912a9d9c8Sopenharmony_ci        }
3012a9d9c8Sopenharmony_ci        None
3112a9d9c8Sopenharmony_ci    }
3212a9d9c8Sopenharmony_ci}
3312a9d9c8Sopenharmony_ci
3412a9d9c8Sopenharmony_ci#[derive(Debug)]
3512a9d9c8Sopenharmony_cistruct EnumVariantRename;
3612a9d9c8Sopenharmony_ci
3712a9d9c8Sopenharmony_ciimpl ParseCallbacks for EnumVariantRename {
3812a9d9c8Sopenharmony_ci    fn enum_variant_name(
3912a9d9c8Sopenharmony_ci        &self,
4012a9d9c8Sopenharmony_ci        _enum_name: Option<&str>,
4112a9d9c8Sopenharmony_ci        original_variant_name: &str,
4212a9d9c8Sopenharmony_ci        _variant_value: EnumVariantValue,
4312a9d9c8Sopenharmony_ci    ) -> Option<String> {
4412a9d9c8Sopenharmony_ci        Some(format!("RENAMED_{}", original_variant_name))
4512a9d9c8Sopenharmony_ci    }
4612a9d9c8Sopenharmony_ci}
4712a9d9c8Sopenharmony_ci
4812a9d9c8Sopenharmony_ci#[derive(Debug)]
4912a9d9c8Sopenharmony_cistruct BlocklistedTypeImplementsTrait;
5012a9d9c8Sopenharmony_ci
5112a9d9c8Sopenharmony_ciimpl ParseCallbacks for BlocklistedTypeImplementsTrait {
5212a9d9c8Sopenharmony_ci    fn blocklisted_type_implements_trait(
5312a9d9c8Sopenharmony_ci        &self,
5412a9d9c8Sopenharmony_ci        _name: &str,
5512a9d9c8Sopenharmony_ci        derive_trait: DeriveTrait,
5612a9d9c8Sopenharmony_ci    ) -> Option<ImplementsTrait> {
5712a9d9c8Sopenharmony_ci        if derive_trait == DeriveTrait::Hash {
5812a9d9c8Sopenharmony_ci            Some(ImplementsTrait::No)
5912a9d9c8Sopenharmony_ci        } else {
6012a9d9c8Sopenharmony_ci            Some(ImplementsTrait::Yes)
6112a9d9c8Sopenharmony_ci        }
6212a9d9c8Sopenharmony_ci    }
6312a9d9c8Sopenharmony_ci}
6412a9d9c8Sopenharmony_ci
6512a9d9c8Sopenharmony_cipub fn lookup(cb: &str) -> Box<dyn ParseCallbacks> {
6612a9d9c8Sopenharmony_ci    match cb {
6712a9d9c8Sopenharmony_ci        "enum-variant-rename" => Box::new(EnumVariantRename),
6812a9d9c8Sopenharmony_ci        "blocklisted-type-implements-trait" => {
6912a9d9c8Sopenharmony_ci            Box::new(BlocklistedTypeImplementsTrait)
7012a9d9c8Sopenharmony_ci        }
7112a9d9c8Sopenharmony_ci        call_back => {
7212a9d9c8Sopenharmony_ci            if call_back.starts_with("remove-function-prefix-") {
7312a9d9c8Sopenharmony_ci                let prefix = call_back
7412a9d9c8Sopenharmony_ci                    .split("remove-function-prefix-")
7512a9d9c8Sopenharmony_ci                    .last()
7612a9d9c8Sopenharmony_ci                    .to_owned();
7712a9d9c8Sopenharmony_ci                let lnopc = RemovePrefixParseCallback::new(prefix.unwrap());
7812a9d9c8Sopenharmony_ci                Box::new(lnopc)
7912a9d9c8Sopenharmony_ci            } else {
8012a9d9c8Sopenharmony_ci                panic!("Couldn't find name ParseCallbacks: {}", cb)
8112a9d9c8Sopenharmony_ci            }
8212a9d9c8Sopenharmony_ci        }
8312a9d9c8Sopenharmony_ci    }
8412a9d9c8Sopenharmony_ci}
85