{"record":{"id":"a86d7f51583c0e4a","repo":"apache/seatunnel","slug":"conditional-option-rule-for-s-must-have-options","errorCode":null,"errorMessage":"conditional option rule for '%s' must have options.","messagePattern":"conditional option rule for '(.+?)' must have options\\.","errorType":"validation","errorClass":"org.apache.seatunnel.api.configuration.util.OptionValidationException","httpStatus":null,"severity":"error","filePath":"seatunnel-api/src/main/java/org/apache/seatunnel/api/configuration/util/OptionRule.java","lineNumber":280,"sourceCode":"            this.requiredOptions.add(bundledRequiredOption);\n            return this;\n        }\n\n        public <T> Builder conditionalRule(\n                @NonNull Option<T> conditionalOption,\n                @NonNull List<T> expectValues,\n                @NonNull OptionRule conditionalOptionRule) {\n            verifyConditionalExists(conditionalOption);\n\n            if (expectValues.isEmpty()) {\n                throw new OptionValidationException(\n                        String.format(\n                                \"conditional option '%s' must have expect values .\",\n                                conditionalOption.key()));\n            }\n\n            if (!conditionalOptionRule.hasOptions()) {\n                throw new OptionValidationException(\n                        String.format(\n                                \"conditional option rule for '%s' must have options.\",\n                                conditionalOption.key()));\n            }\n\n            Expression expression =\n                    expectValues.stream()\n                            .map(v -> Expression.of(Condition.of(conditionalOption, v)))\n                            .reduce(Expression::or)\n                            .get();\n\n            if (conditionRulesMap.containsKey(expression)) {\n                throw new OptionValidationException(\n                        String.format(\n                                \"conditional option rule for '%s' with expression '%s' already exists.\",\n                                conditionalOption.key(), expression.toString()));\n            }\n            this.conditionRulesMap.put(expression, conditionalOptionRule);","sourceCodeStart":262,"sourceCodeEnd":298,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-api/src/main/java/org/apache/seatunnel/api/configuration/util/OptionRule.java#L262-L298","documentation":"A developer-facing builder guard in OptionRule.Builder.conditionalRule: the nested OptionRule attached for a conditional option contains no options at all, making the conditional rule useless. The faulting input is the conditionalOptionRule argument.","triggerScenarios":"Thrown at seatunnel-api/src/main/java/org/apache/seatunnel/api/configuration/util/OptionRule.java:280 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Build the conditional OptionRule with at least one optional or required option before passing it","Check that the nested rule's builder had options added and build() was called correctly","Fix the connector's OptionRule definition code, not the user config"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}