@@ -95,20 +95,49 @@ func OptObjectTime(t time.Time) DescriptorInputOpt {
95
95
96
96
type unexpectedDataTypeError struct {
97
97
got DataType
98
- want DataType
98
+ want [] DataType
99
99
}
100
100
101
101
func (e * unexpectedDataTypeError ) Error () string {
102
- return fmt .Sprintf ("unexpected data type %v, expected %v" , e .got , e .want )
102
+ return fmt .Sprintf ("unexpected data type %v, expected one of: %v" , e .got , e .want )
103
103
}
104
104
105
105
func (e * unexpectedDataTypeError ) Is (target error ) bool {
106
106
t , ok := target .(* unexpectedDataTypeError )
107
107
if ! ok {
108
108
return false
109
109
}
110
- return (e .got == t .got || t .got == 0 ) &&
111
- (e .want == t .want || t .want == 0 )
110
+
111
+ if len (t .want ) > 0 {
112
+ // Use a map to check that the "want" errors in e and t contain the same values, ignoring
113
+ // any ordering differences.
114
+ acc := make (map [DataType ]int , len (t .want ))
115
+
116
+ // Increment counter for each data type in e.
117
+ for _ , dt := range e .want {
118
+ if _ , ok := acc [dt ]; ! ok {
119
+ acc [dt ] = 0
120
+ }
121
+ acc [dt ]++
122
+ }
123
+
124
+ // Decrement counter for each data type in e.
125
+ for _ , dt := range t .want {
126
+ if _ , ok := acc [dt ]; ! ok {
127
+ return false
128
+ }
129
+ acc [dt ]--
130
+ }
131
+
132
+ // If the "want" errors in e and t are equivalent, all counters should be zero.
133
+ for _ , n := range acc {
134
+ if n != 0 {
135
+ return false
136
+ }
137
+ }
138
+ }
139
+
140
+ return (e .got == t .got || t .got == 0 )
112
141
}
113
142
114
143
// OptCryptoMessageMetadata sets metadata for a crypto message data object. The format type is set
@@ -118,7 +147,7 @@ func (e *unexpectedDataTypeError) Is(target error) bool {
118
147
func OptCryptoMessageMetadata (ft FormatType , mt MessageType ) DescriptorInputOpt {
119
148
return func (t DataType , opts * descriptorOpts ) error {
120
149
if got , want := t , DataCryptoMessage ; got != want {
121
- return & unexpectedDataTypeError {got , want }
150
+ return & unexpectedDataTypeError {got , [] DataType { want } }
122
151
}
123
152
124
153
m := cryptoMessage {
@@ -141,7 +170,7 @@ var errUnknownArchitcture = errors.New("unknown architecture")
141
170
func OptPartitionMetadata (fs FSType , pt PartType , arch string ) DescriptorInputOpt {
142
171
return func (t DataType , opts * descriptorOpts ) error {
143
172
if got , want := t , DataPartition ; got != want {
144
- return & unexpectedDataTypeError {got , want }
173
+ return & unexpectedDataTypeError {got , [] DataType { want } }
145
174
}
146
175
147
176
sifarch := getSIFArch (arch )
@@ -184,7 +213,7 @@ func sifHashType(h crypto.Hash) hashType {
184
213
func OptSignatureMetadata (ht crypto.Hash , fp []byte ) DescriptorInputOpt {
185
214
return func (t DataType , opts * descriptorOpts ) error {
186
215
if got , want := t , DataSignature ; got != want {
187
- return & unexpectedDataTypeError {got , want }
216
+ return & unexpectedDataTypeError {got , [] DataType { want } }
188
217
}
189
218
190
219
s := signature {
0 commit comments