Skip to main content

alef_core/config/
dto.rs

1use serde::{Deserialize, Serialize};
2
3/// Per-language DTO/type generation style configuration.
4///
5/// Controls what type system is used for generated public API types in each language
6/// (e.g., Python `@dataclass` vs `TypedDict` vs `pydantic.BaseModel`).
7#[derive(Debug, Clone, Serialize, Deserialize, Default)]
8pub struct DtoConfig {
9    /// Python input type style (default: dataclass).
10    #[serde(default)]
11    pub python: PythonDtoStyle,
12    /// Python output/return type style (default: same as `python`).
13    #[serde(default)]
14    pub python_output: Option<PythonDtoStyle>,
15    /// TypeScript/Node type style (default: interface).
16    #[serde(default)]
17    pub node: NodeDtoStyle,
18    /// Ruby type style (default: struct).
19    #[serde(default)]
20    pub ruby: RubyDtoStyle,
21    /// PHP type style (default: readonly-class).
22    #[serde(default)]
23    pub php: PhpDtoStyle,
24    /// Elixir type style (default: struct).
25    #[serde(default)]
26    pub elixir: ElixirDtoStyle,
27    /// Go type style (default: struct).
28    #[serde(default)]
29    pub go: GoDtoStyle,
30    /// Java type style (default: record).
31    #[serde(default)]
32    pub java: JavaDtoStyle,
33    /// C# type style (default: record).
34    #[serde(default)]
35    pub csharp: CsharpDtoStyle,
36    /// R type style (default: list).
37    #[serde(default)]
38    pub r: RDtoStyle,
39}
40
41impl DtoConfig {
42    /// Resolve the Python output type style (falls back to input style).
43    pub fn python_output_style(&self) -> PythonDtoStyle {
44        self.python_output.unwrap_or(self.python)
45    }
46}
47
48#[derive(Debug, Clone, Copy, Serialize, Deserialize, Default, PartialEq, Eq)]
49#[serde(rename_all = "kebab-case")]
50pub enum PythonDtoStyle {
51    #[default]
52    Dataclass,
53    TypedDict,
54    Pydantic,
55    Msgspec,
56}
57
58#[derive(Debug, Clone, Copy, Serialize, Deserialize, Default, PartialEq, Eq)]
59#[serde(rename_all = "kebab-case")]
60pub enum NodeDtoStyle {
61    #[default]
62    Interface,
63    Zod,
64}
65
66#[derive(Debug, Clone, Copy, Serialize, Deserialize, Default, PartialEq, Eq)]
67#[serde(rename_all = "kebab-case")]
68pub enum RubyDtoStyle {
69    #[default]
70    Struct,
71    DryStruct,
72    Data,
73}
74
75#[derive(Debug, Clone, Copy, Serialize, Deserialize, Default, PartialEq, Eq)]
76#[serde(rename_all = "kebab-case")]
77pub enum PhpDtoStyle {
78    #[default]
79    ReadonlyClass,
80    Array,
81}
82
83#[derive(Debug, Clone, Copy, Serialize, Deserialize, Default, PartialEq, Eq)]
84#[serde(rename_all = "kebab-case")]
85pub enum ElixirDtoStyle {
86    #[default]
87    Struct,
88    TypedStruct,
89}
90
91#[derive(Debug, Clone, Copy, Serialize, Deserialize, Default, PartialEq, Eq)]
92#[serde(rename_all = "kebab-case")]
93pub enum GoDtoStyle {
94    #[default]
95    Struct,
96}
97
98#[derive(Debug, Clone, Copy, Serialize, Deserialize, Default, PartialEq, Eq)]
99#[serde(rename_all = "kebab-case")]
100pub enum JavaDtoStyle {
101    #[default]
102    Record,
103}
104
105#[derive(Debug, Clone, Copy, Serialize, Deserialize, Default, PartialEq, Eq)]
106#[serde(rename_all = "kebab-case")]
107pub enum CsharpDtoStyle {
108    #[default]
109    Record,
110}
111
112#[derive(Debug, Clone, Copy, Serialize, Deserialize, Default, PartialEq, Eq)]
113#[serde(rename_all = "kebab-case")]
114pub enum RDtoStyle {
115    #[default]
116    List,
117    R6,
118}