use crate::core::config::TraitBridgeConfig;
use heck::ToLowerCamelCase;
pub(super) fn emit_trait_bridge_methods(bridge_cfg: &TraitBridgeConfig, out: &mut String) {
let trait_name = &bridge_cfg.trait_name;
let impl_type = format!("{trait_name}DartImpl");
if let Some(register_fn) = bridge_cfg.register_fn.as_deref() {
let dart_name = register_fn.to_lower_camel_case();
out.push_str(&crate::backends::dart::template_env::render(
"dart_trait_register_method.jinja",
minijinja::context! {
trait_name => trait_name.as_str(),
dart_name => dart_name.as_str(),
impl_type => impl_type.as_str(),
},
));
}
if let Some(unregister_fn) = bridge_cfg.unregister_fn.as_deref() {
let dart_name = unregister_fn.to_lower_camel_case();
out.push_str(&crate::backends::dart::template_env::render(
"dart_trait_unregister_method.jinja",
minijinja::context! {
trait_name => trait_name.as_str(),
dart_name => dart_name.as_str(),
},
));
}
if let Some(clear_fn) = bridge_cfg.clear_fn.as_deref() {
let dart_name = clear_fn.to_lower_camel_case();
out.push_str(&crate::backends::dart::template_env::render(
"dart_trait_clear_method.jinja",
minijinja::context! {
trait_name => trait_name.as_str(),
dart_name => dart_name.as_str(),
},
));
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_emit_trait_bridge_methods_register_only() {
let cfg = TraitBridgeConfig {
trait_name: "OcrBackend".to_string(),
register_fn: Some("register_ocr_backend".to_string()),
unregister_fn: None,
clear_fn: None,
..Default::default()
};
let mut out = String::new();
emit_trait_bridge_methods(&cfg, &mut out);
assert!(out.contains("registerOcrBackend"));
assert!(!out.contains("unregisterOcrBackend"));
assert!(!out.contains("clearOcrBackends"));
}
#[test]
fn test_emit_trait_bridge_methods_all_three() {
let cfg = TraitBridgeConfig {
trait_name: "PostProcessor".to_string(),
register_fn: Some("register_post_processor".to_string()),
unregister_fn: Some("unregister_post_processor".to_string()),
clear_fn: Some("clear_post_processors".to_string()),
..Default::default()
};
let mut out = String::new();
emit_trait_bridge_methods(&cfg, &mut out);
assert!(out.contains("registerPostProcessor"));
assert!(out.contains("unregisterPostProcessor"));
assert!(out.contains("clearPostProcessors"));
}
#[test]
fn test_trait_name_to_dart_convention() {
let dart_name = "register_ocr_backend".to_lower_camel_case();
assert_eq!(dart_name, "registerOcrBackend");
let dart_name2 = "unregister_post_processor".to_lower_camel_case();
assert_eq!(dart_name2, "unregisterPostProcessor");
let dart_name3 = "clear_validators".to_lower_camel_case();
assert_eq!(dart_name3, "clearValidators");
}
}