alef_codegen/generators/mod.rs
1use ahash::AHashMap;
2
3pub mod binding_helpers;
4pub mod enums;
5pub mod functions;
6pub mod methods;
7pub mod structs;
8
9/// Map of adapter-generated method/function bodies.
10/// Key: "TypeName.method_name" for methods, "function_name" for free functions.
11pub type AdapterBodies = AHashMap<String, String>;
12
13/// Async support pattern for the backend.
14#[derive(Clone, Copy, Debug, PartialEq, Eq)]
15pub enum AsyncPattern {
16 /// No async support
17 None,
18 /// PyO3: pyo3_async_runtimes::tokio::future_into_py
19 Pyo3FutureIntoPy,
20 /// NAPI-RS: native async fn → auto-Promise
21 NapiNativeAsync,
22 /// wasm-bindgen: native async fn → auto-Promise
23 WasmNativeAsync,
24 /// Block on Tokio runtime (Ruby, PHP)
25 TokioBlockOn,
26}
27
28/// Configuration for Rust binding code generation.
29pub struct RustBindingConfig<'a> {
30 /// Attrs applied to generated structs, e.g. `["pyclass(frozen)"]`.
31 pub struct_attrs: &'a [&'a str],
32 /// Attrs applied to each field, e.g. `["pyo3(get)"]`.
33 pub field_attrs: &'a [&'a str],
34 /// Derives applied to generated structs, e.g. `["Clone"]`.
35 pub struct_derives: &'a [&'a str],
36 /// Attr wrapping the impl block, e.g. `Some("pymethods")`.
37 pub method_block_attr: Option<&'a str>,
38 /// Attr placed on the constructor, e.g. `"#[new]"`.
39 pub constructor_attr: &'a str,
40 /// Attr placed on static methods, e.g. `Some("staticmethod")`.
41 pub static_attr: Option<&'a str>,
42 /// Attr placed on free functions, e.g. `"#[pyfunction]"`.
43 pub function_attr: &'a str,
44 /// Attrs applied to generated enums, e.g. `["pyclass(eq, eq_int)"]`.
45 pub enum_attrs: &'a [&'a str],
46 /// Derives applied to generated enums, e.g. `["Clone", "PartialEq"]`.
47 pub enum_derives: &'a [&'a str],
48 /// Whether the backend requires `#[pyo3(signature = (...))]`-style annotations.
49 pub needs_signature: bool,
50 /// Prefix for the signature annotation, e.g. `"#[pyo3(signature = ("`.
51 pub signature_prefix: &'a str,
52 /// Suffix for the signature annotation, e.g. `"))]"`.
53 pub signature_suffix: &'a str,
54 /// Core crate import path, e.g. `"liter_llm"`. Used to generate calls into core.
55 pub core_import: &'a str,
56 /// Async pattern supported by this backend.
57 pub async_pattern: AsyncPattern,
58 /// Whether serde/serde_json are available in the output crate's dependencies.
59 /// When true, the generator can use serde-based param conversion and add `serde::Serialize` derives.
60 /// When false, non-convertible Named params fall back to `gen_unimplemented_body`.
61 pub has_serde: bool,
62 /// Prefix for binding type names (e.g. "Js" for NAPI/WASM, "" for PyO3/PHP).
63 /// Used in impl block targets: `impl {prefix}{TypeName}`.
64 pub type_name_prefix: &'a str,
65}
66
67/// Method names that conflict with standard trait methods.
68/// When a generated method has one of these names, we add
69/// `#[allow(clippy::should_implement_trait)]` to suppress the lint.
70pub(super) const TRAIT_METHOD_NAMES: &[&str] = &[
71 "default", "from", "from_str", "into", "eq", "ne", "lt", "le", "gt", "ge", "add", "sub", "mul", "div", "rem",
72 "neg", "not", "index", "deref",
73];
74
75// Re-exports for backwards compatibility — callers use `crate::generators::*`.
76pub use binding_helpers::{
77 gen_async_body, gen_call_args, gen_call_args_with_let_bindings, gen_lossy_binding_to_core_fields,
78 gen_named_let_bindings_pub, gen_serde_let_bindings, gen_unimplemented_body, has_named_params,
79 is_simple_non_opaque_param, wrap_return,
80};
81pub use enums::gen_enum;
82pub use functions::{collect_trait_imports, gen_function};
83pub use methods::{
84 gen_constructor, gen_impl_block, gen_method, gen_opaque_impl_block, gen_static_method, is_trait_method_name,
85};
86pub use structs::{gen_opaque_struct, gen_opaque_struct_prefixed, gen_struct, gen_struct_default_impl};