wavetermdev/waveterm · error

cannot convert number to %s

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.

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)

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.