prepend.go
package cmd
import (
"encoding/json"
"flag"
"fmt"
"os"
"skraak/tools"
)
// RunPrepend handles the "prepend" subcommand
//
// JSON output schema:
//
// {
// "folder": string, // Target folder path
// "prefix": string, // Prefix that was prepended
// "recursive": bool, // Whether subfolders were included
// "dry_run": bool, // Whether this was a dry run
// "renamed": [ // Successfully renamed files
// {"old": string, "new": string}
// ],
// "skipped": [ // Skipped files
// {"file": string, "reason": string}
// ],
// "errors": [ // Failed renames
// {"file": string, "error": string}
// ]
// }
func RunPrepend(args []string) error {
fs := flag.NewFlagSet("prepend", flag.ExitOnError)
folder := fs.String("folder", "", "Target folder path (required)")
prefix := fs.String("prefix", "", "String to prepend to filenames (required)")
recursive := fs.Bool("recursive", false, "Include 1 level of subfolders")
dryRun := fs.Bool("dry-run", false, "Show what would be renamed without doing it")
fs.Usage = usagePrinter(fs,
"skraak prepend --folder <path> --prefix <string> [--recursive] [--dry-run]",
"Rename files by prepending a prefix.\n\n"+
"Target files:\n"+
" - *.wav, *.WAV (must start with datestring YYYYMMDD_HHMMSS)\n"+
" - *.wav.data, *.WAV.data (must start with datestring YYYYMMDD_HHMMSS)\n"+
" - log.txt (exact name, always renamed)",
"skraak prepend --folder ./recordings --prefix LOC001",
"skraak prepend --folder ./data --prefix SITE_A --recursive",
"skraak prepend --folder ./test --prefix TEST --dry-run",
)
if err := fs.Parse(args); err != nil {
return fmt.Errorf("parsing flags: %w", err)
}
if err := requireFlags(fs, map[string]any{"--folder": *folder, "--prefix": *prefix}); err != nil {
return err
}
output, err := tools.Prepend(tools.PrependInput{
Folder: *folder,
Prefix: *prefix,
Recursive: *recursive,
DryRun: *dryRun,
})
if err != nil {
return fmt.Errorf("prepend operation: %w", err)
}
enc := json.NewEncoder(os.Stdout)
enc.SetIndent("", " ")
if err := enc.Encode(output); err != nil {
return fmt.Errorf("encoding output: %w", err)
}
return nil
}