/
imageset.go
61 lines (52 loc) · 1.45 KB
/
imageset.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package ftapi
import ( "time"
"fmt"
"log" )
type ImageSet struct {
RawJSON *[]byte
Description string `json:"description"`
ID string `json:"id"`
Members []Image `json:"members"`
PublishedDate string `json:"publishedDate"`
RequestURL string `json:"requestUrl"`
Title string `json:"title"`
Type string `json:"type"`
}
func (c *Client) ImageSetByUUID(uuid string) (result *ImageSet, err error) {
url := "/content/" + uuid
return c.ImageSet(url)
}
func (c *Client) ImageSet(url string) (result *ImageSet, err error) {
result = &ImageSet{}
raw, err := c.FromURL(url, result)
result.RawJSON = raw
return result, err
}
func (c *Client) ImageSetMembers(imageset *ImageSet, timeout time.Duration) (result []*Image, err error) {
chImages := make(chan *Image)
for _, member := range imageset.Members {
log.Println(len(imageset.Members), "images to get:", member.ID, c)
go func(url string) {
image, err := c.Image(url)
if err != nil {
return
}
chImages <- image
}(member.ID)
}
images := []*Image{}
for {
select {
case image := <-chImages:
log.Println("Received:", image.ID)
images = append(images, image)
if len(images) == len(imageset.Members) {
return images, nil
}
case <-time.After(timeout):
if timeout > time.Duration(0) {
return nil, fmt.Errorf("Image retrieval timed out after %sms", timeout.String())
}
}
}
}