From 1aa691e70b7f1f2c3e8659f2d43daae45d2df23e Mon Sep 17 00:00:00 2001 From: aka686 Date: Thu, 26 Feb 2026 23:43:58 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E7=94=A8=E5=A3=B0=E6=98=8E?= =?UTF-8?q?=E5=BC=8F=E5=AE=9A=E4=B9=89=E8=A1=A8=E6=9B=BF=E6=8D=A2=20CLI=20?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E8=A7=A3=E6=9E=90=E7=9A=84=20if-else=20?= =?UTF-8?q?=E9=93=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 12 个 CLI 参数的手写 if-else 链(约 100 行)重构为数据驱动的声明式定义表, 支持 string/int/bool/enum 四种类型自动解析。 - 新增参数只需在 cliArgDefs 数组中添加一行 - 消除大量重复的模式代码 - 保持完全相同的解析行为和警告输出 --- src/core/config-manager.js | 136 ++++++++++++------------------------- 1 file changed, 43 insertions(+), 93 deletions(-) diff --git a/src/core/config-manager.js b/src/core/config-manager.js index e724afb..46aa7c0 100644 --- a/src/core/config-manager.js +++ b/src/core/config-manager.js @@ -95,102 +95,52 @@ export async function initializeConfig(args = process.argv.slice(2), configFileP logger.info('[Config] Using default configuration.'); } - // Parse command-line arguments + // CLI argument definitions: { flag, configKey, type, validValues? } + // type: 'string' | 'int' | 'bool' | 'enum' + const cliArgDefs = [ + { flag: '--api-key', configKey: 'REQUIRED_API_KEY', type: 'string' }, + { flag: '--log-prompts', configKey: 'PROMPT_LOG_MODE', type: 'enum', validValues: ['console', 'file'] }, + { flag: '--port', configKey: 'SERVER_PORT', type: 'int' }, + { flag: '--model-provider', configKey: 'MODEL_PROVIDER', type: 'string' }, + { flag: '--system-prompt-file', configKey: 'SYSTEM_PROMPT_FILE_PATH', type: 'string' }, + { flag: '--system-prompt-mode', configKey: 'SYSTEM_PROMPT_MODE', type: 'enum', validValues: ['overwrite', 'append'] }, + { flag: '--host', configKey: 'HOST', type: 'string' }, + { flag: '--prompt-log-base-name', configKey: 'PROMPT_LOG_BASE_NAME', type: 'string' }, + { flag: '--cron-near-minutes', configKey: 'CRON_NEAR_MINUTES', type: 'int' }, + { flag: '--cron-refresh-token', configKey: 'CRON_REFRESH_TOKEN', type: 'bool' }, + { flag: '--provider-pools-file', configKey: 'PROVIDER_POOLS_FILE_PATH', type: 'string' }, + { flag: '--max-error-count', configKey: 'MAX_ERROR_COUNT', type: 'int' }, + ]; + + // Parse command-line arguments using definitions + const flagMap = new Map(cliArgDefs.map(def => [def.flag, def])); for (let i = 0; i < args.length; i++) { - if (args[i] === '--api-key') { - if (i + 1 < args.length) { - currentConfig.REQUIRED_API_KEY = args[i + 1]; - i++; - } else { - logger.warn(`[Config Warning] --api-key flag requires a value.`); - } - } else if (args[i] === '--log-prompts') { - if (i + 1 < args.length) { - const mode = args[i + 1]; - if (mode === 'console' || mode === 'file') { - currentConfig.PROMPT_LOG_MODE = mode; + const def = flagMap.get(args[i]); + if (!def) continue; + + if (i + 1 >= args.length) { + logger.warn(`[Config Warning] ${def.flag} flag requires a value.`); + continue; + } + + const rawValue = args[++i]; + switch (def.type) { + case 'string': + currentConfig[def.configKey] = rawValue; + break; + case 'int': + currentConfig[def.configKey] = parseInt(rawValue, 10); + break; + case 'bool': + currentConfig[def.configKey] = rawValue.toLowerCase() === 'true'; + break; + case 'enum': + if (def.validValues.includes(rawValue)) { + currentConfig[def.configKey] = rawValue; } else { - logger.warn(`[Config Warning] Invalid mode for --log-prompts. Expected 'console' or 'file'. Prompt logging is disabled.`); + logger.warn(`[Config Warning] Invalid value for ${def.flag}. Expected one of: ${def.validValues.join(', ')}.`); } - i++; - } else { - logger.warn(`[Config Warning] --log-prompts flag requires a value.`); - } - } else if (args[i] === '--port') { - if (i + 1 < args.length) { - currentConfig.SERVER_PORT = parseInt(args[i + 1], 10); - i++; - } else { - logger.warn(`[Config Warning] --port flag requires a value.`); - } - } else if (args[i] === '--model-provider') { - if (i + 1 < args.length) { - currentConfig.MODEL_PROVIDER = args[i + 1]; - i++; - } else { - logger.warn(`[Config Warning] --model-provider flag requires a value.`); - } - } else if (args[i] === '--system-prompt-file') { - if (i + 1 < args.length) { - currentConfig.SYSTEM_PROMPT_FILE_PATH = args[i + 1]; - i++; - } else { - logger.warn(`[Config Warning] --system-prompt-file flag requires a value.`); - } - } else if (args[i] === '--system-prompt-mode') { - if (i + 1 < args.length) { - const mode = args[i + 1]; - if (mode === 'overwrite' || mode === 'append') { - currentConfig.SYSTEM_PROMPT_MODE = mode; - } else { - logger.warn(`[Config Warning] Invalid mode for --system-prompt-mode. Expected 'overwrite' or 'append'. Using default 'overwrite'.`); - } - i++; - } else { - logger.warn(`[Config Warning] --system-prompt-mode flag requires a value.`); - } - } else if (args[i] === '--host') { - if (i + 1 < args.length) { - currentConfig.HOST = args[i + 1]; - i++; - } else { - logger.warn(`[Config Warning] --host flag requires a value.`); - } - } else if (args[i] === '--prompt-log-base-name') { - if (i + 1 < args.length) { - currentConfig.PROMPT_LOG_BASE_NAME = args[i + 1]; - i++; - } else { - logger.warn(`[Config Warning] --prompt-log-base-name flag requires a value.`); - } - } else if (args[i] === '--cron-near-minutes') { - if (i + 1 < args.length) { - currentConfig.CRON_NEAR_MINUTES = parseInt(args[i + 1], 10); - i++; - } else { - logger.warn(`[Config Warning] --cron-near-minutes flag requires a value.`); - } - } else if (args[i] === '--cron-refresh-token') { - if (i + 1 < args.length) { - currentConfig.CRON_REFRESH_TOKEN = args[i + 1].toLowerCase() === 'true'; - i++; - } else { - logger.warn(`[Config Warning] --cron-refresh-token flag requires a value.`); - } - } else if (args[i] === '--provider-pools-file') { - if (i + 1 < args.length) { - currentConfig.PROVIDER_POOLS_FILE_PATH = args[i + 1]; - i++; - } else { - logger.warn(`[Config Warning] --provider-pools-file flag requires a value.`); - } - } else if (args[i] === '--max-error-count') { - if (i + 1 < args.length) { - currentConfig.MAX_ERROR_COUNT = parseInt(args[i + 1], 10); - i++; - } else { - logger.warn(`[Config Warning] --max-error-count flag requires a value.`); - } + break; } }