You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

89 lines
2.3 KiB

package core
import (
"fmt"
"os"
"path/filepath"
"strings"
)
// Validate checks that cfg is coherent and all paths exist.
// Returns a human-readable error or nil.
func Validate(cfg *Config) error {
if cfg.InputDir == "" || cfg.OutputDir == "" {
return fmt.Errorf("source directory (-dir) and output directory (-out) are required")
}
if cfg.Width == 0 && cfg.Height == 0 {
return fmt.Errorf("at least one of -width or -height must be specified")
}
if cfg.Width < 0 || cfg.Height < 0 {
return fmt.Errorf("dimensions cannot be negative")
}
if cfg.Quality < 1 || cfg.Quality > 100 {
return fmt.Errorf("quality must be between 1 and 100")
}
if cfg.Format != "" &&
cfg.Format != "jpg" && cfg.Format != "jpeg" &&
cfg.Format != "png" &&
cfg.Format != "tif" && cfg.Format != "tiff" {
return fmt.Errorf("unsupported output format: %s (options: jpg, png, tif)", cfg.Format)
}
absInput, err := filepath.Abs(cfg.InputDir)
if err != nil {
return fmt.Errorf("error resolving source path: %v", err)
}
absOutput, err := filepath.Abs(cfg.OutputDir)
if err != nil {
return fmt.Errorf("error resolving output path: %v", err)
}
if absInput == absOutput && cfg.Prefix == "" && cfg.Suffix == "" &&
cfg.TSFile == "" && !cfg.B64Enabled {
return fmt.Errorf(
"input and output directories cannot be the same\n" +
" hint: use -prefix, -suffix, -b64 or -ts to avoid overwriting originals")
}
if _, err := os.Stat(cfg.InputDir); os.IsNotExist(err) {
return fmt.Errorf("source directory does not exist: %s", cfg.InputDir)
}
if cfg.Workers < 1 {
cfg.Workers = 1
}
for _, raw := range []string{cfg.Replace, cfg.ReplaceI, cfg.ReplaceP} {
if raw == "" {
continue
}
for _, pair := range strings.Split(raw, ",") {
parts := strings.SplitN(pair, "/", 2)
if len(parts) != 2 || parts[0] == "" {
return fmt.Errorf("invalid replacement pair %q — expected: old/new", pair)
}
}
}
if cfg.FileFilter != "" {
if _, err := filepath.Match(cfg.FileFilter, ""); err != nil {
return fmt.Errorf("invalid -filter pattern %q: %v", cfg.FileFilter, err)
}
}
if cfg.Lowercase && cfg.Uppercase {
return fmt.Errorf("-lowercase and -uppercase are mutually exclusive")
}
if cfg.B64Enabled && cfg.TSFile != "" {
return fmt.Errorf("-b64 and -ts are mutually exclusive")
}
return nil
}

Powered by TurnKey Linux.