mockforge_core/codegen/
mod.rs

1//! Code generation from OpenAPI specifications
2//!
3//! This module provides functionality for generating executable mock server code
4//! from OpenAPI specifications, supporting multiple output languages and frameworks.
5
6pub mod rust_generator;
7pub mod typescript_generator;
8
9#[cfg(test)]
10mod tests;
11
12use crate::openapi::spec::OpenApiSpec;
13use crate::Result;
14
15/// Configuration for code generation
16#[derive(Debug, Clone, Default)]
17pub struct CodegenConfig {
18    /// Generate mock data strategy
19    pub mock_data_strategy: MockDataStrategy,
20    /// Server port (for generated code)
21    pub port: Option<u16>,
22    /// Enable CORS
23    pub enable_cors: bool,
24    /// Response delay simulation (milliseconds)
25    pub default_delay_ms: Option<u64>,
26}
27
28/// Strategy for generating mock data in generated code
29#[derive(Debug, Clone, Copy, PartialEq, Eq)]
30pub enum MockDataStrategy {
31    /// Generate random data from schemas (fuzzing-style)
32    Random,
33    /// Use examples from OpenAPI spec (deterministic)
34    Examples,
35    /// Use schema defaults when available
36    Defaults,
37    /// Prefer examples, fallback to random when examples are missing
38    ExamplesOrRandom,
39}
40
41impl Default for MockDataStrategy {
42    fn default() -> Self {
43        Self::ExamplesOrRandom
44    }
45}
46
47/// Generate mock server code from OpenAPI spec
48///
49/// # Arguments
50/// * `spec` - The OpenAPI specification to generate code from
51/// * `language` - The target language (rs, ts, js)
52/// * `config` - Code generation configuration
53///
54/// # Returns
55/// Generated source code as a string
56pub fn generate_mock_server_code(
57    spec: &OpenApiSpec,
58    language: &str,
59    config: &CodegenConfig,
60) -> Result<String> {
61    match language {
62        "rs" | "rust" => rust_generator::generate(spec, config),
63        "ts" | "typescript" => typescript_generator::generate(spec, config),
64        "js" | "javascript" => typescript_generator::generate(spec, config),
65        _ => Err(crate::Error::generic(format!(
66            "Unsupported language: {}. Supported: rust, typescript, javascript",
67            language
68        ))),
69    }
70}