github.com/caos/orbos@v1.5.14-0.20221103111702-e6cd0cea7ad4/internal/executables/download.go (about) 1 package executables 2 3 import ( 4 "fmt" 5 "net/http" 6 ) 7 8 type Downloadable struct { 9 Key string 10 URL string 11 Client *http.Client 12 } 13 14 func Download(downloadable ...Downloadable) <-chan PackableTuple { 15 return deriveFmapDownload(download, toDownloadableChan(downloadable)) 16 } 17 18 func download(dl Downloadable) (pt PackableTuple) { 19 defer func() { 20 if _, err := pt(); err != nil { 21 fmt.Printf("Downloading %s from %s failed\n", dl.Key, dl.URL) 22 return 23 } 24 fmt.Printf("Successfully downloaded %s from %s\n", dl.Key, dl.URL) 25 }() 26 27 resp, err := dl.Client.Get(dl.URL) 28 if err != nil { 29 resp.Body.Close() 30 return deriveTuplePackable(nil, err) 31 } 32 33 return deriveTuplePackable(&packable{ 34 key: dl.Key, 35 data: resp.Body, 36 }, nil) 37 } 38 39 func toDownloadableChan(downloadable []Downloadable) <-chan Downloadable { 40 dlChan := make(chan Downloadable, 0) 41 go func() { 42 for _, bin := range downloadable { 43 dlChan <- bin 44 } 45 close(dlChan) 46 }() 47 return dlChan 48 }