| 19 | } |
| 20 | |
| 21 | func parseSheetsTableColumnsJSON(spec string, input io.Reader) ([]*sheets.TableColumnProperties, error) { |
| 22 | b, err := resolveInlineOrFileBytes(spec, input) |
| 23 | if err != nil { |
| 24 | return nil, usagef("read --columns-json: %v", err) |
| 25 | } |
| 26 | |
| 27 | var raw []sheetsTableColumnInput |
| 28 | dec := json.NewDecoder(bytes.NewReader(b)) |
| 29 | dec.DisallowUnknownFields() |
| 30 | if err := dec.Decode(&raw); err != nil { |
| 31 | return nil, usagef("invalid columns JSON: %v", err) |
| 32 | } |
| 33 | var extra any |
| 34 | if err := dec.Decode(&extra); err != io.EOF { |
| 35 | if err == nil { |
| 36 | return nil, usage("invalid columns JSON: multiple JSON values") |
| 37 | } |
| 38 | return nil, usagef("invalid columns JSON: %v", err) |
| 39 | } |
| 40 | if len(raw) == 0 { |
| 41 | return nil, usage("provide at least one table column") |
| 42 | } |
| 43 | |
| 44 | cols := make([]*sheets.TableColumnProperties, 0, len(raw)) |
| 45 | for i, in := range raw { |
| 46 | name := strings.TrimSpace(in.ColumnName) |
| 47 | if name == "" { |
| 48 | return nil, usagef("columns[%d].columnName is required", i) |
| 49 | } |
| 50 | colType, err := normalizeSheetsTableColumnType(in.ColumnType) |
| 51 | if err != nil { |
| 52 | return nil, usagef("columns[%d].columnType: %v", i, err) |
| 53 | } |
| 54 | validation := in.DataValidationRule |
| 55 | if validation == nil { |
| 56 | validation = in.DataValidation |
| 57 | } |
| 58 | if validation != nil && colType != sheetsTypeDropdown { |
| 59 | return nil, usagef("columns[%d].dataValidationRule requires columnType DROPDOWN", i) |
| 60 | } |
| 61 | col := &sheets.TableColumnProperties{ |
| 62 | ColumnIndex: int64(i), |
| 63 | ColumnName: name, |
| 64 | ColumnType: colType, |
| 65 | DataValidationRule: validation, |
| 66 | } |
| 67 | col.ForceSendFields = []string{"ColumnIndex"} |
| 68 | cols = append(cols, col) |
| 69 | } |
| 70 | return cols, nil |
| 71 | } |
| 72 | |
| 73 | func normalizeSheetsTableColumnType(input string) (string, error) { |
| 74 | t := strings.ToUpper(strings.TrimSpace(input)) |