54 lines
1.4 KiB
Go
54 lines
1.4 KiB
Go
package remove
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/rogeecn/renamer/internal/listing"
|
|
)
|
|
|
|
// Request encapsulates the options required for remove operations.
|
|
// It mirrors the listing scope so preview/apply flows stay consistent.
|
|
type Request struct {
|
|
WorkingDir string
|
|
Tokens []string
|
|
IncludeDirectories bool
|
|
Recursive bool
|
|
IncludeHidden bool
|
|
Extensions []string
|
|
}
|
|
|
|
// FromListing builds a Request from the shared listing scope plus ordered tokens.
|
|
func FromListing(scope *listing.ListingRequest, tokens []string) (*Request, error) {
|
|
if scope == nil {
|
|
return nil, fmt.Errorf("scope must not be nil")
|
|
}
|
|
req := &Request{
|
|
WorkingDir: scope.WorkingDir,
|
|
IncludeDirectories: scope.IncludeDirectories,
|
|
Recursive: scope.Recursive,
|
|
IncludeHidden: scope.IncludeHidden,
|
|
Extensions: append([]string(nil), scope.Extensions...),
|
|
Tokens: append([]string(nil), tokens...),
|
|
}
|
|
if err := req.Validate(); err != nil {
|
|
return nil, err
|
|
}
|
|
return req, nil
|
|
}
|
|
|
|
// Validate ensures the request has the required data before traversal happens.
|
|
func (r *Request) Validate() error {
|
|
if r.WorkingDir == "" {
|
|
return fmt.Errorf("working directory must be provided")
|
|
}
|
|
if len(r.Tokens) == 0 {
|
|
return fmt.Errorf("at least one removal token is required")
|
|
}
|
|
for i, token := range r.Tokens {
|
|
if token == "" {
|
|
return fmt.Errorf("token at position %d is empty", i)
|
|
}
|
|
}
|
|
return nil
|
|
}
|