pub mod async_method;
pub mod callback_bridge;
pub mod streaming;
pub mod sync_function;
use crate::core::config::{AdapterConfig, AdapterPattern, Language, ResolvedCrateConfig};
use ahash::AHashMap;
pub type AdapterBodies = AHashMap<String, String>;
pub fn stream_struct_key(adapter: &AdapterConfig) -> String {
match adapter.owner_type.as_deref() {
Some(owner) => format!("{}.{}.__stream_struct__", owner, adapter.name),
None => format!("{}.__stream_struct__", adapter.name),
}
}
pub fn stream_adapter_body_key(method_name: &str) -> String {
format!("{}.__stream_body__", method_name)
}
pub fn build_adapter_bodies(config: &ResolvedCrateConfig, language: Language) -> anyhow::Result<AdapterBodies> {
let mut bodies = AHashMap::new();
for adapter in &config.adapters {
let key = if let Some(owner) = &adapter.owner_type {
format!("{}.{}", owner, adapter.name)
} else {
adapter.name.clone()
};
match adapter.pattern {
AdapterPattern::SyncFunction => {
let body = sync_function::generate_body(adapter, language, config)?;
bodies.insert(key, body);
}
AdapterPattern::AsyncMethod => {
let body = async_method::generate_body(adapter, language, config)?;
bodies.insert(key, body);
}
AdapterPattern::Streaming => {
let lang_str = language.to_string();
if adapter.skip_languages.iter().any(|l| l == &lang_str) {
continue;
}
let (method_body, struct_def) = streaming::generate_body(adapter, language, config)?;
bodies.insert(key, method_body);
if let Some(struct_code) = struct_def {
bodies.insert(stream_struct_key(adapter), struct_code);
}
}
AdapterPattern::CallbackBridge => {
let (struct_code, impl_code) = callback_bridge::generate(adapter, language, config)?;
let struct_key = format!("{}.__bridge_struct__", adapter.name);
bodies.insert(struct_key, struct_code);
let impl_key = format!("{}.__bridge_impl__", adapter.name);
bodies.insert(impl_key, impl_code);
continue; }
AdapterPattern::ServerLifecycle => {
let body = format!(
"compile_error!(\"adapter pattern not yet implemented: {}\")",
adapter.name
);
bodies.insert(key, body);
}
}
}
Ok(bodies)
}