Fork channel

Create a new channel as a copy of main.

Rename channel

Rename main to:

Delete channel

Delete main? This cannot be undone.

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
}