diff --git a/backup/cmd/config.go b/backup/cmd/config.go index 95c684f..1f5bd64 100644 --- a/backup/cmd/config.go +++ b/backup/cmd/config.go @@ -7,48 +7,59 @@ import ( "github.com/spf13/cobra" ) +type configVerb struct { + use string + short string + errCtx string + success func(cmd *cobra.Command, cfg internal.Config) +} + func buildConfigCommand() *cobra.Command { - var configCmd = &cobra.Command{ + configVerbs := []configVerb{ + { + use: "show", + short: "Show resolved configuration", + errCtx: "loading config", + success: func(cmd *cobra.Command, cfg internal.Config) { + fmt.Fprintf(cmd.OutOrStdout(), "Resolved Configuration:\n%s\n", cfg) + }, + }, + { + use: "validate", + short: "Validate configuration", + errCtx: "validating config", + success: func(cmd *cobra.Command, _ internal.Config) { + fmt.Fprintln(cmd.OutOrStdout(), "Configuration is valid.") + }, + }, + } + configCmd := &cobra.Command{ Use: "config", Short: "Manage configuration", } - var showVerb = &cobra.Command{ - Use: "show", - Short: "Show resolved configuration", - RunE: func(cmd *cobra.Command, args []string) error { - configPath, _ := cmd.Flags().GetString("config") - - cfg, err := internal.LoadResolvedConfig(configPath) - if err != nil { - return fmt.Errorf("loading config: %w", err) - } - - fmt.Fprintf(cmd.OutOrStdout(), "Resolved Configuration:\n%s\n", cfg) - - return nil - }, + for _, verb := range configVerbs { + configCmd.AddCommand(&cobra.Command{ + Use: verb.use, + Short: verb.short, + RunE: configRunE(verb), + }) } - var validateVerb = &cobra.Command{ - Use: "validate", - Short: "Validate configuration", - RunE: func(cmd *cobra.Command, args []string) error { - configPath, _ := cmd.Flags().GetString("config") - - _, err := internal.LoadResolvedConfig(configPath) - if err != nil { - return fmt.Errorf("validating config: %w", err) - } + return configCmd +} - fmt.Fprintln(cmd.OutOrStdout(), "Configuration is valid.") +func configRunE(verb configVerb) func(*cobra.Command, []string) error { + return func(cmd *cobra.Command, args []string) error { + configPath, _ := cmd.Flags().GetString("config") - return nil - }, - } + cfg, err := internal.LoadResolvedConfig(configPath) + if err != nil { + return fmt.Errorf("%s: %w", verb.errCtx, err) + } - configCmd.AddCommand(showVerb) - configCmd.AddCommand(validateVerb) + verb.success(cmd, cfg) - return configCmd + return nil + } } diff --git a/backup/internal/config.go b/backup/internal/config.go index bf0eb6a..d0c920b 100644 --- a/backup/internal/config.go +++ b/backup/internal/config.go @@ -134,22 +134,16 @@ func ValidatePath(jobPath string, paths []Path, pathType string, jobName string) } func ValidatePaths(cfg Config) error { - invalidPaths := []string{} + errs := make([]error, 0, len(cfg.Jobs)*2) //nolint:mnd // 2 validations per job: source + target for _, job := range cfg.Jobs { - err := ValidatePath(job.Source, cfg.Sources, "source", job.Name) - if err != nil { - invalidPaths = append(invalidPaths, err.Error()) - } - - err = ValidatePath(job.Target, cfg.Targets, "target", job.Name) - if err != nil { - invalidPaths = append(invalidPaths, err.Error()) - } + errs = append(errs, ValidatePath(job.Source, cfg.Sources, "source", job.Name)) + errs = append(errs, ValidatePath(job.Target, cfg.Targets, "target", job.Name)) } - if len(invalidPaths) > 0 { - return fmt.Errorf("%w: %v", ErrPathValidation, invalidPaths) + joined := errors.Join(errs...) + if joined != nil { + return fmt.Errorf("%w: %w", ErrPathValidation, joined) } return nil