(t Type, f FieldNumber, j json.RawMessage, rules ...RewriterRules)
| 391 | } |
| 392 | |
| 393 | func parseRewriteTemplateStruct(t Type, f FieldNumber, j json.RawMessage, rules ...RewriterRules) (Rewriter, error) { |
| 394 | template := map[string]json.RawMessage{} |
| 395 | |
| 396 | if err := json.Unmarshal(j, &template); err != nil { |
| 397 | return nil, err |
| 398 | } |
| 399 | |
| 400 | fieldsByName := map[string]Field{} |
| 401 | |
| 402 | for i := range t.NumField() { |
| 403 | f := t.Field(i) |
| 404 | fieldsByName[f.Name] = f |
| 405 | } |
| 406 | |
| 407 | message := MessageRewriter{} |
| 408 | rewriters := []Rewriter{} |
| 409 | |
| 410 | for k, v := range template { |
| 411 | f, ok := fieldsByName[k] |
| 412 | if !ok { |
| 413 | return nil, fmt.Errorf("rewrite template contained an invalid field named %q", k) |
| 414 | } |
| 415 | |
| 416 | var fields []json.RawMessage |
| 417 | if f.Repeated { |
| 418 | if err := json.Unmarshal(v, &fields); err != nil { |
| 419 | return nil, err |
| 420 | } |
| 421 | } else { |
| 422 | fields = []json.RawMessage{v} |
| 423 | } |
| 424 | |
| 425 | var rule any |
| 426 | for i := range rules { |
| 427 | if r, ok := rules[i][f.Name]; ok { |
| 428 | rule = r |
| 429 | break |
| 430 | } |
| 431 | } |
| 432 | |
| 433 | rewriters = rewriters[:0] |
| 434 | |
| 435 | for _, v := range fields { |
| 436 | rw, err := parseRewriteTemplate(f.Type, f.Number, v, rule) |
| 437 | if err != nil { |
| 438 | return nil, fmt.Errorf("%s: %w", k, err) |
| 439 | } |
| 440 | if rw != nil { |
| 441 | rewriters = append(rewriters, rw) |
| 442 | } |
| 443 | } |
| 444 | |
| 445 | if cap(message) <= int(f.Number) { |
| 446 | m := make(MessageRewriter, f.Number+1) |
| 447 | copy(m, message) |
| 448 | message = m |
| 449 | } |
| 450 |
no test coverage detected
searching dependent graphs…