{"record":{"id":"c4168546d856147a","repo":"quarkusio/quarkus","slug":"not-enough-information-to-build-the-action-set-at","errorCode":null,"errorMessage":"Not enough information to build the action. Set at least label and function/assistantFunction","messagePattern":"Not enough information to build the action\\. Set at least label and function/assistantFunction","errorType":"validation","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"extensions/devui/deployment-spi/src/main/java/io/quarkus/devui/spi/workspace/ActionBuilder.java","lineNumber":68,"sourceCode":"\n    public ActionBuilder display(Display display) {\n        this.display = display;\n        return this;\n    }\n\n    public ActionBuilder displayType(DisplayType displayType) {\n        this.displayType = displayType;\n        return this;\n    }\n\n    public ActionBuilder pathConverter(Function<Path, Path> pathConverter) {\n        this.pathConverter = pathConverter;\n        return this;\n    }\n\n    public Action build() {\n        if (this.label == null || (this.function == null && this.assistantFunction == null)) {\n            throw new RuntimeException(\n                    \"Not enough information to build the action. Set at least label and function/assistantFunction\");\n        }\n        return new Action(label, namespace, function, assistantFunction, filter, display, displayType, pathConverter);\n    }\n}\n","sourceCodeStart":50,"sourceCodeEnd":74,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/devui/deployment-spi/src/main/java/io/quarkus/devui/spi/workspace/ActionBuilder.java#L50-L74","documentation":"ActionBuilder.build() enforces a minimum contract for a Dev UI workspace Action: a label plus at least one of a plain function or an assistantFunction. If either requirement is unmet, it throws a RuntimeException instead of building a half-specified Action.","triggerScenarios":"Calling ActionBuilder.build() after setting only the namespace/filter/display fields, or setting label but forgetting createFunction()/assistantFunction(), or setting a function but no label.","commonSituations":"Extension authors wiring Dev UI actions conditionally and skipping the function setter when a condition is false; renaming a fluent setter so the call no longer lands.","solutions":["Call .label(\"...\") and .function(...) (or .assistantFunction(...)) before .build()","Check for exceptions in the builder chain where a fluent call was silently skipped","If the action is genuinely optional, skip building it entirely rather than building without a function"],"exampleFix":"// before\nAction a = new ActionBuilder().namespace(\"my-ext\").build();\n// after\nAction a = new ActionBuilder().namespace(\"my-ext\").label(\"Do it\").function(fn).build();","handlingStrategy":"validation","validationCode":"if (label == null || fn == null) { throw new IllegalStateException(\"Action requires label and function\"); }\nAction a = new ActionBuilder().label(label).function(fn).build();","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Build actions in one fluent chain so required setters cannot be skipped","Wrap ActionBuilder usage in a helper that enforces label+function"],"tags":["devui","builder-validation","build-time"],"backgroundTag":"invalid-builder-argument","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}