/
results.go
132 lines (113 loc) · 3.38 KB
/
results.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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package messages
import (
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/pagination"
)
// commonResult is the response of a base result.
type commonResult struct {
gophercloud.Result
}
// CreateResult is the response of a Create operations.
type CreateResult struct {
gophercloud.Result
}
// MessagePage contains a single page of all clusters from a ListDetails call.
type MessagePage struct {
pagination.LinkedPageBase
}
// DeleteResult is the result from a Delete operation. Call its ExtractErr
// method to determine if the call succeeded or failed.
type DeleteResult struct {
gophercloud.ErrResult
}
// CreateResult is the response of a Create operations.
type PopResult struct {
gophercloud.Result
}
// GetMessagesResult is the response of a GetMessages operations.
type GetMessagesResult struct {
gophercloud.Result
}
// GetResult is the response of a Get operations.
type GetResult struct {
gophercloud.Result
}
// Message represents a message on a queue.
type Message struct {
Body map[string]interface{} `json:"body"`
Age int `json:"age"`
Href string `json:"href"`
ID string `json:"id"`
TTL int `json:"ttl"`
Checksum string `json:"checksum"`
}
// PopMessage represents a message returned from PopMessages.
type PopMessage struct {
Body map[string]interface{} `json:"body"`
Age int `json:"age"`
ID string `json:"id"`
TTL int `json:"ttl"`
ClaimCount int `json:"claim_count"`
ClaimID string `json:"claim_id"`
}
// ResourceList represents the result of creating a message.
type ResourceList struct {
Resources []string `json:"resources"`
}
// Extract interprets any CreateResult as a ResourceList.
func (r CreateResult) Extract() (ResourceList, error) {
var s ResourceList
err := r.ExtractInto(&s)
return s, err
}
// Extract interprets any PopResult as a list of PopMessage.
func (r PopResult) Extract() ([]PopMessage, error) {
var s struct {
PopMessages []PopMessage `json:"messages"`
}
err := r.ExtractInto(&s)
return s.PopMessages, err
}
// Extract interprets any GetMessagesResult as a list of Message.
func (r GetMessagesResult) Extract() ([]Message, error) {
var s struct {
Messages []Message `json:"messages"`
}
err := r.ExtractInto(&s)
return s.Messages, err
}
// Extract interprets any GetResult as a Message.
func (r GetResult) Extract() (Message, error) {
var s Message
err := r.ExtractInto(&s)
return s, err
}
// ExtractMessage extracts message into a list of Message.
func ExtractMessages(r pagination.Page) ([]Message, error) {
var s struct {
Messages []Message `json:"messages"`
}
err := (r.(MessagePage)).ExtractInto(&s)
return s.Messages, err
}
// IsEmpty determines if a MessagePage contains any results.
func (r MessagePage) IsEmpty() (bool, error) {
s, err := ExtractMessages(r)
return len(s) == 0, err
}
// NextPageURL uses the response's embedded link reference to navigate to the
// next page of results.
func (r MessagePage) NextPageURL() (string, error) {
var s struct {
Links []gophercloud.Link `json:"links"`
}
err := r.ExtractInto(&s)
if err != nil {
return "", err
}
next, err := gophercloud.ExtractNextURL(s.Links)
if err != nil {
return "", err
}
return nextPageURL(r.URL.String(), next)
}