Files
compress/internal/interface/controllers/cli_controller.go
Dmitriy Fofanov eee9a4a093 Добавлены скрипты сборки для кроссплатформенных двоичных файлов и лицензия GPL.
- Добавлен файл LICENSE с лицензией GNU General Public License версии 3.0.
- Создан скрипт PowerShell (build-all.ps1) для сборки двоичных файлов Windows и Linux из Windows с использованием кросс-компиляции.
- Разработан скрипт сборки Linux (build-linux.sh) для сборки двоичных файлов Linux.
- Реализован скрипт PowerShell (build-windows.ps1) для сборки двоичных файлов Windows.
- Каждый скрипт сборки включает упаковку и генерацию контрольной суммы SHA256 для двоичных файлов.
2025-11-05 13:05:49 +03:00

159 lines
6.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package controllers
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"compress/internal/domain/entities"
usecases "compress/internal/usecase"
)
// CLIController контроллер для командной строки
//
// ⚠️ DEPRECATED / LEGACY CODE ⚠️
//
// Данный контроллер НЕ используется в текущей версии приложения.
// Приложение использует только TUI интерфейс (internal/presentation/tui/manager.go).
// Сохранен для возможной будущей поддержки CLI режима или миграции на cobra/viper.
//
// Рекомендация: при необходимости CLI использовать флаги в main.go вместо этого контроллера.
type CLIController struct {
compressPDFUseCase *usecases.CompressPDFUseCase
compressDirectoryUseCase *usecases.CompressDirectoryUseCase
}
// NewCLIController создает новый CLI контроллер
func NewCLIController(
compressPDFUseCase *usecases.CompressPDFUseCase,
compressDirectoryUseCase *usecases.CompressDirectoryUseCase,
) *CLIController {
return &CLIController{
compressPDFUseCase: compressPDFUseCase,
compressDirectoryUseCase: compressDirectoryUseCase,
}
}
// HandleSingleFile обрабатывает сжатие одного файла
func (c *CLIController) HandleSingleFile(inputPath, outputPath string) error {
fmt.Println("🔥 Compress - Сжатие файлов")
fmt.Println("====================================")
// Запрашиваем уровень сжатия
compressionLevel := c.askForCompressionLevel()
fmt.Printf("\n🚀 Начинаем сжатие файла: %s\n", inputPath)
// Выполняем сжатие
result, err := c.compressPDFUseCase.Execute(inputPath, outputPath, compressionLevel)
if err != nil {
return fmt.Errorf("ошибка сжатия: %w", err)
}
// Показываем результаты
c.showCompressionResult(result, outputPath)
return nil
}
// HandleDirectory обрабатывает сжатие директории
func (c *CLIController) HandleDirectory(inputDir, outputDir string) error {
fmt.Println("🔥 Compress - Сжатие директории файлов")
fmt.Println("================================================")
// Запрашиваем уровень сжатия
compressionLevel := c.askForCompressionLevel()
fmt.Printf("\n🚀 Начинаем сжатие директории: %s\n", inputDir)
// Выполняем сжатие
result, err := c.compressDirectoryUseCase.Execute(inputDir, outputDir, compressionLevel)
if err != nil {
return fmt.Errorf("ошибка сжатия директории: %w", err)
}
// Показываем результаты
c.showDirectoryResult(result)
return nil
}
// askForCompressionLevel запрашивает уровень сжатия у пользователя
func (c *CLIController) askForCompressionLevel() int {
reader := bufio.NewReader(os.Stdin)
fmt.Println("\n🎯 Выберите уровень сжатия:")
fmt.Println("10-20%: Слабое сжатие (высокое качество)")
fmt.Println("21-40%: Умеренное сжатие (хорошее качество)")
fmt.Println("41-60%: Среднее сжатие (среднее качество)")
fmt.Println("61-80%: Высокое сжатие (низкое качество)")
fmt.Println("81-90%: Максимальное сжатие (очень низкое качество)")
for {
fmt.Print("\nВведите процент сжатия (10-90): ")
input, err := reader.ReadString('\n')
if err != nil {
fmt.Println("❌ Ошибка ввода")
continue
}
input = strings.TrimSpace(input)
level, err := strconv.Atoi(input)
if err != nil {
fmt.Println("❌ Введите число")
continue
}
if level < 10 || level > 90 {
fmt.Println("❌ Уровень сжатия должен быть от 10 до 90")
continue
}
return level
}
}
// showCompressionResult показывает результат сжатия файла
func (c *CLIController) showCompressionResult(result *entities.CompressionResult, outputPath string) {
fmt.Println("\n📊 Результаты сжатия:")
fmt.Printf("Исходный размер: %.2f MB\n", float64(result.OriginalSize)/1024/1024)
fmt.Printf("Сжатый размер: %.2f MB\n", float64(result.CompressedSize)/1024/1024)
fmt.Printf("Сжатие: %.1f%%\n", result.CompressionRatio)
fmt.Printf("Сэкономлено: %.2f MB\n", float64(result.SavedSpace)/1024/1024)
if result.IsEffective() {
fmt.Println("✅ Сжатие выполнено успешно!")
} else {
fmt.Println("⚠️ Файл не был сжат (возможно, уже оптимизирован)")
}
fmt.Printf("\n🎉 Готово! Сжатый файл сохранен как: %s\n", outputPath)
}
// showDirectoryResult показывает результат сжатия директории
func (c *CLIController) showDirectoryResult(result *usecases.DirectoryCompressionResult) {
fmt.Printf("\n📊 Результаты сжатия директории:\n")
fmt.Printf("Всего файлов: %d\n", result.TotalFiles)
fmt.Printf("Успешно сжато: %d\n", result.SuccessCount)
fmt.Printf("Ошибок: %d\n", result.FailedCount)
// Показываем статистику по каждому файлу
for i, fileResult := range result.Results {
fmt.Printf("\n[%d] Сжатие: %.1f%%, Сэкономлено: %.2f MB\n",
i+1, fileResult.CompressionRatio, float64(fileResult.SavedSpace)/1024/1024)
}
// Показываем ошибки, если есть
if len(result.Errors) > 0 {
fmt.Println("\n❌ Ошибки:")
for i, err := range result.Errors {
fmt.Printf("[%d] %v\n", i+1, err)
}
}
fmt.Printf("\n🎉 Обработка завершена! Успешно сжато: %d/%d файлов\n",
result.SuccessCount, result.TotalFiles)
}