Add trim CLI command
This commit is contained in:
@@ -47,6 +47,17 @@ type MergeOptions struct {
|
||||
CoalesceGap string
|
||||
}
|
||||
|
||||
// TrimOptions captures raw CLI option values before validation.
|
||||
type TrimOptions struct {
|
||||
InputFile string
|
||||
OutputFile string
|
||||
ReportFile string
|
||||
Keep string
|
||||
Remove string
|
||||
OutputSchema string
|
||||
AllowEmpty bool
|
||||
}
|
||||
|
||||
// Config is the validated runtime configuration for a merge invocation.
|
||||
type Config struct {
|
||||
InputFiles []string
|
||||
@@ -66,6 +77,17 @@ type Config struct {
|
||||
FillerMaxDuration float64
|
||||
}
|
||||
|
||||
// TrimConfig is the validated runtime configuration for a trim invocation.
|
||||
type TrimConfig struct {
|
||||
InputFile string
|
||||
OutputFile string
|
||||
ReportFile string
|
||||
Mode string
|
||||
Selector string
|
||||
OutputSchema string
|
||||
AllowEmpty bool
|
||||
}
|
||||
|
||||
// NewMergeConfig validates raw merge options and returns normalized config.
|
||||
func NewMergeConfig(opts MergeOptions) (Config, error) {
|
||||
cfg := Config{
|
||||
@@ -168,6 +190,63 @@ func NewMergeConfig(opts MergeOptions) (Config, error) {
|
||||
return cfg, nil
|
||||
}
|
||||
|
||||
// NewTrimConfig validates raw trim options and returns normalized config.
|
||||
func NewTrimConfig(opts TrimOptions) (TrimConfig, error) {
|
||||
inputFile := filepath.Clean(strings.TrimSpace(opts.InputFile))
|
||||
if strings.TrimSpace(opts.InputFile) == "" {
|
||||
return TrimConfig{}, errors.New("--input-file is required")
|
||||
}
|
||||
if err := requireFile(inputFile, "--input-file"); err != nil {
|
||||
return TrimConfig{}, err
|
||||
}
|
||||
|
||||
outputFile, err := normalizeOutputPath(opts.OutputFile, "--output-file")
|
||||
if err != nil {
|
||||
return TrimConfig{}, err
|
||||
}
|
||||
|
||||
reportFile := ""
|
||||
if strings.TrimSpace(opts.ReportFile) != "" {
|
||||
reportFile, err = normalizeOutputPath(opts.ReportFile, "--report-file")
|
||||
if err != nil {
|
||||
return TrimConfig{}, err
|
||||
}
|
||||
}
|
||||
|
||||
keep := strings.TrimSpace(opts.Keep)
|
||||
remove := strings.TrimSpace(opts.Remove)
|
||||
if keep == "" && remove == "" {
|
||||
return TrimConfig{}, errors.New("exactly one of --keep or --remove is required")
|
||||
}
|
||||
if keep != "" && remove != "" {
|
||||
return TrimConfig{}, errors.New("--keep and --remove are mutually exclusive")
|
||||
}
|
||||
|
||||
mode := "keep"
|
||||
selector := keep
|
||||
if remove != "" {
|
||||
mode = "remove"
|
||||
selector = remove
|
||||
}
|
||||
|
||||
outputSchema := strings.TrimSpace(opts.OutputSchema)
|
||||
if outputSchema != "" {
|
||||
if err := validateOutputSchema(outputSchema); err != nil {
|
||||
return TrimConfig{}, err
|
||||
}
|
||||
}
|
||||
|
||||
return TrimConfig{
|
||||
InputFile: inputFile,
|
||||
OutputFile: outputFile,
|
||||
ReportFile: reportFile,
|
||||
Mode: mode,
|
||||
Selector: selector,
|
||||
OutputSchema: outputSchema,
|
||||
AllowEmpty: opts.AllowEmpty,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func parseModuleList(value string) ([]string, error) {
|
||||
value = strings.TrimSpace(value)
|
||||
if value == "" {
|
||||
|
||||
Reference in New Issue
Block a user