swift_bridge_ir/
codegen.rs1use crate::bridge_module_attributes::CfgAttr;
2use crate::SwiftBridgeModule;
3
4mod generate_c_header;
5mod generate_rust_tokens;
6mod generate_swift;
7
8#[cfg(test)]
9mod codegen_tests;
10
11pub struct SwiftCodeAndCHeader {
13 pub swift: String,
15 pub c_header: String,
17}
18
19pub struct CodegenConfig {
21 pub crate_feature_lookup: Box<dyn Fn(&str) -> bool>,
25}
26
27#[cfg(test)]
28impl CodegenConfig {
29 pub(crate) fn no_features_enabled() -> Self {
30 CodegenConfig {
31 crate_feature_lookup: Box::new(|_| false),
32 }
33 }
34}
35
36impl SwiftBridgeModule {
37 pub fn generate_swift_code_and_c_header(&self, config: CodegenConfig) -> SwiftCodeAndCHeader {
39 SwiftCodeAndCHeader {
40 swift: self.generate_swift(&config),
41 c_header: self.generate_c_header(&config),
42 }
43 }
44
45 fn module_will_be_compiled(&self, config: &CodegenConfig) -> bool {
49 for cfg_attr in &self.cfg_attrs {
50 match cfg_attr {
51 CfgAttr::Feature(feature_name) => {
52 if !(config.crate_feature_lookup)(&feature_name.value()) {
53 return false;
54 }
55 }
56 }
57 }
58
59 true
60 }
61}