feat: add list command with global filters

This commit is contained in:
Rogee
2025-10-29 16:08:46 +08:00
parent 88563d48e2
commit fa57af8a26
29 changed files with 1892 additions and 25 deletions

102
internal/listing/options.go Normal file
View File

@@ -0,0 +1,102 @@
package listing
import (
"fmt"
"os"
"github.com/rogeecn/renamer/internal/filters"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
)
const (
flagPath = "path"
flagRecursive = "recursive"
flagIncludeDirs = "include-dirs"
flagHidden = "hidden"
flagExtensions = "extensions"
)
// RegisterScopeFlags defines persistent flags that scope listing, preview, and rename operations.
func RegisterScopeFlags(flags *pflag.FlagSet) {
flags.String(flagPath, "", "Directory to inspect (defaults to current working directory)")
flags.BoolP(flagRecursive, "r", false, "Traverse subdirectories")
flags.BoolP(flagIncludeDirs, "d", false, "Include directories in results")
flags.Bool(flagHidden, false, "Include hidden files and directories")
flags.StringP(flagExtensions, "e", "", "Pipe-delimited list of extensions to include (e.g. .jpg|.png)")
}
// ScopeFromCmd builds a ListingRequest populated from scope flags on the provided command.
func ScopeFromCmd(cmd *cobra.Command) (*ListingRequest, error) {
path, err := getStringFlag(cmd, flagPath)
if err != nil {
return nil, err
}
if path == "" {
cwd, err := os.Getwd()
if err != nil {
return nil, err
}
path = cwd
}
recursive, err := getBoolFlag(cmd, flagRecursive)
if err != nil {
return nil, err
}
includeDirs, err := getBoolFlag(cmd, flagIncludeDirs)
if err != nil {
return nil, err
}
includeHidden, err := getBoolFlag(cmd, flagHidden)
if err != nil {
return nil, err
}
extRaw, err := getStringFlag(cmd, flagExtensions)
if err != nil {
return nil, err
}
extensions, err := filters.ParseExtensions(extRaw)
if err != nil {
return nil, err
}
req := &ListingRequest{
WorkingDir: path,
IncludeDirectories: includeDirs,
Recursive: recursive,
IncludeHidden: includeHidden,
Extensions: extensions,
Format: FormatTable,
}
if err := req.Validate(); err != nil {
return nil, err
}
return req, nil
}
func getStringFlag(cmd *cobra.Command, name string) (string, error) {
if f := cmd.Flags().Lookup(name); f != nil {
return cmd.Flags().GetString(name)
}
if f := cmd.InheritedFlags().Lookup(name); f != nil {
return cmd.InheritedFlags().GetString(name)
}
return "", fmt.Errorf("flag %s not defined", name)
}
func getBoolFlag(cmd *cobra.Command, name string) (bool, error) {
if f := cmd.Flags().Lookup(name); f != nil {
return cmd.Flags().GetBool(name)
}
if f := cmd.InheritedFlags().Lookup(name); f != nil {
return cmd.InheritedFlags().GetBool(name)
}
return false, fmt.Errorf("flag %s not defined", name)
}