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