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 }