(Feat): Initial Commit
This commit is contained in:
143
internal/ui/compress.go
Normal file
143
internal/ui/compress.go
Normal file
@@ -0,0 +1,143 @@
|
||||
package ui
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"zipprine/internal/archiver"
|
||||
"zipprine/internal/models"
|
||||
|
||||
"github.com/charmbracelet/huh"
|
||||
)
|
||||
|
||||
func RunCompressFlow() error {
|
||||
config := &models.CompressConfig{}
|
||||
|
||||
var sourcePath, outputPath string
|
||||
var archiveTypeStr string
|
||||
var excludeInput, includeInput string
|
||||
var verify bool
|
||||
var compressionLevel string
|
||||
|
||||
form := huh.NewForm(
|
||||
huh.NewGroup(
|
||||
huh.NewInput().
|
||||
Title("📁 Source Path").
|
||||
Description("Enter the path to compress (file or directory)").
|
||||
Placeholder("/path/to/source").
|
||||
Value(&sourcePath).
|
||||
Validate(func(s string) error {
|
||||
if s == "" {
|
||||
return fmt.Errorf("source path cannot be empty")
|
||||
}
|
||||
if _, err := os.Stat(s); os.IsNotExist(err) {
|
||||
return fmt.Errorf("path does not exist")
|
||||
}
|
||||
return nil
|
||||
}),
|
||||
|
||||
huh.NewInput().
|
||||
Title("💾 Output Path").
|
||||
Description("Where to save the archive").
|
||||
Placeholder("/path/to/output.zip").
|
||||
Value(&outputPath).
|
||||
Validate(func(s string) error {
|
||||
if s == "" {
|
||||
return fmt.Errorf("output path cannot be empty")
|
||||
}
|
||||
return nil
|
||||
}).Suggestions([]string{".zip", ".tar.gz", ".tar", ".gz"}),
|
||||
),
|
||||
|
||||
huh.NewGroup(
|
||||
huh.NewSelect[string]().
|
||||
Title("🎨 Archive Type").
|
||||
Description("Choose your compression format").
|
||||
Options(
|
||||
huh.NewOption("ZIP - Universal & Compatible 📦", "ZIP"),
|
||||
huh.NewOption("TAR.GZ - Linux Classic (Best Compression) 🐧", "TARGZ"),
|
||||
huh.NewOption("TAR - No Compression 📄", "TAR"),
|
||||
huh.NewOption("GZIP - Single File Compression 🔧", "GZIP"),
|
||||
).
|
||||
Value(&archiveTypeStr),
|
||||
|
||||
huh.NewSelect[string]().
|
||||
Title("⚡ Compression Level").
|
||||
Description("Higher = smaller but slower").
|
||||
Options(
|
||||
huh.NewOption("Fast (Level 1)", "1"),
|
||||
huh.NewOption("Balanced (Level 5)", "5"),
|
||||
huh.NewOption("Best (Level 9)", "9"),
|
||||
).
|
||||
Value(&compressionLevel),
|
||||
),
|
||||
|
||||
huh.NewGroup(
|
||||
huh.NewText().
|
||||
Title("🚫 Exclude Patterns").
|
||||
Description("Comma-separated patterns to exclude (e.g., *.log,node_modules,*.tmp)").
|
||||
Placeholder("*.log,temp/*,.git,__pycache__").
|
||||
Value(&excludeInput),
|
||||
|
||||
huh.NewText().
|
||||
Title("✅ Include Patterns").
|
||||
Description("Comma-separated patterns to include (leave empty for all)").
|
||||
Placeholder("*.go,*.md,src/*").
|
||||
Value(&includeInput),
|
||||
),
|
||||
|
||||
huh.NewGroup(
|
||||
huh.NewConfirm().
|
||||
Title("🔐 Verify Archive Integrity").
|
||||
Description("Check the archive after creation?").
|
||||
Value(&verify).
|
||||
Affirmative("Yes please!").
|
||||
Negative("Skip it"),
|
||||
),
|
||||
).WithTheme(huh.ThemeCatppuccin())
|
||||
|
||||
if err := form.Run(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
config.SourcePath = sourcePath
|
||||
config.OutputPath = outputPath
|
||||
config.ArchiveType = models.ArchiveType(archiveTypeStr)
|
||||
config.VerifyIntegrity = verify
|
||||
fmt.Sscanf(compressionLevel, "%d", &config.CompressionLevel)
|
||||
|
||||
if excludeInput != "" {
|
||||
config.ExcludePaths = strings.Split(excludeInput, ",")
|
||||
for i := range config.ExcludePaths {
|
||||
config.ExcludePaths[i] = strings.TrimSpace(config.ExcludePaths[i])
|
||||
}
|
||||
}
|
||||
|
||||
if includeInput != "" {
|
||||
config.IncludePaths = strings.Split(includeInput, ",")
|
||||
for i := range config.IncludePaths {
|
||||
config.IncludePaths[i] = strings.TrimSpace(config.IncludePaths[i])
|
||||
}
|
||||
}
|
||||
|
||||
fmt.Println()
|
||||
fmt.Println(InfoStyle.Render("🎯 Starting compression..."))
|
||||
|
||||
if err := archiver.Compress(config); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
fmt.Println(SuccessStyle.Render("✅ Archive created successfully!"))
|
||||
|
||||
if config.VerifyIntegrity {
|
||||
fmt.Println(InfoStyle.Render("🔍 Verifying archive integrity..."))
|
||||
info, err := archiver.Analyze(config.OutputPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
displayArchiveInfo(info)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user