Files
compress/cmd/main.go
Dmitriy Fofanov ec65cfd05a Достижение: Добавлены скрипты и документация для релиза PDF Compressor.
- Добавлен release-body.md для подробных заметок о релизе на русском языке.
- Реализован release-gitea.ps1 для автоматизированного релиза Gitea с помощью PowerShell.
- Создан release-gitea.sh для автоматизированного релиза Gitea с помощью Bash.
- Добавлен release.sh для сборки и маркировки релизов с поддержкой нескольких платформ.
- Улучшен пользовательский интерфейс благодаря информативному логированию и обработке ошибок.
- Добавлена ​​поддержка переменных окружения и управления конфигурацией.
- Добавлена ​​функция создания архивов и загрузки ресурсов в Gitea.
2025-11-05 09:33:12 +03:00

110 lines
3.3 KiB
Go

package main
import (
"log"
"compressor/internal/domain/entities"
"compressor/internal/domain/repositories"
"compressor/internal/infrastructure/compressors"
"compressor/internal/infrastructure/config"
"compressor/internal/infrastructure/logging"
infraRepos "compressor/internal/infrastructure/repositories"
"compressor/internal/presentation/tui"
usecases "compressor/internal/usecase"
)
func main() {
// Загрузка конфигурации
configRepo := config.NewRepository()
appConfig, err := configRepo.Load("config.yaml")
if err != nil {
log.Fatalf("Ошибка загрузки конфигурации: %v", err)
}
// Инициализация базового логгера (в файл)
fileLogger, err := logging.NewFileLogger(
appConfig.Output.LogFileName,
appConfig.Output.LogLevel,
appConfig.Output.LogMaxSizeMB,
appConfig.Output.LogToFile,
)
if err != nil {
log.Printf("Предупреждение: не удалось инициализировать логгер: %v", err)
}
if fileLogger != nil {
defer fileLogger.Close()
}
// Инициализация TUI
tuiManager := tui.NewManager()
tuiManager.Initialize()
// Оборачиваем логгер адаптером, чтобы видеть логи в TUI
var logger repositories.Logger
logger = tui.NewUILogger(fileLogger, tuiManager)
// Инициализация репозиториев
fileRepo := infraRepos.NewFileSystemRepository()
compressionConfigRepo := infraRepos.NewConfigRepository()
// Выбираем компрессор на основе конфигурации
var compressor repositories.PDFCompressor
switch appConfig.Compression.Algorithm {
case "unipdf":
compressor = compressors.NewUniPDFCompressor()
default:
compressor = compressors.NewPDFCPUCompressor()
}
// Инициализация компрессора изображений
imageCompressor := compressors.NewImageCompressor()
// Инициализация use cases
processUseCase := usecases.NewProcessPDFsUseCase(
compressor,
fileRepo,
compressionConfigRepo,
logger,
)
imageUseCase := usecases.NewCompressImageUseCase(logger, imageCompressor)
// Создаем объединенный процессор для всех типов файлов
allFilesUseCase := usecases.NewProcessAllFilesUseCase(processUseCase, imageUseCase, logger)
// Подключаем репортер прогресса к TUI
processUseCase.SetProgressReporter(func(s entities.ProcessingStatus) {
tuiManager.SendStatusUpdate(s)
})
// Создание процессора для обработки команд
processor := NewApplicationProcessor(
processUseCase,
allFilesUseCase,
appConfig,
tuiManager,
logger,
)
defer processor.Shutdown()
// Привязываем запуск обработки к TUI
tuiManager.SetOnStartProcessing(func() {
// Получаем актуальную конфигурацию из TUI
processor.config = tuiManager.GetConfig()
go processor.StartProcessing()
})
// Автозапуск, если включен в конфигурации
if appConfig.Compression.AutoStart {
go processor.StartProcessing()
}
// Запуск TUI
if err := tuiManager.Run(); err != nil {
log.Fatalf("Ошибка запуска TUI: %v", err)
}
// Cleanup при выходе
tuiManager.Cleanup()
}