use crate::backends::dart::template_env;
use crate::backends::ffi::type_map::result_presence_companion_exists;
use crate::codegen::c_consumer::result_presence_symbol;
use crate::core::ir::TypeRef;
const PRESENT: &str = "1";
const PRESENCE_NATIVE_RETURN: &str = "Int32";
const PRESENCE_DART_RETURN: &str = "int";
const HAS_RESULT_SUFFIX: &str = "HasResult";
pub(super) struct PrimarySignature<'a> {
pub fn_name: &'a str,
pub c_symbol: &'a str,
pub native_params: &'a str,
pub dart_params: &'a str,
}
pub(super) fn emit_presence_lookup(
return_type: &TypeRef,
primary: &PrimarySignature<'_>,
out: &mut String,
) -> Option<String> {
if !result_presence_companion_exists(return_type, None) {
return None;
}
let fn_name = format!("{}{HAS_RESULT_SUFFIX}", primary.fn_name);
let typedef_native = format!("_{fn_name}Native");
let typedef_dart = format!("_{fn_name}Dart");
out.push_str(&template_env::render(
"ffi_typedef_native_sig.jinja",
minijinja::context! {
typedef_native => typedef_native.as_str(),
native_return => PRESENCE_NATIVE_RETURN,
native_params => primary.native_params,
},
));
out.push_str(&template_env::render(
"ffi_typedef_dart_sig.jinja",
minijinja::context! {
typedef_dart => typedef_dart.as_str(),
dart_return => PRESENCE_DART_RETURN,
dart_params => primary.dart_params,
},
));
out.push_str(&template_env::render(
"ffi_function_lookup_sig.jinja",
minijinja::context! {
dart_return => PRESENCE_DART_RETURN,
dart_params => primary.dart_params,
fn_name => fn_name.as_str(),
typedef_native => typedef_native.as_str(),
typedef_dart => typedef_dart.as_str(),
c_symbol => result_presence_symbol(primary.c_symbol),
},
));
Some(fn_name)
}
pub(super) fn presence_gate(fn_name: &str, call_args: &str, cleanup: &str, checks_error: bool) -> String {
template_env::render(
"ffi_result_presence_gate.jinja",
minijinja::context! {
fn_name,
call_args,
present => PRESENT,
cleanup,
checks_error,
},
)
}
pub(super) fn indent_fragment(fragment: &str, extra: &str) -> String {
fragment
.lines()
.map(|line| format!("{extra}{line}\n"))
.collect::<String>()
}