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
- Always build the result with NewAVRenderResult or NewAVRenderResultError
- Return a AVViewNotFound failure variant instead of an empty value when data is unavailable
- 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
- Always construct with NewAVRenderResult / NewAVRenderResultError
- Never return a declared-but-unassigned result variable
- In error paths, return the failure variant instead of zero value
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
- attribute view instance is not set
- bazaar response variant is not set
- attribute view drop target changed; retry the drag
- attribute view embedded base is missing
- attribute view groups changed; retry the drag
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)