From 14f115fbe083d7fcafc276b35687150461ddb56d Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Fri, 13 Jun 2025 17:28:26 +0300 Subject: [PATCH] Add command line flags --- main.go | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/main.go b/main.go index b5fff82..70bc99a 100644 --- a/main.go +++ b/main.go @@ -2,6 +2,7 @@ package main import ( "encoding/json" + "flag" "fmt" "io" "net/http" @@ -12,18 +13,28 @@ import ( ) // HTTP клиент с таймаутом -var httpClient = &http.Client{ - Timeout: 30 * time.Second, -} +var httpClient *http.Client func main() { - if len(os.Args) != 3 { + timeout := flag.Duration("t", 60*time.Second, "request timeout") + retries := flag.Int("r", 5, "number of download attempts") + jobs := flag.Int("j", 5, "concurrent downloads") + + flag.Parse() + + args := flag.Args() + + if len(args) != 2 { fmt.Println("Usage: program ") os.Exit(1) } - jsonFile := os.Args[1] - outputDir := os.Args[2] + jsonFile := args[0] + outputDir := args[1] + + httpClient = &http.Client{ + Timeout: *timeout, + } // Создаем директорию для загрузок if err := os.MkdirAll(outputDir, 0755); err != nil { @@ -46,7 +57,7 @@ func main() { } // Семафор для ограничения параллелизма - sem := make(chan struct{}, 5) + sem := make(chan struct{}, *jobs) var wg sync.WaitGroup start := time.Now() @@ -59,7 +70,7 @@ func main() { defer func() { <-sem }() // Освобождаем слот filename := filepath.Join(outputDir, fmt.Sprintf("image_%06d%s", idx, fileExtension(url))) - if err := downloadImage(url, filename); err != nil { + if err := downloadImage(url, filename, *retries); err != nil { fmt.Printf("Error downloading %s: %v\n", url, err) } else { fmt.Printf("Downloaded %s -> %s\n", url, filename) @@ -92,8 +103,7 @@ func fileExtension(url string) string { } // Скачиваем и сохраняем изображение -func downloadImage(url, filename string) error { - const maxRetries = 3 +func downloadImage(url, filename string, maxRetries int) error { const retryDelay = 1 * time.Second var lastErr error