- Добавлен release-body.md для подробных заметок о релизе на русском языке. - Реализован release-gitea.ps1 для автоматизированного релиза Gitea с помощью PowerShell. - Создан release-gitea.sh для автоматизированного релиза Gitea с помощью Bash. - Добавлен release.sh для сборки и маркировки релизов с поддержкой нескольких платформ. - Улучшен пользовательский интерфейс благодаря информативному логированию и обработке ошибок. - Добавлена поддержка переменных окружения и управления конфигурацией. - Добавлена функция создания архивов и загрузки ресурсов в Gitea.
110 lines
3.3 KiB
Go
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()
|
|
}
|