(r io.Reader, data interface{})
| 16 | var byteOrder = binary.LittleEndian |
| 17 | |
| 18 | func binaryRead(r io.Reader, data interface{}) (int, error) { |
| 19 | switch v := data.(type) { |
| 20 | case *int: |
| 21 | br, ok := r.(io.ByteReader) |
| 22 | if !ok { |
| 23 | return 0, fmt.Errorf("reader does not implement io.ByteReader") |
| 24 | } |
| 25 | |
| 26 | i, err := binary.ReadVarint(br) |
| 27 | if err != nil { |
| 28 | return 0, err |
| 29 | } |
| 30 | |
| 31 | *v = int(i) |
| 32 | // TODO: this will usually overshoot size. |
| 33 | return binary.MaxVarintLen64, nil |
| 34 | |
| 35 | case *string: |
| 36 | var ln int |
| 37 | _, err := binaryRead(r, &ln) |
| 38 | if err != nil { |
| 39 | return 0, err |
| 40 | } |
| 41 | |
| 42 | s := make([]byte, ln) |
| 43 | _, err = binaryRead(r, &s) |
| 44 | *v = string(s) |
| 45 | return len(s), err |
| 46 | |
| 47 | case *[]float32: |
| 48 | var ln int |
| 49 | _, err := binaryRead(r, &ln) |
| 50 | if err != nil { |
| 51 | return 0, err |
| 52 | } |
| 53 | |
| 54 | *v = make([]float32, ln) |
| 55 | return binary.Size(*v), binary.Read(r, byteOrder, *v) |
| 56 | |
| 57 | case io.ReaderFrom: |
| 58 | n, err := v.ReadFrom(r) |
| 59 | return int(n), err |
| 60 | |
| 61 | default: |
| 62 | return binary.Size(data), binary.Read(r, byteOrder, data) |
| 63 | } |
| 64 | } |
| 65 | |
| 66 | func binaryWrite(w io.Writer, data any) (int, error) { |
| 67 | switch v := data.(type) { |
no outgoing calls