wasmer_engine_object_file/
builder.rs1use crate::ObjectFileEngine;
2use wasmer_compiler::{CompilerConfig, Features, Target};
3
4pub struct ObjectFile {
6 compiler_config: Option<Box<dyn CompilerConfig>>,
7 target: Option<Target>,
8 features: Option<Features>,
9}
10
11impl ObjectFile {
12 #[cfg(feature = "compiler")]
13 pub fn new<T>(compiler_config: T) -> Self
15 where
16 T: Into<Box<dyn CompilerConfig>>,
17 {
18 let mut compiler_config = compiler_config.into();
19 compiler_config.enable_pic();
20
21 Self {
22 compiler_config: Some(compiler_config),
23 target: None,
24 features: None,
25 }
26 }
27
28 pub fn headless() -> Self {
30 Self {
31 compiler_config: None,
32 target: None,
33 features: None,
34 }
35 }
36
37 pub fn target(mut self, target: Target) -> Self {
39 self.target = Some(target);
40 self
41 }
42
43 pub fn features(mut self, features: Features) -> Self {
45 self.features = Some(features);
46 self
47 }
48
49 pub fn engine(self) -> ObjectFileEngine {
51 if let Some(_compiler_config) = self.compiler_config {
52 #[cfg(feature = "compiler")]
53 {
54 let compiler_config = _compiler_config;
55 let target = self.target.unwrap_or_default();
56 let features = self
57 .features
58 .unwrap_or_else(|| compiler_config.default_features_for_target(&target));
59 let compiler = compiler_config.compiler();
60 ObjectFileEngine::new(compiler, target, features)
61 }
62
63 #[cfg(not(feature = "compiler"))]
64 {
65 unreachable!("Cannot call `ObjectFileEngine::new` without the `compiler` feature")
66 }
67 } else {
68 ObjectFileEngine::headless()
69 }
70 }
71}
72
73#[cfg(test)]
74mod tests {
75 use super::*;
76 #[cfg(feature = "compiler")]
77 use std::sync::Arc;
78 #[cfg(feature = "compiler")]
79 use wasmer_compiler::{Compiler, FunctionMiddlewareGenerator};
80
81 #[cfg(feature = "compiler")]
82 #[derive(Default)]
83 pub struct TestCompilerConfig {
84 pub enabled_pic: bool,
85 pub middlewares: Vec<Arc<dyn FunctionMiddlewareGenerator>>,
86 }
87
88 #[cfg(feature = "compiler")]
89 impl CompilerConfig for TestCompilerConfig {
90 fn enable_pic(&mut self) {
91 self.enabled_pic = true;
92 }
93
94 fn compiler(&self) -> Box<dyn Compiler> {
95 unimplemented!("compiler not implemented");
96 }
97
98 fn push_middleware(&mut self, middleware: Arc<dyn FunctionMiddlewareGenerator>) {
99 self.middlewares.push(middleware);
100 }
101 }
102
103 #[cfg(feature = "compiler")]
104 #[test]
105 #[should_panic(expected = "compiler not implemented")]
106 fn build_engine() {
107 let mut compiler_config = TestCompilerConfig::default();
108 let object_file = ObjectFile::new(&mut compiler_config);
109 let _engine = object_file.engine();
110 }
111
112 #[test]
113 fn build_headless_engine() {
114 let object_file = ObjectFile::headless();
115 let _engine = object_file.engine();
116 }
117}