{"record":{"id":"90a26fb028789729","repo":"ipfs/kubo","slug":"invalid-priority-value-d","errorCode":null,"errorMessage":"invalid priority value: %d","messagePattern":"invalid priority value: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"config/types.go","lineNumber":189,"sourceCode":"\t\t\tpanic(fmt.Sprintf(\"invalid priority %d < 0\", int64(p)))\n\t\t}\n\t\treturn int64(p), true\n\t}\n}\n\nfunc (p Priority) MarshalJSON() ([]byte, error) {\n\t// > 0 == Priority\n\tif p > 0 {\n\t\treturn json.Marshal(int64(p))\n\t}\n\t// <= 0 == special\n\tswitch p {\n\tcase DefaultPriority:\n\t\treturn json.Marshal(nil)\n\tcase Disabled:\n\t\treturn json.Marshal(false)\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"invalid priority value: %d\", p)\n\t}\n}\n\nfunc (p *Priority) UnmarshalJSON(input []byte) error {\n\tswitch string(input) {\n\tcase \"null\", \"undefined\":\n\t\t*p = DefaultPriority\n\tcase \"false\":\n\t\t*p = Disabled\n\tcase \"true\":\n\t\treturn fmt.Errorf(\"'true' is not a valid priority\")\n\tdefault:\n\t\tvar priority int64\n\t\terr := json.Unmarshal(input, &priority)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif priority <= 0 {","sourceCodeStart":171,"sourceCodeEnd":207,"githubUrl":"https://github.com/ipfs/kubo/blob/329838acdfafae224582930457efe80aa217afc0/config/types.go#L171-L207","documentation":"Priority.MarshalJSON in config/types.go serializes the tri-state Priority (DefaultPriority/Disabled) to JSON (null or false). A Priority holding any other internal integer has no JSON representation, so marshaling fails with \"invalid priority value: %d\". Like Flag, this can only arise from constructing the value programmatically with an out-of-range state.","triggerScenarios":"Setting a config.Priority field (e.g. under Reprovider or related config) to an arbitrary integer in Go code (library consumers, tests, generated configs) and then marshaling/writing the config via json.Marshal or WriteConfigFile.","commonSituations":"kubo-as-a-library code assigning raw ints to Priority fields, reflection-based or fuzz-generated config structs, or porting code from older config versions where priority constants changed.","solutions":["Assign only config.DefaultPriority or config.Disabled to Priority fields.","Zero-initialize Priority values (DefaultPriority marshals to null, meaning default behavior).","If importing from user input, decode with Priority.UnmarshalJSON (accepting null/undefined/false) rather than casting integers."],"exampleFix":"// before\ncfg.Reprovider.Strategy.Priority = config.Priority(3)\n// after\ncfg.Reprovider.Strategy.Priority = config.Disabled","handlingStrategy":"type-guard","validationCode":"func validPriority(p config.Priority) bool { return p == config.DefaultPriority || p == config.Disabled }","typeGuard":"func isValidPriority(p config.Priority) bool {\n    switch p {\n    case config.DefaultPriority, config.Disabled:\n        return true\n    }\n    return false\n}","tryCatchPattern":"if err := json.Marshal(cfg); err != nil {\n    if strings.Contains(err.Error(), \"invalid priority value\") { /* fix Priority field */ }\n    return err\n}","preventionTips":["Only assign config.DefaultPriority or config.Disabled to Priority fields","Decode external input through Priority.UnmarshalJSON, never integer casts","Marshal generated configs in tests to catch invalid states early"],"tags":["config","json","go","marshaling"],"backgroundTag":"invalid-enum-value","analyzedSha":"329838acdfafae224582930457efe80aa217afc0","analyzedAt":"2026-09-03T18:30:52.135Z","contentChangedAt":"2026-09-03T18:30:52.135Z","schemaVersion":2},"datasetVersion":"2026-09-11T00:17:11.886Z"}