{"record":{"id":"ed54340e16fc43f3","repo":"larksuite/cli","slug":"schema-must-declare-exactly-one-of-required-or-opt","errorCode":null,"errorMessage":"schema must declare exactly one of required or optional","messagePattern":"schema must declare exactly one of required or optional","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"shortcuts/common/typed_compile_args.go","lineNumber":495,"sourceCode":"\t\t\tresult.maximum = &v\n\t\tcase \"minItems\":\n\t\t\tv, err := parseNonnegativeInt(value)\n\t\t\tif err != nil {\n\t\t\t\treturn result, fmt.Errorf(\"schema minItems: %w\", err)\n\t\t\t}\n\t\t\tresult.minItems = &v\n\t\tcase \"maxItems\":\n\t\t\tv, err := parseNonnegativeInt(value)\n\t\t\tif err != nil {\n\t\t\t\treturn result, fmt.Errorf(\"schema maxItems: %w\", err)\n\t\t\t}\n\t\t\tresult.maxItems = &v\n\t\tdefault:\n\t\t\treturn result, fmt.Errorf(\"unknown schema token %q\", key)\n\t\t}\n\t}\n\tif result.required == result.optional {\n\t\treturn result, fmt.Errorf(\"schema must declare exactly one of required or optional\")\n\t}\n\tif result.required && result.defaultValue.Set {\n\t\treturn result, fmt.Errorf(\"required input cannot declare default\")\n\t}\n\tif result.nullable != nil && *result.nullable && !isNilCapable(valueType) {\n\t\treturn result, fmt.Errorf(\"nullable requires a nil-capable Go type\")\n\t}\n\tif result.minLength != nil && result.maxLength != nil && *result.minLength > *result.maxLength {\n\t\treturn result, fmt.Errorf(\"minLength exceeds maxLength\")\n\t}\n\tif result.minimum != nil && result.maximum != nil && *result.minimum > *result.maximum {\n\t\treturn result, fmt.Errorf(\"minimum exceeds maximum\")\n\t}\n\tif result.minItems != nil && result.maxItems != nil && *result.minItems > *result.maxItems {\n\t\treturn result, fmt.Errorf(\"minItems exceeds maxItems\")\n\t}\n\treturn result, nil\n}","sourceCodeStart":477,"sourceCodeEnd":513,"githubUrl":"https://github.com/larksuite/cli/blob/7fd6ef3c07182257ce776cdc5a614e122d5bd4b3/shortcuts/common/typed_compile_args.go#L477-L513","documentation":"Every field's schema tag must declare exactly one of `required` or `optional`. Declaring both, or neither, makes the input's nullability/optionality ambiguous, so parseSchemaTag rejects the tag at compile time.","triggerScenarios":"A field tagged schema:\"required;optional\" or a field with a schema tag containing only constraints, e.g. schema:\"minLength=3\", with no required/optional token.","commonSituations":"Copy-pasting a constraint-only tag onto a new field, merging two tags and keeping both markers, or refactoring a field from required to optional and forgetting to delete the old token.","solutions":["Keep exactly one marker: either required or optional, not both.","If the field has no schema tag constraints, decide its optionality explicitly.","Delete the redundant token when converting a field between required and optional."],"exampleFix":"// before\nEmail string `schema:\"required;optional;format=email\"`\n// after\nEmail string `schema:\"required;format=email\"`","handlingStrategy":"validation","validationCode":"func exactlyOneRequiredOptional(tag string) bool {\n\tn := 0\n\tfor _, tok := range strings.Split(tag, \";\") {\n\t\tif tok == \"required\" || tok == \"optional\" {\n\t\t\tn++\n\t\t}\n\t}\n\treturn n == 1\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always end each field's decision with exactly one of required/optional.","When flipping optionality, delete the old token in the same edit.","Grep for ';required;optional' or tags missing both before committing."],"tags":["go","struct-tags","schema-validation","compile-time"],"backgroundTag":"schema-validation-failed","analyzedSha":"7fd6ef3c07182257ce776cdc5a614e122d5bd4b3","analyzedAt":"2026-09-04T21:17:44.649Z","contentChangedAt":"2026-09-04T21:17:44.649Z","schemaVersion":2},"datasetVersion":"2026-09-12T02:17:10.037Z"}