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
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
|
|
}
|