🦀 UniStructGen Codegen
Генератор идиоматичного Rust-кода из Intermediate Representation
📋 Содержание
- Обзор
- Установка
- Быстрый старт
- RustRenderer
- RenderOptions
- RustRendererBuilder
- Обработка типов
- Валидация
- Обработка ошибок
- Примеры
🎯 Обзор
unistructgen-codegen — это модуль генерации Rust-кода из IR (Intermediate Representation). Он обеспечивает:
- Идиоматичный Rust — правильное форматирование, стиль и соглашения
- Derive macros — автоматическое добавление Debug, Clone, PartialEq, serde
- Документация — сохранение doc-комментариев из IR
- Атрибуты — поддержка #[serde(...)], #[validate(...)], etc.
- Type safety — корректное маппирование IR типов в Rust типы
- Вложенные типы — генерация всех связанных структур
Поддерживаемые возможности
| Возможность | Описание |
|---|---|
| Structs | Публичные структуры с полями |
| Enums | Перечисления с вариантами |
| Doc comments | /// Документация |
| Derives | #[derive(...)] |
| Serde attributes | #[serde(rename = "...")] |
| Validation | #[validate(...)] |
| Nested types | Автоматическое разрешение зависимостей |
| Option/Vec/Map | Option<T>, Vec<T>, HashMap<K, V> |
📦 Установка
[]
= "0.1"
= "0.1"
🚀 Быстрый старт
use ;
use ;
Результат:
// Generated by unistructgen v0.1.0
// Do not edit this file manually
/// Represents a user in the system
🎨 RustRenderer
Основной класс для генерации Rust-кода.
Создание
use ;
// С дефолтными опциями
let renderer = new;
// С кастомными опциями
let renderer = new;
Методы
use CodeGenerator;
// Основной метод генерации (через трейт CodeGenerator)
let code = renderer.generate?;
// Альтернативный метод (прямой вызов)
let code = renderer.render?;
// Метаданные генератора
let metadata = renderer.metadata;
println!; // "Rust"
println!; // "rs"
// Валидация IR перед генерацией
renderer.validate?;
// Форматирование (placeholder для rustfmt)
let formatted = renderer.format?;
⚙️ RenderOptions
Конфигурация генерации кода.
Опции
| Опция | Тип | По умолчанию | Описание |
|---|---|---|---|
add_header |
bool |
true |
Добавлять заголовок с версией |
add_clippy_allows |
bool |
true |
Добавлять #![allow(...)] |
Примеры
use RenderOptions;
// Для production: с заголовком и clippy allows
let prod_options = default;
// Для тестов/макросов: чистый код
let test_options = RenderOptions ;
// Только заголовок, без clippy
let custom_options = RenderOptions ;
🏗️ RustRendererBuilder
Fluent-билдер для создания рендерера.
use RustRendererBuilder;
let renderer = new
.with_header
.with_clippy_allows
.build;
🔤 Обработка типов
Примитивные типы
| PrimitiveKind | Rust Type |
|---|---|
String |
String |
I8 |
i8 |
I16 |
i16 |
I32 |
i32 |
I64 |
i64 |
I128 |
i128 |
U8 |
u8 |
U16 |
u16 |
U32 |
u32 |
U64 |
u64 |
U128 |
u128 |
F32 |
f32 |
F64 |
f64 |
Bool |
bool |
Char |
char |
DateTime |
chrono::DateTime<chrono::Utc> |
Uuid |
uuid::Uuid |
Decimal |
rust_decimal::Decimal |
Json |
serde_json::Value |
Составные типы
// Option<T>
Option
// → Option<String>
// Vec<T>
Vec
// → Vec<i32>
// HashMap<K, V>
Map
// → std::collections::HashMap<String, i64>
// Ссылка на тип
Named
// → Address
Вложенные типы
// Option<Vec<String>>
Option
// → Option<Vec<String>>
// Vec<HashMap<String, User>>
Vec
// → Vec<std::collections::HashMap<String, User>>
✅ Валидация
Генератор валидирует атрибуты из FieldConstraints и создаёт #[validate(...)].
Поддерживаемые ограничения
use FieldConstraints;
let constraints = FieldConstraints ;
Пример генерации
let mut field = new;
field.constraints = FieldConstraints ;
// Результат:
// #[validate(length(min = 5, max = 255), email)]
// pub email: String,
❌ Обработка ошибок
CodegenError
use CodegenError;
Обработка ошибок
use ;
let renderer = new;
match renderer.generate
Добавление suggestions
use CodegenError;
let error = validation_error
.with_suggestion;
📝 Примеры
Генерация структуры с serde
use ;
use *;
let mut user = new;
user.add_derive;
user.add_derive;
let mut id_field = new;
let mut name_field = new;
name_field.source_name = Some;
name_field.attributes.push;
user.add_field;
user.add_field;
let mut module = new;
module.add_type;
let renderer = new;
let code = renderer.generate?;
Результат:
Генерация enum
use *;
let status = IREnum ;
let mut module = new;
module.add_type;
let renderer = new;
let code = renderer.generate?;
Результат:
/// Order status enum
Генерация с валидацией
let mut email_field = new;
email_field.doc = Some;
email_field.constraints = FieldConstraints ;
let mut age_field = new;
age_field.constraints = FieldConstraints ;
Результат:
/// User's email address
pub email: String,
pub age: i32,
🔗 Связанные модули
- unistructgen-core — IR, трейты, pipeline
- unistructgen-json-parser — JSON → IR
- unistructgen-markdown-parser — Markdown → IR
- unistructgen-openapi-parser — OpenAPI → IR
🗺 Roadmap
- Интеграция с
rustfmtдля форматирования - Генерация
implблоков - Генерация
From/Intoтрейтов - Генерация
Builderпаттерна - Поддержка
#[cfg(...)]атрибутов
📜 Лицензия
MIT или Apache-2.0 — на ваш выбор.