Skip to main content

openapi_nexus/config/
global_config.rs

1//! Global configuration settings
2
3use clap::Args;
4use serde::{Deserialize, Serialize};
5
6use crate::codegen::GeneratorType;
7
8/// Global configuration settings (supports CLI args, env vars, and config files)
9#[derive(Debug, Clone, Args, Serialize, Deserialize)]
10pub struct GlobalConfig {
11    /// Output directory for generated code
12    #[arg(short = 'o', long, env = "OPENAPI_NEXUS_OUTPUT")]
13    pub output: Option<String>,
14
15    /// Generator frameworks to use (e.g., typescript-fetch)
16    #[arg(short = 'g', long, env = "OPENAPI_NEXUS_GENERATORS")]
17    pub generators: Option<Vec<GeneratorType>>,
18}
19
20fn default_output() -> String {
21    "generated/{generator}".to_string()
22}
23
24impl Default for GlobalConfig {
25    fn default() -> Self {
26        Self {
27            output: Some(default_output()),
28            generators: None,
29        }
30    }
31}
32
33impl GlobalConfig {
34    /// Get output path for a specific generator with template rendering
35    ///
36    /// Replaces template variables in the output string:
37    /// - `{generator}`: generator string representation (e.g., "typescript-fetch")
38    /// - `{language}`: language name (e.g., "TypeScript")
39    /// - `{framework}`: framework name (e.g., "fetch")
40    pub fn output_for_generator(&self, generator: GeneratorType) -> String {
41        let generator_str = generator.to_string();
42        let language = generator.language().to_string();
43        let framework = generator.framework();
44
45        let output = self.output.clone().unwrap_or_else(default_output);
46        output
47            .replace("{generator}", &generator_str)
48            .replace("{language}", &language)
49            .replace("{framework}", &framework)
50    }
51}