siyuan-note/siyuan · error

attribute view response variant is not set

Error message

attribute view response variant is not set

What it means

AVRenderResult is a success/failure union (AVRenderData or AVViewNotFound); MarshalJSON emits whichever pointer is set. If both are nil (zero value or forgotten constructor), serialization fails with this error so an ambiguous empty response is never produced.

Solutions

  1. Always build the result with NewAVRenderResult or NewAVRenderResultError
  2. Return a AVViewNotFound failure variant instead of an empty value when data is unavailable
  3. Add a unit test covering every handler return path so zero unions fail in CI

Example fix

// before
var result apicontract.AVRenderResult
return result
// after
return apicontract.NewAVRenderResultError(apicontract.AVViewNotFound{...})
Defensive patterns

Strategy: validation

Validate before calling

func checkRenderResult(r apicontract.AVRenderResult) error {
    if r.Marshalable() { return nil }
    return errors.New("AVRenderResult built without NewAVRenderResult/Error")
}

Type guard

func isRenderResultSet(r apicontract.AVRenderResult) bool {
    return r.Success() != nil || r.Failure() != nil
}

Try / catch

payload, err := json.Marshal(result)
if err != nil {
    http.Error(w, "internal response error", http.StatusInternalServerError)
    return
}

Prevention

When it happens

Trigger: Returning AVRenderResult{} from a handler, or constructing it via a struct literal without NewAVRenderResult/NewAVRenderResultError; surfaces when rendering an attribute view whose result was never initialized.

Common situations: Early-return paths added after the result variable is declared; error checks that skip both constructors; zero-value struct returned by a helper function.

Understand the failure class

Background: "This is a bug, please report it": internal invariant violations, unreachable panics, and SNH errors explained — this error's family across 47 libraries.

Related errors


AI-assisted analysis of siyuan-note/siyuan@9f775e8a12 (2026-09-19). Data as JSON: /api/errors/7e08413f83882441. Report an issue: GitHub.

Appendix: source

Thrown at kernel/apicontract/av_union.go:141

}

type AVRenderResult struct {
	success *AVRenderData
	failure *AVViewNotFound
}

func NewAVRenderResult(value AVRenderData) AVRenderResult { return AVRenderResult{success: &value} }
func NewAVRenderResultError(value AVViewNotFound) AVRenderResult {
	return AVRenderResult{failure: &value}
}
func (value AVRenderResult) MarshalJSON() ([]byte, error) {
	if value.success != nil {
		return json.Marshal(value.success)
	}
	if value.failure != nil {
		return json.Marshal(value.failure)
	}
	return nil, errors.New("attribute view response variant is not set")
}

type AVCreateItemResult struct {
	success *AVCreateAttributeViewItemResult
	failure *AVUnavailableNotebook
}

func NewAVCreateItemResult(value AVCreateAttributeViewItemResult) AVCreateItemResult {
	return AVCreateItemResult{success: &value}
}
func NewAVCreateItemResultError(value AVUnavailableNotebook) AVCreateItemResult {
	return AVCreateItemResult{failure: &value}
}
func (value AVCreateItemResult) MarshalJSON() ([]byte, error) {
	if value.success != nil {
		return json.Marshal(value.success)
	}
	if value.failure != nil {

View on GitHub (pinned to 9f775e8a12)