1use crate::instruction::GaiaInstruction;
7use gaia_types::{helpers::CompilationTarget, GaiaError, Result};
8use serde::{Deserialize, Serialize};
9use std::collections::HashMap;
10use gaia_types::helpers::{AbiCompatible, ApiCompatible, Architecture};
11use crate::config::GaiaSettings;
12use crate::program::GaiaProgram;
13
14#[derive(Debug, Clone, Serialize, Deserialize)]
18pub struct AdapterConfig {
19 pub name: String,
21 pub compilation_target: CompilationTarget,
23 pub parameters: HashMap<String, String>,
25 pub enabled: bool,
27}
28
29#[derive(Debug, Clone)]
33pub struct AdapterMetadata {
34 pub name: String,
36 pub version: String,
38 pub compilation_target: CompilationTarget,
40 pub description: String,
42 pub supported_instructions: Vec<String>,
44}
45
46#[derive(Debug)]
48pub struct FunctionMapper {
49 mappings: HashMap<CompilationTarget, HashMap<String, String>>,
51}
52
53impl FunctionMapper {
54 pub fn new() -> Self {
56 let mut mapper = Self { mappings: HashMap::new() };
57
58 mapper.init_il_mappings();
60 mapper.init_jvm_mappings();
61 mapper.init_pe_mappings();
62 mapper.init_wasi_mappings();
63
64 mapper
65 }
66
67 pub fn from_config(config: &GaiaSettings) -> Result<Self> {
69 let mut mapper = Self::new();
70
71 for mapping in &config.function_mappings {
73 for (platform_name, target_name) in &mapping.platform_mappings {
74 for (target, _platform_config) in &config.platforms {
76 if platform_name == &target.build.to_string() {
77 mapper.add_mapping(target, &mapping.common_name, target_name);
78 }
79 }
80 }
81 }
82
83 Ok(mapper)
84 }
85
86 pub fn add_mapping(&mut self, target: &CompilationTarget, source_func: &str, target_func: &str) {
88 self.mappings
89 .entry(target.clone())
90 .or_insert_with(HashMap::new)
91 .insert(source_func.to_string(), target_func.to_string());
92 }
93
94 pub fn map_function(&self, target: &CompilationTarget, function_name: &str) -> Option<&str> {
96 self.mappings.get(target).and_then(|platform_mappings| platform_mappings.get(function_name)).map(|s| s.as_str())
97 }
98
99 fn init_il_mappings(&mut self) {
101 let il_target = CompilationTarget {
102 build: Architecture::CLR,
103 host: AbiCompatible::MicrosoftIntermediateLanguage,
104 target: ApiCompatible::ClrRuntime(4),
105 };
106 self.add_mapping(&il_target, "__builtin_print", "void [mscorlib]System.Console::WriteLine(string)");
107 self.add_mapping(&il_target, "__builtin_println", "void [mscorlib]System.Console::WriteLine(string)");
108 self.add_mapping(&il_target, "__builtin_read", "string [mscorlib]System.Console::ReadLine()");
109 self.add_mapping(&il_target, "malloc", "System.Runtime.InteropServices.Marshal.AllocHGlobal");
110 self.add_mapping(&il_target, "free", "System.Runtime.InteropServices.Marshal.FreeHGlobal");
111 }
112
113 fn init_jvm_mappings(&mut self) {
115 let jvm_target = CompilationTarget {
116 build: Architecture::JVM,
117 host: AbiCompatible::JavaAssembly,
118 target: ApiCompatible::JvmRuntime(8),
119 };
120 self.add_mapping(&jvm_target, "__builtin_print", "java.lang.System.out.println");
121 self.add_mapping(&jvm_target, "__builtin_println", "java.lang.System.out.println");
122 self.add_mapping(&jvm_target, "__builtin_read", "java.util.Scanner.nextLine");
123 self.add_mapping(&jvm_target, "malloc", "java.nio.ByteBuffer.allocateDirect");
124 }
125
126 fn init_pe_mappings(&mut self) {
128 let pe_target =
129 CompilationTarget { build: Architecture::X86_64, host: AbiCompatible::PE, target: ApiCompatible::MicrosoftVisualC };
130 self.add_mapping(&pe_target, "__builtin_print", "printf");
131 self.add_mapping(&pe_target, "__builtin_println", "puts");
132 self.add_mapping(&pe_target, "__builtin_read", "gets_s");
133 self.add_mapping(&pe_target, "malloc", "HeapAlloc");
134 self.add_mapping(&pe_target, "free", "HeapFree");
135 }
136
137 fn init_wasi_mappings(&mut self) {
139 let wasi_target = CompilationTarget {
140 build: Architecture::WASM32,
141 host: AbiCompatible::WebAssemblyTextFormat,
142 target: ApiCompatible::WASI,
143 };
144 self.add_mapping(&wasi_target, "__builtin_print", "wasi_print");
145 self.add_mapping(&wasi_target, "__builtin_println", "wasi_println");
146 self.add_mapping(&wasi_target, "__builtin_read", "wasi_read");
147 self.add_mapping(&wasi_target, "malloc", "malloc");
148 self.add_mapping(&wasi_target, "free", "free");
149 }
150}
151
152impl Default for FunctionMapper {
153 fn default() -> Self {
154 Self::new()
155 }
156}
157
158
159pub trait ExportAdapter: Send + Sync {
163 fn metadata(&self) -> &AdapterMetadata;
165
166 fn configure(&mut self, config: AdapterConfig) -> Result<()>;
174
175 fn export_instruction(&self, instruction: &GaiaInstruction) -> Result<Vec<u8>>;
183
184 fn export_program(&self, program: &GaiaProgram) -> Result<Vec<u8>>;
192
193 fn supports_instruction(&self, instruction: &GaiaInstruction) -> bool;
201
202 fn file_extension(&self) -> &str;
207
208 fn cleanup(&mut self) -> Result<()> {
212 Ok(())
213 }
214}
215
216pub trait ImportAdapter: Send + Sync {
220 fn metadata(&self) -> &AdapterMetadata;
222
223 fn configure(&mut self, config: AdapterConfig) -> Result<()>;
231
232 fn import_instruction(&self, data: &[u8]) -> Result<GaiaInstruction>;
240
241 fn import_program(&self, data: &[u8]) -> Result<GaiaProgram>;
249
250 fn validate_format(&self, data: &[u8]) -> bool;
258
259 fn supported_extensions(&self) -> Vec<&str>;
264
265 fn cleanup(&mut self) -> Result<()> {
269 Ok(())
270 }
271}
272
273pub struct AdapterManager {
275 export_adapters: HashMap<CompilationTarget, Box<dyn ExportAdapter>>,
277 import_adapters: HashMap<CompilationTarget, Box<dyn ImportAdapter>>,
279}
280
281impl AdapterManager {
282 pub fn new() -> Self {
284 Self { export_adapters: HashMap::new(), import_adapters: HashMap::new() }
285 }
286
287 pub fn register_export_adapter(&mut self, target: CompilationTarget, adapter: Box<dyn ExportAdapter>) -> Result<()> {
296 if self.export_adapters.contains_key(&target) {
297 return Err(GaiaError::adapter_error(&format!("{:?}", target), "导出适配器已存在", None));
298 }
299 self.export_adapters.insert(target, adapter);
300 Ok(())
301 }
302
303 pub fn register_import_adapter(&mut self, target: CompilationTarget, adapter: Box<dyn ImportAdapter>) -> Result<()> {
312 if self.import_adapters.contains_key(&target) {
313 return Err(GaiaError::adapter_error(&format!("{:?}", target), "导入适配器已存在", None));
314 }
315 self.import_adapters.insert(target, adapter);
316 Ok(())
317 }
318
319 pub fn get_export_adapter(&self, target: &CompilationTarget) -> Result<&dyn ExportAdapter> {
327 self.export_adapters
328 .get(target)
329 .map(|adapter| adapter.as_ref())
330 .ok_or_else(|| GaiaError::adapter_error(&format!("{:?}", target), "导出适配器未找到", None))
331 }
332
333 pub fn get_export_adapter_mut(&mut self, target: &CompilationTarget) -> Result<&mut (dyn ExportAdapter + '_)> {
341 match self.export_adapters.get_mut(target) {
342 Some(adapter) => Ok(adapter.as_mut()),
343 None => Err(GaiaError::adapter_error(&format!("{:?}", target), "导出适配器未找到", None)),
344 }
345 }
346
347 pub fn get_import_adapter(&self, target: &CompilationTarget) -> Result<&dyn ImportAdapter> {
355 self.import_adapters
356 .get(target)
357 .map(|adapter| adapter.as_ref())
358 .ok_or_else(|| GaiaError::adapter_error(&format!("{:?}", target), "导入适配器未找到", None))
359 }
360
361 pub fn get_import_adapter_mut(&mut self, target: &CompilationTarget) -> Result<&mut (dyn ImportAdapter + '_)> {
369 match self.import_adapters.get_mut(target) {
370 Some(adapter) => Ok(adapter.as_mut()),
371 None => Err(GaiaError::adapter_error(&format!("{:?}", target), "导入适配器未找到", None)),
372 }
373 }
374
375 pub fn list_supported_targets(&self) -> Vec<CompilationTarget> {
380 let mut targets = Vec::new();
381 targets.extend(self.export_adapters.keys().cloned());
382 targets.extend(self.import_adapters.keys().cloned());
383 targets.sort_by_key(|t| format!("{:?}", t));
384 targets.dedup();
385 targets
386 }
387
388 pub fn cleanup_all(&mut self) -> Result<()> {
393 for (target, adapter) in &mut self.export_adapters {
394 if let Err(e) = adapter.cleanup() {
395 return Err(GaiaError::adapter_error(&format!("{:?}", target), "清理导出适配器失败", Some(Box::new(e))));
396 }
397 }
398
399 for (target, adapter) in &mut self.import_adapters {
400 if let Err(e) = adapter.cleanup() {
401 return Err(GaiaError::adapter_error(&format!("{:?}", target), "清理导入适配器失败", Some(Box::new(e))));
402 }
403 }
404
405 Ok(())
406 }
407}
408
409impl Default for AdapterManager {
410 fn default() -> Self {
411 Self::new()
412 }
413}