wavetermdev/waveterm · error

cannot convert number to

Error message

cannot convert number to %s

What it means

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.

Solutions

  1. Use the correct value type for the key (e.g. true/false for boolean keys)
  2. Check the key's declared type via getConfigKeyType / generated settings meta constants
  3. If the key should accept numbers, update its registered type in the config schema

Example fix

// before
m := waveobj.MetaMapType{"app:dismissarchitecturewarning": json.Number("1")}
// after
m := waveobj.MetaMapType{"app:dismissarchitecturewarning": true}
Defensive patterns

Strategy: type-guard

Validate before calling

// ensure the key's target type accepts numbers before setting
switch getConfigKeyType(key).Kind() {
case reflect.Int64, reflect.Float64, reflect.String:
    // ok
default:
    return fmt.Errorf("key %s does not accept numeric values", key)
}

Type guard

func acceptsNumber(t reflect.Type) bool {
    switch t.Kind() {
    case reflect.Int64, reflect.Float64, reflect.String:
        return true
    }
    return false
}

Try / catch

if err := wconfig.SetBaseConfigValue(m); err != nil {
    if strings.Contains(err.Error(), "cannot convert number to") {
        return fmt.Errorf("this key requires a non-numeric type: %w", err)
    }
    return err
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of wavetermdev/waveterm@a4447c1563 (2026-09-01). Data as JSON: /api/errors/90bd0e966a701e0d. Report an issue: GitHub.

Appendix: source

Thrown at pkg/wconfig/settingsconfig.go:842

	if ctype.Kind() == reflect.Pointer {
		ctype = ctype.Elem()
	}
	if reflect.Int64 == ctype.Kind() {
		if ival, err := num.Int64(); err == nil {
			return ival, nil
		}
		return nil, fmt.Errorf("invalid number for int64: %s", num)
	}
	if reflect.Float64 == ctype.Kind() {
		if fval, err := num.Float64(); err == nil {
			return fval, nil
		}
		return nil, fmt.Errorf("invalid number for float64: %s", num)
	}
	if reflect.String == ctype.Kind() {
		return num.String(), nil
	}
	return nil, fmt.Errorf("cannot convert number to %s", ctype)
}

func SetBaseConfigValue(toMerge waveobj.MetaMapType) error {
	m, cerrs := ReadWaveHomeConfigFile(SettingsFile)
	if len(cerrs) > 0 {
		return fmt.Errorf("error reading config file: %v", cerrs[0])
	}
	if m == nil {
		m = make(waveobj.MetaMapType)
	}
	for configKey, val := range toMerge {
		ctype := getConfigKeyType(configKey)
		if ctype == nil {
			return fmt.Errorf("invalid config key: %s", configKey)
		}
		if val == nil {
			delete(m, configKey)
		} else {

View on GitHub (pinned to a4447c1563)