{"record":{"id":"60439aa7533f6e9e","repo":"Shopify/liquid","slug":"errors-syntax-case-invalid-when","errorCode":"errors.syntax.case_invalid_when","errorMessage":"options[:locale].t(\"errors.syntax.case_invalid_when\")","messagePattern":"options\\[:locale\\]\\.t\\(\"errors\\.syntax\\.case_invalid_when\"\\)","errorType":"exception","errorClass":"Liquid::SyntaxError","httpStatus":null,"severity":"error","filePath":"lib/liquid/tags/case.rb","lineNumber":135,"sourceCode":"    def parse_strict2_when(markup, body)\n      parser = @parse_context.new_parser(markup)\n\n      loop do\n        expr = Condition.parse_expression(parse_context, parser.expression, safe: true)\n        block = Condition.new(@left, '==', expr)\n        block.attach(body)\n        @blocks << block\n\n        break unless parser.id?('or') || parser.consume?(:comma)\n      end\n\n      parser.consume(:end_of_string)\n    end\n\n    def parse_lax_when(markup, body)\n      while markup\n        unless markup =~ WhenSyntax\n          raise SyntaxError, options[:locale].t(\"errors.syntax.case_invalid_when\")\n        end\n\n        markup = Regexp.last_match(2)\n\n        block = Condition.new(@left, '==', Condition.parse_expression(parse_context, Regexp.last_match(1)))\n        block.attach(body)\n        @blocks << block\n      end\n    end\n\n    def record_else_condition(markup)\n      unless markup.strip.empty?\n        raise SyntaxError, options[:locale].t(\"errors.syntax.case_invalid_else\")\n      end\n\n      block = ElseCondition.new\n      block.attach(new_body)\n      @blocks << block","sourceCodeStart":117,"sourceCodeEnd":153,"githubUrl":"https://github.com/Shopify/liquid/blob/807d45a6b3d4568e64e86b375e3702df2c7c860c/lib/liquid/tags/case.rb#L117-L153","documentation":"Each `{% when %}` inside a case block must contain one or more values separated by `or` or commas, matching WhenSyntax. parse_lax_when raises SyntaxError with 'errors.syntax.case_invalid_when' when a when clause's markup contains no QuotedFragment.","triggerScenarios":"`{% when %}` with empty markup; `{% when a and b %}` (using 'and' instead of 'or'); when clauses with expressions the regex cannot parse like `{% when x > 1 %}`.","commonSituations":"Translating switch/case code from other languages using 'and' or '||'; typos dropping the value after `when`; trying to do range comparisons in `when`, which Liquid does not support.","solutions":["Give each when clause at least one literal or variable: {% when \"shirt\" %}","Separate multiple values with 'or' or a comma: {% when \"a\" or \"b\" %} / {% when 1, 2 %}","Remove unsupported operators (> , and, ranges) from when clauses; use nested {% if %} for such logic","Wrap when values containing special characters in quotes"],"exampleFix":"// before\n{% when product.type == \"shirt\" %}\n// after\n{% when \"shirt\" %}","handlingStrategy":"validation","validationCode":"def valid_when_markup?(markup)\n  markup =~ /\\s*[\\w\"']/ # at least one value literal/variable present\nend","typeGuard":null,"tryCatchPattern":"begin\n  Liquid::Template.parse(source)\nrescue Liquid::SyntaxError => e\n  raise \"Invalid when clause: #{e.message}\"\nend","preventionTips":["Each when needs at least one literal or variable value","Use 'or' or commas between multiple values — never 'and', '>' or ranges","Quote values containing spaces or special characters"],"tags":["liquid","ruby","template-syntax","case-when"],"backgroundTag":"liquid-tag-syntax-error","analyzedSha":"807d45a6b3d4568e64e86b375e3702df2c7c860c","analyzedAt":"2026-09-08T11:31:38.917Z","contentChangedAt":"2026-09-08T11:31:38.917Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}