{"record":{"id":"0bf5d6203613db33","repo":"hibiken/asynq","slug":"queue-name-must-contain-one-or-more-characters","errorCode":null,"errorMessage":"queue name must contain one or more characters","messagePattern":"queue name must contain one or more characters","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/base/base.go","lineNumber":100,"sourceCode":"\tcase \"scheduled\":\n\t\treturn TaskStateScheduled, nil\n\tcase \"retry\":\n\t\treturn TaskStateRetry, nil\n\tcase \"archived\":\n\t\treturn TaskStateArchived, nil\n\tcase \"completed\":\n\t\treturn TaskStateCompleted, nil\n\tcase \"aggregating\":\n\t\treturn TaskStateAggregating, nil\n\t}\n\treturn 0, errors.E(errors.FailedPrecondition, fmt.Sprintf(\"%q is not supported task state\", s))\n}\n\n// ValidateQueueName validates a given qname to be used as a queue name.\n// Returns nil if valid, otherwise returns non-nil error.\nfunc ValidateQueueName(qname string) error {\n\tif len(strings.TrimSpace(qname)) == 0 {\n\t\treturn fmt.Errorf(\"queue name must contain one or more characters\")\n\t}\n\treturn nil\n}\n\n// QueueKeyPrefix returns a prefix for all keys in the given queue.\nfunc QueueKeyPrefix(qname string) string {\n\treturn \"asynq:{\" + qname + \"}:\"\n}\n\n// TaskKeyPrefix returns a prefix for task key.\nfunc TaskKeyPrefix(qname string) string {\n\treturn QueueKeyPrefix(qname) + \"t:\"\n}\n\n// TaskKey returns a redis key for the given task message.\nfunc TaskKey(qname, id string) string {\n\treturn TaskKeyPrefix(qname) + id\n}","sourceCodeStart":82,"sourceCodeEnd":118,"githubUrl":"https://github.com/hibiken/asynq/blob/d135f1439bee74e989b7f9b41ecd542cc87f024a/internal/base/base.go#L82-L118","documentation":"base.ValidateQueueName returns this error when the queue name is empty or contains only whitespace. Queue names are used to construct Redis keys, so a zero-length name would be ambiguous/unsafe and is rejected up front by Inspector methods and option composition.","triggerScenarios":"Calling Inspector.GetQueueInfo/History/ListPendingTasks/ListActiveTasks/ListAggregatingTasks or composing asynq options with qname == \"\" or \"   \".","commonSituations":"Missing env var or config entry for the queue name; empty CLI flag; iterating a map where a queue key had an empty value; calling before any queue was configured.","solutions":["Trim and check the name before the API call: if strings.TrimSpace(q) == \"\" use a default like \"default\".","Fix the config/env/flag source so the queue name is always populated.","Call base.ValidateQueueName(qname) as an explicit pre-check with a clear user-facing message."],"exampleFix":"// before\ninfo, err := insp.GetQueueInfo(os.Getenv(\"QUEUE\"), nil)\n// after\nq := os.Getenv(\"QUEUE\")\nif strings.TrimSpace(q) == \"\" { q = \"default\" }\ninfo, err := insp.GetQueueInfo(q, nil)","handlingStrategy":"validation","validationCode":"if err := base.ValidateQueueName(qname); err != nil { return err }","typeGuard":"func validQueue(q string) bool { return strings.TrimSpace(q) != \"\" }","tryCatchPattern":null,"preventionTips":["Default empty queue config to \"default\"","Validate queue names once at startup, not per call","Fail fast at config load if required queue names are blank"],"tags":["queue-name","validation","empty-value"],"backgroundTag":"empty-required-field","analyzedSha":"d135f1439bee74e989b7f9b41ecd542cc87f024a","analyzedAt":"2026-09-07T19:02:34.660Z","contentChangedAt":"2026-09-07T19:02:34.660Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}