Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion main.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ func (a *app) wrapProductCommand(cmd *cobra.Command) {

switch cmd.Name() {
case "safeline-ce":
safelinece.ApplyRuntimeConfig(command, a.config)
safelinece.ApplyRuntimeConfig(command, a.config, a.dryRun)
case "cloudwalker":
cloudwalker.ApplyRuntimeConfig(command, a.config)
case "tanswer":
Expand Down
30 changes: 4 additions & 26 deletions products/safeline-ce/command.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ var openAPIFS embed.FS
// 运行时配置
var (
runtimeCfg runtimeConfig
dryRun bool
)

type runtimeConfig struct {
Expand Down Expand Up @@ -50,9 +51,7 @@ func NewCommand() *cobra.Command {

文档: https://github.com/chaitin/safeline-ce`,
PersistentPreRun: func(cmd *cobra.Command, args []string) {
// 加载配置文件
loadConfigFromFile(cmd)
// 应用运行时配置
// 应用运行时配置到命令 flags
applyRuntimeConfig(cmd)
},
}
Expand All @@ -73,12 +72,13 @@ func NewCommand() *cobra.Command {
}

// ApplyRuntimeConfig 应用运行时配置(供 main.go 调用)
func ApplyRuntimeConfig(cmd *cobra.Command, cfg config.Raw) {
func ApplyRuntimeConfig(cmd *cobra.Command, cfg config.Raw, isDryRun bool) {
productCfg, err := config.DecodeProduct[runtimeConfig](cfg, "safeline-ce")
if err != nil {
return
}
runtimeCfg = productCfg
dryRun = isDryRun
}

// applyRuntimeConfig 应用运行时配置到命令 flags
Expand All @@ -92,28 +92,6 @@ func applyRuntimeConfig(cmd *cobra.Command) {
}
}

// loadConfigFromFile 从配置文件加载配置
func loadConfigFromFile(cmd *cobra.Command) {
// 如果根命令 flag 已设置,使用指定的配置文件
configPath := ""
if inherited := cmd.InheritedFlags().Lookup("config"); inherited != nil {
configPath = inherited.Value.String()
}
if configPath == "" {
configPath = DefaultConfigPath()
}

cfg, err := LoadConfig(configPath)
if err != nil {
// 配置文件不存在或解析失败,使用命令行参数或环境变量
return
}

// 将配置存入 runtimeCfg
runtimeCfg.URL = cfg.URL
runtimeCfg.APIKey = cfg.APIKey
}

// loadDynamicCommands 从嵌入的 OpenAPI 定义加载动态命令
func loadDynamicCommands(cmd *cobra.Command) error {
// 从嵌入的 FS 读取 openapi.json
Expand Down
36 changes: 30 additions & 6 deletions products/safeline-ce/parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,8 @@ func (p *Parser) executeCommand(cmd *cobra.Command, method, path string, basePat
pathParams := make(map[string]string)

for _, param := range params {
val, err := cmd.Flags().GetString(param.Name)
flagName := paramFlagName(param.Name)
val, err := cmd.Flags().GetString(flagName)
if err != nil {
continue
}
Expand Down Expand Up @@ -213,7 +214,7 @@ func (p *Parser) executeCommand(cmd *cobra.Command, method, path string, basePat
query.Set("page", fmt.Sprintf("%d", page))
}
if size, err := cmd.Flags().GetInt("size"); err == nil && size > 0 {
query.Set("size", fmt.Sprintf("%d", size))
query.Set("page_size", fmt.Sprintf("%d", size))
}

// 运行时获取 client(确保使用已加载的配置)
Expand Down Expand Up @@ -313,7 +314,30 @@ func operationName(method, path string) string {
return strings.ToLower(method)
}

// 全局 flag 名称,避免与 API 参数冲突
var globalFlags = map[string]bool{
"url": true,
"api-key": true,
"output": true,
"verbose": true,
"dry-run": true,
"page": true, // 分页参数由代码自动添加
"size": true,
}

// paramFlagName 获取参数对应的 flag 名称,避免与全局 flag 冲突
func paramFlagName(paramName string) string {
// 如果与全局 flag 冲突,添加前缀
if globalFlags[paramName] {
return "query-" + paramName
}
return paramName
}

func (p *Parser) addFlag(cmd *cobra.Command, param Parameter) {
// 跳过与全局 flag 冲突的参数(使用不同的 flag 名称)
flagName := paramFlagName(param.Name)

// 优先级:x-cli-description > x-cli.params > 默认 description
desc := param.XCLIDescription
if desc == "" {
Expand All @@ -325,14 +349,14 @@ func (p *Parser) addFlag(cmd *cobra.Command, param Parameter) {

switch param.Type {
case "integer":
cmd.Flags().Int(param.Name, 0, desc)
cmd.Flags().Int(flagName, 0, desc)
case "boolean":
cmd.Flags().Bool(param.Name, false, desc)
cmd.Flags().Bool(flagName, false, desc)
default:
cmd.Flags().String(param.Name, "", desc)
cmd.Flags().String(flagName, "", desc)
}

if param.Required {
cmd.MarkFlagRequired(param.Name)
cmd.MarkFlagRequired(flagName)
}
}
Loading