use crate::core::keywords::swift_ident;
pub(crate) fn emit_streaming_adapter_shims(
adapters: &[crate::core::config::AdapterConfig],
source_crate: &str,
) -> String {
use crate::core::config::AdapterPattern;
use heck::{ToPascalCase, ToSnakeCase};
let mut out = String::new();
for adapter in adapters
.iter()
.filter(|a| matches!(a.pattern, AdapterPattern::Streaming))
.filter(|a| a.owner_type.is_some())
{
let owner_type = adapter.owner_type.as_deref().unwrap_or("");
let item_type = adapter
.item_type
.as_deref()
.expect("streaming adapter must declare item_type for Swift backend");
let owner_snake = owner_type.to_snake_case();
let adapter_pascal = adapter.name.to_pascal_case();
let owner_pascal = owner_type.to_pascal_case();
let handle_name = format!("{owner_pascal}{adapter_pascal}StreamHandle");
let fn_start = format!("{owner_snake}_{}_start", adapter.name);
let core_item = format!("{source_crate}::{item_type}");
let mut start_params_vec: Vec<String> = vec![format!("client: &{owner_type}")];
for p in &adapter.params {
let simple_ty = p.ty.rsplit("::").next().unwrap_or(&p.ty);
let param_name = swift_ident(&p.name.to_snake_case());
start_params_vec.push(format!("{param_name}: &{simple_ty}"));
}
let start_params_str = start_params_vec.join(", ");
let call_args: Vec<String> = adapter
.params
.iter()
.map(|p| {
let name = p.name.to_snake_case();
format!("{name}.0.clone()")
})
.collect();
let call_args_str = call_args.join(", ");
let core_call = if adapter.core_path.contains("::") {
format!("{}(&client.0, {call_args_str})", adapter.core_path)
} else {
format!("client.0.{}({call_args_str})", adapter.core_path)
};
out.push_str(&crate::backends::swift::template_env::render(
"rust_stream_handle_struct.rs.jinja",
minijinja::context! {
item_type => &item_type,
fn_start => &fn_start,
handle_name => &handle_name,
core_item => &core_item,
},
));
out.push_str(&crate::backends::swift::template_env::render(
"rust_stream_handle_start.rs.jinja",
minijinja::context! {
owner_type => owner_type,
adapter_name => &adapter.name,
handle_name => &handle_name,
fn_start => &fn_start,
start_params => &start_params_str,
core_call => &core_call,
core_item => &core_item,
},
));
out.push_str(&crate::backends::swift::template_env::render(
"rust_stream_handle_next.rs.jinja",
minijinja::context! {
handle_name => &handle_name,
},
));
}
out
}