| 68 | } |
| 69 | |
| 70 | func appendValue(builder array.Builder, value any) error { |
| 71 | if value == nil { |
| 72 | builder.AppendNull() |
| 73 | return nil |
| 74 | } |
| 75 | switch bldr := builder.(type) { |
| 76 | case *array.StructBuilder: |
| 77 | m := value.([]bigquery.Value) |
| 78 | bldr.Append(true) |
| 79 | for f := 0; f < bldr.NumField(); f++ { |
| 80 | fieldBldr := bldr.FieldBuilder(f) |
| 81 | if err := appendValue(fieldBldr, m[f]); err != nil { |
| 82 | return err |
| 83 | } |
| 84 | } |
| 85 | return nil |
| 86 | case array.ListLikeBuilder: |
| 87 | lst := value.([]bigquery.Value) |
| 88 | if lst == nil { |
| 89 | bldr.AppendNull() |
| 90 | return nil |
| 91 | } |
| 92 | bldr.Append(true) |
| 93 | valBuilder := bldr.ValueBuilder() |
| 94 | for _, v := range lst { |
| 95 | if err := appendValue(valBuilder, v); err != nil { |
| 96 | return err |
| 97 | } |
| 98 | } |
| 99 | return nil |
| 100 | case *array.Time32Builder: |
| 101 | t := value.(civil.Time) |
| 102 | unit := bldr.Type().(*arrow.Time32Type).Unit |
| 103 | ts := stringForTime(t, unit) |
| 104 | t32, err := arrow.Time32FromString(ts, unit) |
| 105 | if err != nil { |
| 106 | return err |
| 107 | } |
| 108 | bldr.Append(t32) |
| 109 | return nil |
| 110 | case *array.Time64Builder: |
| 111 | t := value.(civil.Time) |
| 112 | unit := bldr.Type().(*arrow.Time64Type).Unit |
| 113 | ts := stringForTime(t, unit) |
| 114 | t64, err := arrow.Time64FromString(ts, unit) |
| 115 | if err != nil { |
| 116 | return err |
| 117 | } |
| 118 | bldr.Append(t64) |
| 119 | return nil |
| 120 | case *array.DayTimeIntervalBuilder: |
| 121 | t := value.([]bigquery.Value) |
| 122 | bldr.Append(arrow.DayTimeInterval{ |
| 123 | Days: int32(t[0].(int64)), |
| 124 | Milliseconds: int32(t[1].(int64)), |
| 125 | }) |
| 126 | return nil |
| 127 | case *array.MonthDayNanoIntervalBuilder: |