-
Notifications
You must be signed in to change notification settings - Fork 9
/
option.go
121 lines (105 loc) · 3.59 KB
/
option.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
// Package option provides adapters to change a parameter in SQS request.
package option
import (
"strconv"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/service/sqs"
"github.com/aws/aws-sdk-go-v2/service/sqs/types"
)
// The DataType is a type of data used in Attributes and Message Attributes.
const (
DataTypeString = "String"
DataTypeNumber = "Number"
DataTypeBinary = "Binary"
)
// The ReceiveMessageInput type is an adapter to change a parameter in
// sqs.ReceiveMessageInput.
type ReceiveMessageInput func(req *sqs.ReceiveMessageInput)
// VisibilityTimeout returns a ReceiveMessageInput that changes a message visibility timeout.
func VisibilityTimeout(timeout int32) ReceiveMessageInput {
return func(req *sqs.ReceiveMessageInput) {
req.VisibilityTimeout = timeout
}
}
// MaxNumberOfMessages returns a ReceiveMessageInput that
// changes a max number of messages to receive to n.
func MaxNumberOfMessages(n int32) ReceiveMessageInput {
return func(req *sqs.ReceiveMessageInput) {
req.MaxNumberOfMessages = n
}
}
// WaitTimeSeconds returns a ReceiveMessageInput that
// changes WaitTimeSeconds parameter.
func WaitTimeSeconds(n int32) ReceiveMessageInput {
return func(req *sqs.ReceiveMessageInput) {
req.WaitTimeSeconds = n
}
}
// UseAllAttribute returns a ReceiveMessageInput that
// changes a parameter to receive all messages regardless of attributes.
func UseAllAttribute() ReceiveMessageInput {
return UseAttributes("All")
}
// UseAttributes returns a ReceiveMessageInput that
// changes AttributeNames and MessageAttributeNames to attr.
func UseAttributes(attr ...string) ReceiveMessageInput {
return func(req *sqs.ReceiveMessageInput) {
for i := range attr {
req.AttributeNames = append(req.AttributeNames, types.QueueAttributeName(attr[i]))
}
req.MessageAttributeNames = attr
}
}
// The SendMessageInput type is an adapter to change a parameter in
// sqs.SendMessageInput.
type SendMessageInput func(req *sqs.SendMessageInput)
// DelaySeconds returns a SendMessageInput that changes DelaySeconds to delay in seconds.
func DelaySeconds(delay int32) SendMessageInput {
return func(req *sqs.SendMessageInput) {
req.DelaySeconds = delay
}
}
// MessageAttributes returns a SendMessageInput that changes MessageAttributes to attrs.
// A string value in attrs sets to DataTypeString.
// A []byte value in attrs sets to DataTypeBinary.
// A int and int64 value in attrs sets to DataTypeNumber. Other types cause panicking.
func MessageAttributes(attrs map[string]interface{}) SendMessageInput {
return func(req *sqs.SendMessageInput) {
if len(attrs) == 0 {
return
}
ret := make(map[string]types.MessageAttributeValue)
for n, v := range attrs {
ret[n] = MessageAttributeValue(v)
}
req.MessageAttributes = ret
}
}
// MessageAttributeValue returns a appropriate sqs.MessageAttributeValue by type assersion of v.
// Types except string, []byte, int64 and int cause panicking.
func MessageAttributeValue(v interface{}) types.MessageAttributeValue {
switch vv := v.(type) {
case string:
return types.MessageAttributeValue{
DataType: aws.String(DataTypeString),
StringValue: aws.String(vv),
}
case []byte:
return types.MessageAttributeValue{
DataType: aws.String(DataTypeBinary),
BinaryValue: vv,
}
case int64:
return types.MessageAttributeValue{
DataType: aws.String(DataTypeNumber),
StringValue: aws.String(strconv.FormatInt(vv, 10)),
}
case int:
return types.MessageAttributeValue{
DataType: aws.String(DataTypeNumber),
StringValue: aws.String(strconv.FormatInt(int64(vv), 10)),
}
default:
panic("sqs: unsupported type")
}
}