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}