siyuan-note/siyuan · error

bazaar response variant is not set

Error message

bazaar response variant is not set

What it means

BazaarUserRatingsResult is a success/failure union (BazaarUserRatingsData or BazaarRatingError); MarshalJSON serializes the set variant and returns this error when both pointers are nil. The union type exists so the marketplace ratings endpoint can only produce a well-formed success or error body.

Solutions

  1. Use NewBazaarUserRatingsResult / NewBazaarUserRatingsResultError on all paths
  2. Return the BazaarRatingError failure variant when the upstream ratings call fails
  3. Test that every branch of the handler marshals successfully

Example fix

// before
var result apicontract.BazaarUserRatingsResult
return result
// after
return apicontract.NewBazaarUserRatingsResultError(apicontract.BazaarRatingError{Msg: msg})
Defensive patterns

Strategy: validation

Validate before calling

func checkBazaarUserRatings(r apicontract.BazaarUserRatingsResult) error {
    if _, err := json.Marshal(r); err != nil {
        return fmt.Errorf("ratings result unset: %w", err)
    }
    return nil
}

Try / catch

payload, err := json.Marshal(result)
if err != nil {
    return Response[apicontract.BazaarUserRatingsResult]{Code: 1, Msg: err.Error()}
}

Prevention

When it happens

Trigger: Marshaling a BazaarUserRatingsResult created as a zero value or via a struct literal without NewBazaarUserRatingsResult/NewBazaarUserRatingsResultError, typically in the getBazaarPackageUserRatings response path.

Common situations: Handler builds the result only inside a branch and returns the default otherwise; refactoring removed a constructor call; upstream rating fetch fails and neither variant is assigned.

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/7bdc1271ff1c3a48. Report an issue: GitHub.

Appendix: source

Thrown at kernel/apicontract/bazaar.go:387

type BazaarRatingResult struct {
	success *BazaarRatingData
	failure *BazaarRatingError
}

func NewBazaarRatingResult(data BazaarRatingData) BazaarRatingResult {
	return BazaarRatingResult{success: &data}
}
func NewBazaarRatingResultError(data BazaarRatingError) BazaarRatingResult {
	return BazaarRatingResult{failure: &data}
}
func (data BazaarRatingResult) MarshalJSON() ([]byte, error) {
	if data.success != nil {
		return json.Marshal(data.success)
	}
	if data.failure != nil {
		return json.Marshal(data.failure)
	}
	return nil, errors.New("bazaar response variant is not set")
}

type BazaarUserRatingsResult struct {
	success *BazaarUserRatingsData
	failure *BazaarRatingError
}

func NewBazaarUserRatingsResult(data BazaarUserRatingsData) BazaarUserRatingsResult {
	return BazaarUserRatingsResult{success: &data}
}
func NewBazaarUserRatingsResultError(data BazaarRatingError) BazaarUserRatingsResult {
	return BazaarUserRatingsResult{failure: &data}
}
func (data BazaarUserRatingsResult) MarshalJSON() ([]byte, error) {
	if data.success != nil {
		return json.Marshal(data.success)
	}
	if data.failure != nil {

View on GitHub (pinned to 9f775e8a12)