reflex-dev/reflex · error · ValueError

rx.match should have at least one case.

Error message

rx.match should have at least one case.

What it means

`rx.match` requires at least one (condition, value) tuple case plus optionally a trailing default. Calling it with an empty argument list after the condition (or where the default consumed the only argument) leaves no cases to evaluate and raises ValueError.

Source

Thrown at packages/reflex-components-core/src/reflex_components_core/core/match.py:102

    @classmethod
    def _process_cases(
        cls, cases: list
    ) -> tuple[list[tuple], Var | BaseComponent | None]:
        """Process the list of match cases and the catchall default case.

        Args:
            cases: The list of match cases.

        Returns:
            The default case and the list of match case tuples.

        Raises:
            ValueError: If there are multiple default cases.
        """
        if not cases:
            msg = "rx.match should have at least one case."
            raise ValueError(msg)

        if not isinstance(cases[-1], tuple):
            *cases, default_return = cases
            default_return = (
                cls._create_case_var_with_var_data(default_return)
                if not isinstance(default_return, BaseComponent)
                else default_return
            )
        else:
            default_return = None

        if any(case for case in cases if not isinstance(case, tuple)):
            msg = "rx.match should have tuples of cases and one default case as the last argument."
            raise ValueError(msg)

        if not cases:
            msg = "rx.match should have at least one case."
            raise ValueError(msg)

View on GitHub (pinned to 45b8ed5ab7)

Solutions

  1. Provide at least one (pattern, value) tuple: rx.match(State.x, ('a', 1), 0)
  2. When generating cases dynamically, assert non-empty before calling: assert cases, 'need >=1 match case'
  3. Keep the trailing default after at least one tuple

Example fix

# before
rx.match(State.level, 'none')  # no tuple cases
# after
rx.match(State.level, ('high', 3), ('low', 1), 0)
Defensive patterns

Strategy: validation

Validate before calling

assert cases, 'rx.match requires at least one (pattern, value) tuple'
result = rx.match(State.x, *cases, default)

Prevention

When it happens

Trigger: `rx.match(State.x)` with no cases; `rx.match(State.x, 'fallback')` where the lone string is consumed as the default, leaving zero tuple cases (this site raises the empty-cases error when tuples list ends up empty).

Common situations: Programmatically building the case list from data that turns out empty; refactoring removes all cases but leaves the call.

Understand the failure class

Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.

Related errors


AI-assisted analysis of reflex-dev/reflex@45b8ed5ab7 (2026-08-28). Data as JSON: /api/errors/ee412d29b4c432be. Report an issue: GitHub.