glanceapp/glance · error

invalid query parameter value type: %T

Error message

invalid query parameter value type: %T

What it means

Returned by queryParametersField.UnmarshalYAML when, inside a list-typed query parameter value, one list element is not a string, number, or bool. The code type-switches each item of a []any; anything else (nested maps/lists, nulls) falls to the inner default branch. The %T verb prints the element's Go type, e.g. 'map[string]interface {}'.

Source

Thrown at internal/glance/config-fields.go:269

		case string:
			(*q)[key] = []string{v}
		case int, int8, int16, int32, int64, float32, float64:
			(*q)[key] = []string{fmt.Sprintf("%v", v)}
		case bool:
			(*q)[key] = []string{fmt.Sprintf("%t", v)}
		case []string:
			(*q)[key] = append((*q)[key], v...)
		case []any:
			for _, item := range v {
				switch item := item.(type) {
				case string:
					(*q)[key] = append((*q)[key], item)
				case int, int8, int16, int32, int64, float32, float64:
					(*q)[key] = append((*q)[key], fmt.Sprintf("%v", item))
				case bool:
					(*q)[key] = append((*q)[key], fmt.Sprintf("%t", item))
				default:
					return fmt.Errorf("invalid query parameter value type: %T", item)
				}
			}
		default:
			return fmt.Errorf("invalid query parameter value type: %T", value)
		}
	}

	return nil
}

func (q *queryParametersField) toQueryString() string {
	query := url.Values{}

	for key, values := range *q {
		for _, value := range values {
			query.Add(key, value)
		}
	}

View on GitHub (pinned to 91324e8de7)

Solutions

  1. Flatten query parameter lists to scalars only: strings, numbers, booleans.
  2. Remove null/`~` entries and nested lists/maps from parameter values.
  3. For repeated params use a flat list: `key: [a, b, c]` — each element must be a scalar.

Example fix

# before
query-parameters:
  tag:
    - featured
    - [urgent, new]

# after
query-parameters:
  tag:
    - featured
    - urgent
    - new
Defensive patterns

Strategy: type-guard

Validate before calling

python3 - <<'EOF'
import sys,yaml
def scalars(v):
    if isinstance(v,list):
        return all(scalars(i) for i in v)
    return isinstance(v,(str,int,float,bool)) and v is not None
def walk(o):
    if isinstance(o,dict):
        for k,v in o.items():
            if k=='query-parameters' and not all(scalars(x) for x in v.values()):
                sys.exit(f'non-scalar query param: {v}')
            walk(v)
    elif isinstance(o,list):
        for i in o: walk(i)
walk(yaml.safe_load(open('glance.yml')))
print('ok')
EOF

Type guard

// Go: guard before assigning into queryParametersField
func isScalarOrScalarList(v any) bool {
    switch t := v.(type) {
    case string, int, int8, int16, int32, int64, float32, float64, bool:
        return true
    case []string, []any:
        list, ok := any(t).([]any)
        if !ok {
            return true // []string
        }
        for _, item := range list {
            switch item.(type) {
            case string, int, int8, int16, int32, int64, float32, float64, bool:
            default:
                return false
            }
        }
        return true
    }
    return false
}

Prevention

When it happens

Trigger: A query-parameters config like `key: [a, [b, c]]` or `key: [{v: 1}]` or a list containing a YAML null (`~`) — the nested list/map/nil element hits the default case.

Common situations: Trying to nest structures inside query param lists; YAML `~`/null entries from templating mistakes; over-structuring params when only flat scalars are supported.

Related errors


AI-assisted analysis of glanceapp/glance@91324e8de7 (2026-08-15). Data as JSON: /api/errors/869492b0f1f505e5. Report an issue: GitHub.