Generators

Code Generators Module

Ce module contient les implémentations spécifiques pour chaque langage cible (Rust, C++, Verilog, VHDL, TypeScript, etc.). Il est le cœur de la “stratégie” de génération de Raise.

🏗️ Architecture

1. Structure des Classes

L’architecture repose sur le trait LanguageGenerator qui impose un contrat strict à tous les générateurs.

classDiagram
    class LanguageGenerator {
        <<trait>>
        +generate(element: Value, engine: TemplateEngine) Result~Vec~GeneratedFile~~
    }
    class RustGenerator {
        +generate(...)
    }
    class CppGenerator {
        +generate(...)
    }
    class VerilogGenerator {
        +generate(...)
    }
    LanguageGenerator <|-- RustGenerator
    LanguageGenerator <|-- CppGenerator
    LanguageGenerator <|-- VerilogGenerator
    class GeneratedFile {
        +path: PathBuf
        +content: String
    }
    LanguageGenerator ..> GeneratedFile : Produit une liste de

2. Flux de Génération (Workflow)

Ce diagramme montre comment un générateur (ex: C++) utilise le moteur de template pour produire plusieurs fichiers à partir d’un seul élément du modèle.

sequenceDiagram
    participant Service as CodeGeneratorService
    participant Gen as CppGenerator
    participant Engine as TemplateEngine
    Service->>Gen: generate(element, engine)
    rect rgb(240, 248, 255)
        note right of Gen: 1. Extraction & Parsing
        Gen->>Gen: Extrait name, id, description
        note right of Gen: 2. Contextualisation
        Gen->>Gen: Crée le Contexte Tera
    end
    note right of Gen: 3. Rendu Multi-Fichiers
    Gen->>Engine: render("cpp/header", context)
    Engine-->>Gen: Contenu du .hpp
    Gen->>Engine: render("cpp/source", context)
    Engine-->>Gen: Contenu du .cpp
    Gen-->>Service: Retourne Vec[File.hpp, File.cpp]

🚀 Générateurs Disponibles

LangageFichierTemplates ClésDescription
Rustrust_gen.rsrust/actorGénère des struct Rust avec sérialisation.
C++cpp_gen.rscpp/header, cpp/sourceGénère des classes C++ modernes séparées en Header/Source.
TypeScripttypescript_gen.rsts/classClasses typées pour le frontend ou Node.js.
Verilogverilog_gen.rsverilog/moduleModules hardware pour la synthèse FPGA.
VHDLvhdl_gen.rsvhdl/entityEntités et Architectures pour la conception ASIC.

🛠️ Guide d’Extension

Pour ajouter le support d’un nouveau langage (ex: Python), suivez ces 3 étapes :

  1. Création : Ajoutez le fichier python_gen.rs implémentant LanguageGenerator.
  2. Templates : Définissez le modèle python/class dans templates/template_engine.rs.
  3. Enregistrement : Ajoutez le module dans mod.rs et complétez le match dans la factory.

🧪 Tests

Lancez les tests spécifiques aux générateurs pour vérifier la syntaxe produite :

cargo test code_generator::generators