Skip to main content

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, Default)]
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    #[default]
40    ExamplesOrRandom,
41}
42
43/// Generate mock server code from OpenAPI spec
44///
45/// # Arguments
46/// * `spec` - The OpenAPI specification to generate code from
47/// * `language` - The target language (rs, ts, js)
48/// * `config` - Code generation configuration
49///
50/// # Returns
51/// Generated source code as a string
52pub fn generate_mock_server_code(
53    spec: &OpenApiSpec,
54    language: &str,
55    config: &CodegenConfig,
56) -> Result<String> {
57    match language {
58        "rs" | "rust" => rust_generator::generate(spec, config),
59        "ts" | "typescript" => typescript_generator::generate(spec, config),
60        "js" | "javascript" => typescript_generator::generate(spec, config),
61        _ => Err(crate::Error::generic(format!(
62            "Unsupported language: {}. Supported: rust, typescript, javascript",
63            language
64        ))),
65    }
66}