@@ -192,7 +192,8 @@ var reservedKeys = map[string]struct{}{
192192}
193193
194194func isReserved (key string , val any ) bool {
195- if _ , ok := reservedKeys [key ]; ok {
195+ lk := strings .ToLower (key )
196+ if _ , ok := reservedKeys [lk ]; ok {
196197 if key == "translation" {
197198 return true
198199 }
@@ -214,62 +215,44 @@ func isMessage(v interface{}) (bool, error) {
214215 case nil , string :
215216 return true , nil
216217 case map [string ]interface {}:
217- reservedKeyCount := 0
218- for key := range reservedKeys {
219- val , ok := data [key ]
220- if ok && isReserved (key , val ) {
221- reservedKeyCount ++
218+ reservedKeys := make ([]string , 0 , len (reservedKeys ))
219+ unreservedKeys := make ([]string , 0 , len (data ))
220+ for k , v := range data {
221+ if isReserved (k , v ) {
222+ reservedKeys = append (reservedKeys , k )
223+ } else {
224+ unreservedKeys = append (unreservedKeys , k )
222225 }
223226 }
224- if reservedKeyCount == 0 {
225- return false , nil
226- }
227- if len (data ) > reservedKeyCount {
228- reservedKeys := make ([]string , 0 , reservedKeyCount )
229- unreservedKeys := make ([]string , 0 , len (data )- reservedKeyCount )
230- for k , v := range data {
231- if isReserved (k , v ) {
232- reservedKeys = append (reservedKeys , k )
233- } else {
234- unreservedKeys = append (unreservedKeys , k )
235- }
236- }
227+ hasReservedKeys := len (reservedKeys ) > 0
228+ if hasReservedKeys && len (unreservedKeys ) > 0 {
237229 return false , & mixedKeysError {
238230 reservedKeys : reservedKeys ,
239231 unreservedKeys : unreservedKeys ,
240232 }
241233 }
242- return true , nil
234+ return hasReservedKeys , nil
243235 case map [interface {}]interface {}:
244- reservedKeyCount := 0
245- for key := range reservedKeys {
246- val , ok := data [key ]
247- if ok && isReserved (key , val ) {
248- reservedKeyCount ++
236+ reservedKeys := make ([]string , 0 , len (reservedKeys ))
237+ unreservedKeys := make ([]string , 0 , len (data ))
238+ for key , v := range data {
239+ k , ok := key .(string )
240+ if ! ok {
241+ unreservedKeys = append (unreservedKeys , fmt .Sprintf ("%+v" , key ))
242+ } else if isReserved (k , v ) {
243+ reservedKeys = append (reservedKeys , k )
244+ } else {
245+ unreservedKeys = append (unreservedKeys , k )
249246 }
250247 }
251- if reservedKeyCount == 0 {
252- return false , nil
253- }
254- if len (data ) > reservedKeyCount {
255- reservedKeys := make ([]string , 0 , reservedKeyCount )
256- unreservedKeys := make ([]string , 0 , len (data )- reservedKeyCount )
257- for key , v := range data {
258- k , ok := key .(string )
259- if ! ok {
260- unreservedKeys = append (unreservedKeys , fmt .Sprintf ("%+v" , key ))
261- } else if isReserved (k , v ) {
262- reservedKeys = append (reservedKeys , k )
263- } else {
264- unreservedKeys = append (unreservedKeys , k )
265- }
266- }
248+ hasReservedKeys := len (reservedKeys ) > 0
249+ if hasReservedKeys && len (unreservedKeys ) > 0 {
267250 return false , & mixedKeysError {
268251 reservedKeys : reservedKeys ,
269252 unreservedKeys : unreservedKeys ,
270253 }
271254 }
272- return true , nil
255+ return hasReservedKeys , nil
273256 }
274257 return false , nil
275258}
0 commit comments