• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use bindgen::callbacks::*;
2 
3 #[derive(Debug)]
4 pub struct RemovePrefixParseCallback {
5     pub remove_prefix: Option<String>,
6 }
7 
8 impl RemovePrefixParseCallback {
new(prefix: &str) -> Self9     pub fn new(prefix: &str) -> Self {
10         RemovePrefixParseCallback {
11             remove_prefix: Some(prefix.to_string()),
12         }
13     }
14 }
15 
16 impl ParseCallbacks for RemovePrefixParseCallback {
generated_name_override(&self, item_info: ItemInfo) -> Option<String>17     fn generated_name_override(&self, item_info: ItemInfo) -> Option<String> {
18         if let Some(prefix) = &self.remove_prefix {
19             let (expected_prefix, expected_suffix) = match item_info.kind {
20                 ItemKind::Function => ("function_", "_name"),
21                 ItemKind::Var => ("var_", "_name"),
22                 _ => todo!(),
23             };
24             if let Some(name) = item_info.name.strip_prefix(prefix) {
25                 assert!(name.starts_with(expected_prefix));
26                 assert!(name.ends_with(expected_suffix));
27                 return Some(name.to_string());
28             }
29         }
30         None
31     }
32 }
33 
34 #[derive(Debug)]
35 struct EnumVariantRename;
36 
37 impl ParseCallbacks for EnumVariantRename {
enum_variant_name( &self, _enum_name: Option<&str>, original_variant_name: &str, _variant_value: EnumVariantValue, ) -> Option<String>38     fn enum_variant_name(
39         &self,
40         _enum_name: Option<&str>,
41         original_variant_name: &str,
42         _variant_value: EnumVariantValue,
43     ) -> Option<String> {
44         Some(format!("RENAMED_{}", original_variant_name))
45     }
46 }
47 
48 #[derive(Debug)]
49 struct BlocklistedTypeImplementsTrait;
50 
51 impl ParseCallbacks for BlocklistedTypeImplementsTrait {
blocklisted_type_implements_trait( &self, _name: &str, derive_trait: DeriveTrait, ) -> Option<ImplementsTrait>52     fn blocklisted_type_implements_trait(
53         &self,
54         _name: &str,
55         derive_trait: DeriveTrait,
56     ) -> Option<ImplementsTrait> {
57         if derive_trait == DeriveTrait::Hash {
58             Some(ImplementsTrait::No)
59         } else {
60             Some(ImplementsTrait::Yes)
61         }
62     }
63 }
64 
lookup(cb: &str) -> Box<dyn ParseCallbacks>65 pub fn lookup(cb: &str) -> Box<dyn ParseCallbacks> {
66     match cb {
67         "enum-variant-rename" => Box::new(EnumVariantRename),
68         "blocklisted-type-implements-trait" => {
69             Box::new(BlocklistedTypeImplementsTrait)
70         }
71         call_back => {
72             if call_back.starts_with("remove-function-prefix-") {
73                 let prefix = call_back
74                     .split("remove-function-prefix-")
75                     .last()
76                     .to_owned();
77                 let lnopc = RemovePrefixParseCallback::new(prefix.unwrap());
78                 Box::new(lnopc)
79             } else {
80                 panic!("Couldn't find name ParseCallbacks: {}", cb)
81             }
82         }
83     }
84 }
85