{"record":{"id":"90bd0e966a701e0d","repo":"wavetermdev/waveterm","slug":"cannot-convert-number-to-s","errorCode":null,"errorMessage":"cannot convert number to %s","messagePattern":"cannot convert number to (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/wconfig/settingsconfig.go","lineNumber":842,"sourceCode":"\tif ctype.Kind() == reflect.Pointer {\n\t\tctype = ctype.Elem()\n\t}\n\tif reflect.Int64 == ctype.Kind() {\n\t\tif ival, err := num.Int64(); err == nil {\n\t\t\treturn ival, nil\n\t\t}\n\t\treturn nil, fmt.Errorf(\"invalid number for int64: %s\", num)\n\t}\n\tif reflect.Float64 == ctype.Kind() {\n\t\tif fval, err := num.Float64(); err == nil {\n\t\t\treturn fval, nil\n\t\t}\n\t\treturn nil, fmt.Errorf(\"invalid number for float64: %s\", num)\n\t}\n\tif reflect.String == ctype.Kind() {\n\t\treturn num.String(), nil\n\t}\n\treturn nil, fmt.Errorf(\"cannot convert number to %s\", ctype)\n}\n\nfunc SetBaseConfigValue(toMerge waveobj.MetaMapType) error {\n\tm, cerrs := ReadWaveHomeConfigFile(SettingsFile)\n\tif len(cerrs) > 0 {\n\t\treturn fmt.Errorf(\"error reading config file: %v\", cerrs[0])\n\t}\n\tif m == nil {\n\t\tm = make(waveobj.MetaMapType)\n\t}\n\tfor configKey, val := range toMerge {\n\t\tctype := getConfigKeyType(configKey)\n\t\tif ctype == nil {\n\t\t\treturn fmt.Errorf(\"invalid config key: %s\", configKey)\n\t\t}\n\t\tif val == nil {\n\t\t\tdelete(m, configKey)\n\t\t} else {","sourceCodeStart":824,"sourceCodeEnd":860,"githubUrl":"https://github.com/wavetermdev/waveterm/blob/a4447c1563b2df285ab89e76c82f91e1a1a49c1e/pkg/wconfig/settingsconfig.go#L824-L860","documentation":"convertJsonNumber reaches its fallback when the target reflected type is neither int64, float64, nor string — meaning the config key is registered with an unsupported value type for numeric conversion. The target type is printed via its reflect.Type.","triggerScenarios":"Setting a json.Number value for a config key whose registered type is bool, a struct, a slice, or other non-numeric/non-string kind.","commonSituations":"Supplying a number to a boolean config key (e.g. a toggle set to 1 instead of true); API drift where a key's type changed between Wave versions.","solutions":["Use the correct value type for the key (e.g. true/false for boolean keys)","Check the key's declared type via getConfigKeyType / generated settings meta constants","If the key should accept numbers, update its registered type in the config schema"],"exampleFix":"// before\nm := waveobj.MetaMapType{\"app:dismissarchitecturewarning\": json.Number(\"1\")}\n// after\nm := waveobj.MetaMapType{\"app:dismissarchitecturewarning\": true}","handlingStrategy":"type-guard","validationCode":"// ensure the key's target type accepts numbers before setting\nswitch getConfigKeyType(key).Kind() {\ncase reflect.Int64, reflect.Float64, reflect.String:\n    // ok\ndefault:\n    return fmt.Errorf(\"key %s does not accept numeric values\", key)\n}","typeGuard":"func acceptsNumber(t reflect.Type) bool {\n    switch t.Kind() {\n    case reflect.Int64, reflect.Float64, reflect.String:\n        return true\n    }\n    return false\n}","tryCatchPattern":"if err := wconfig.SetBaseConfigValue(m); err != nil {\n    if strings.Contains(err.Error(), \"cannot convert number to\") {\n        return fmt.Errorf(\"this key requires a non-numeric type: %w\", err)\n    }\n    return err\n}","preventionTips":["Match value kinds to the key's registered schema type","Use booleans for boolean keys, not 0/1 numbers","Consult generated meta constants for each key's type"],"tags":["config","type-conversion","reflection","json-number","go"],"backgroundTag":"numeric-type-conversion-failed","analyzedSha":"a4447c1563b2df285ab89e76c82f91e1a1a49c1e","analyzedAt":"2026-09-01T15:26:23.972Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}