Encode takes an Encoder and turns it into bytes while potentially recording metrics.
(e encoder, metricRegistry metrics.Registry)
| 19 | |
| 20 | // Encode takes an Encoder and turns it into bytes while potentially recording metrics. |
| 21 | func encode(e encoder, metricRegistry metrics.Registry) ([]byte, error) { |
| 22 | if e == nil { |
| 23 | return nil, nil |
| 24 | } |
| 25 | |
| 26 | var prepEnc prepEncoder |
| 27 | var realEnc realEncoder |
| 28 | |
| 29 | err := e.encode(prepareFlexibleEncoder(&prepEnc, e)) |
| 30 | if err != nil { |
| 31 | return nil, err |
| 32 | } |
| 33 | |
| 34 | if prepEnc.length < 0 || prepEnc.length > int(MaxRequestSize) { |
| 35 | return nil, PacketEncodingError{fmt.Sprintf("invalid request size (%d)", prepEnc.length)} |
| 36 | } |
| 37 | |
| 38 | realEnc.raw = make([]byte, prepEnc.length) |
| 39 | realEnc.registry = metricRegistry |
| 40 | err = e.encode(prepareFlexibleEncoder(&realEnc, e)) |
| 41 | if err != nil { |
| 42 | return nil, err |
| 43 | } |
| 44 | |
| 45 | return realEnc.raw, nil |
| 46 | } |
| 47 | |
| 48 | // taggedFieldValue adapts an encode closure for encode(); tagged-field values |
| 49 | // are always compact-encoded, so it reports itself as flexible |