Skip to main content

alef_core/config/
mod.rs

1use serde::{Deserialize, Serialize};
2
3pub mod build_defaults;
4pub mod clean_defaults;
5pub mod derive;
6pub mod dto;
7pub mod e2e;
8pub mod extras;
9pub mod languages;
10pub mod legacy;
11pub mod lint_defaults;
12pub mod new_config;
13pub mod output;
14pub mod publish;
15pub mod raw_crate;
16pub mod resolve_helpers;
17pub mod resolved;
18pub mod setup_defaults;
19pub mod test_defaults;
20pub mod tools;
21pub mod trait_bridge;
22pub mod update_defaults;
23pub mod validation;
24pub mod workspace;
25
26// Re-exports for backward compatibility — all types were previously flat in config.rs.
27pub use derive::{derive_go_module_from_repo, derive_repo_org, derive_reverse_dns_package};
28pub use dto::{
29    CsharpDtoStyle, DtoConfig, ElixirDtoStyle, GoDtoStyle, JavaDtoStyle, NodeDtoStyle, PhpDtoStyle, PythonDtoStyle,
30    RDtoStyle, RubyDtoStyle,
31};
32pub use e2e::E2eConfig;
33pub use extras::{AdapterConfig, AdapterParam, AdapterPattern, Language};
34pub use languages::{
35    CSharpConfig, CapsuleTypeConfig, CustomModulesConfig, CustomRegistration, CustomRegistrationsConfig, DartConfig,
36    DartStyle, ElixirConfig, FfiConfig, GleamConfig, GleamElementConstructor, GleamElementField, GoConfig, JavaConfig,
37    JniConfig, KotlinAndroidConfig, KotlinConfig, KotlinFfiStyle, KotlinTarget, NapiTypeTagConfig,
38    NodeCapsuleTypeConfig, NodeConfig, PhpConfig, PythonConfig, RConfig, RubyConfig, StubsConfig, SwiftConfig,
39    WasmConfig, ZigConfig,
40};
41pub use legacy::{LegacyConfigError, LegacyKey, detect_legacy_keys};
42pub use new_config::{NewAlefConfig, ResolveError};
43pub use output::{
44    BuildCommandConfig, CitationAuthor, CitationConfig, CleanConfig, ExcludeConfig, GeneratedHeaderConfig,
45    IncludeConfig, LintConfig, OutputConfig, OutputTemplate, PrecommitConfig, ReadmeConfig, ScaffoldCargo,
46    ScaffoldCargoEnvValue, ScaffoldCargoTargets, ScaffoldConfig, SetupConfig, SyncConfig, TestConfig, TextReplacement,
47    UpdateConfig,
48};
49pub use publish::{PublishConfig, PublishLanguageConfig, VendorMode};
50pub use raw_crate::RawCrateConfig;
51pub use resolve_helpers::{detect_serde_available, resolve_output_dir};
52pub use resolved::ResolvedCrateConfig;
53pub use tools::{DEFAULT_RUST_DEV_TOOLS, LangContext, ToolsConfig, require_tool, require_tools};
54pub use trait_bridge::{BridgeBinding, TraitBridgeConfig};
55pub use workspace::WorkspaceConfig;
56
57/// A source crate group for multi-crate extraction.
58#[derive(Debug, Clone, Serialize, Deserialize)]
59pub struct SourceCrate {
60    /// Crate name (hyphens converted to underscores for rust_path).
61    pub name: String,
62    /// Source files belonging to this crate.
63    pub sources: Vec<std::path::PathBuf>,
64}
65
66fn default_true() -> bool {
67    true
68}
69
70/// Controls which generation passes alef runs.
71/// All flags default to `true`; set to `false` to skip a pass.
72/// Can be overridden per-language via `[generate_overrides.<lang>]`.
73#[derive(Debug, Clone, Serialize, Deserialize)]
74pub struct GenerateConfig {
75    /// Generate low-level struct wrappers, From impls, module init (default: true)
76    #[serde(default = "default_true")]
77    pub bindings: bool,
78    /// Generate error type hierarchies from thiserror enums (default: true)
79    #[serde(default = "default_true")]
80    pub errors: bool,
81    /// Generate config builder constructors from Default types (default: true)
82    #[serde(default = "default_true")]
83    pub configs: bool,
84    /// Generate async/sync function pairs with runtime management (default: true)
85    #[serde(default = "default_true")]
86    pub async_wrappers: bool,
87    /// Generate recursive type marshaling helpers (default: true)
88    #[serde(default = "default_true")]
89    pub type_conversions: bool,
90    /// Generate package manifests (pyproject.toml, package.json, etc.) (default: true)
91    #[serde(default = "default_true")]
92    pub package_metadata: bool,
93    /// Generate idiomatic public API wrappers (default: true)
94    #[serde(default = "default_true")]
95    pub public_api: bool,
96    /// Generate `From<BindingType> for CoreType` reverse conversions (default: true).
97    /// Set to false when the binding layer only returns core types and never accepts them.
98    #[serde(default = "default_true")]
99    pub reverse_conversions: bool,
100}
101
102impl Default for GenerateConfig {
103    fn default() -> Self {
104        Self {
105            bindings: true,
106            errors: true,
107            configs: true,
108            async_wrappers: true,
109            type_conversions: true,
110            package_metadata: true,
111            public_api: true,
112            reverse_conversions: true,
113        }
114    }
115}
116
117/// Post-generation formatting configuration.
118/// After code generation, alef can automatically run language-native formatters
119/// on the emitted package directories to ensure CI formatter checks pass.
120#[derive(Debug, Clone, Serialize, Deserialize)]
121pub struct FormatConfig {
122    /// Enable post-generation formatting (default: true).
123    /// Set to false to skip formatting for all languages, or use per-language
124    /// overrides in `[format.<lang>]` to disable specific formatters.
125    #[serde(default = "default_true")]
126    pub enabled: bool,
127    /// Optional custom command override. If set, this command is run instead
128    /// of the language's default formatter. Must be a shell command string
129    /// (e.g., "prettier --write .").
130    #[serde(default)]
131    pub command: Option<String>,
132}
133
134impl Default for FormatConfig {
135    fn default() -> Self {
136        Self {
137            enabled: true,
138            command: None,
139        }
140    }
141}