(t reflect.Type, seen encodeFuncCache)
| 342 | } |
| 343 | |
| 344 | func encodeFuncStructOf(t reflect.Type, seen encodeFuncCache) encodeFunc { |
| 345 | enc := &structEncoder{ |
| 346 | fields: make([]structEncoderField, 0, t.NumField()), |
| 347 | } |
| 348 | encode := enc.encode |
| 349 | seen[t] = encode |
| 350 | |
| 351 | forEachStructField(t, nil, func(f structField) { |
| 352 | if f.flags.have(union) { |
| 353 | enc.union = true |
| 354 | } else { |
| 355 | enc.fields = append(enc.fields, structEncoderField{ |
| 356 | index: f.index, |
| 357 | id: f.id, |
| 358 | flags: f.flags, |
| 359 | typ: TypeOf(f.typ), |
| 360 | encode: encodeFuncStructFieldOf(f, seen), |
| 361 | }) |
| 362 | } |
| 363 | }) |
| 364 | |
| 365 | sort.SliceStable(enc.fields, func(i, j int) bool { |
| 366 | return enc.fields[i].id < enc.fields[j].id |
| 367 | }) |
| 368 | |
| 369 | for i := len(enc.fields) - 1; i > 0; i-- { |
| 370 | if enc.fields[i-1].id == enc.fields[i].id { |
| 371 | panic(fmt.Errorf("thrift struct field id %d is present multiple times", enc.fields[i].id)) |
| 372 | } |
| 373 | } |
| 374 | |
| 375 | return encode |
| 376 | } |
| 377 | |
| 378 | func encodeFuncStructFieldOf(f structField, seen encodeFuncCache) encodeFunc { |
| 379 | if f.flags.have(enum) { |
no test coverage detected
searching dependent graphs…