{"record":{"id":"8f13bcd025669833","repo":"juicedata/juicefs","slug":"delimiter-should-be-a-rune-but-now-is-s","errorCode":null,"errorMessage":"delimiter should be a rune but now is %s","messagePattern":"delimiter should be a rune but now is (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/object/swift.go","lineNumber":90,"sourceCode":"\nfunc (s *swiftOSS) Delete(ctx context.Context, key string, getters ...AttrGetter) error {\n\terr := s.conn.ObjectDelete(ctx, s.container, key)\n\tif err != nil && errors.Is(err, swift.ObjectNotFound) {\n\t\terr = nil\n\t}\n\treturn err\n}\n\nfunc (s *swiftOSS) List(ctx context.Context, prefix, marker, token, delimiter string, limit int64, followLink bool) ([]Object, bool, string, error) {\n\tif limit > 10000 {\n\t\tlimit = 10000\n\t}\n\tvar delimiter_ rune\n\tif delimiter != \"\" {\n\t\tif len([]rune(delimiter)) == 1 {\n\t\t\tdelimiter_ = []rune(delimiter)[0]\n\t\t} else {\n\t\t\treturn nil, false, \"\", fmt.Errorf(\"delimiter should be a rune but now is %s\", delimiter)\n\t\t}\n\t}\n\tobjects, err := s.conn.Objects(ctx, s.container, &swift.ObjectsOpts{Prefix: prefix, Marker: marker, Delimiter: delimiter_, Limit: int(limit)})\n\tif err != nil {\n\t\treturn nil, false, \"\", err\n\t}\n\tvar objs = make([]Object, len(objects))\n\tfor i, o := range objects {\n\t\t// https://docs.openstack.org/swift/latest/api/pseudo-hierarchical-folders-directories.html\n\t\tif delimiter != \"\" && o.PseudoDirectory {\n\t\t\tobjs[i] = &obj{o.SubDir, 0, time.Unix(0, 0), true, \"\", \"\"}\n\t\t} else {\n\t\t\tobjs[i] = &obj{o.Name, o.Bytes, o.LastModified, strings.HasSuffix(o.Name, \"/\"), \"\", \"\"}\n\t\t}\n\t}\n\treturn generateListResult(objs, limit)\n}\n","sourceCodeStart":72,"sourceCodeEnd":108,"githubUrl":"https://github.com/juicedata/juicefs/blob/c9a67b23e8e08ec23ec331aa6f1675e2319e921c/pkg/object/swift.go#L72-L108","documentation":"Returned by swiftOSS.List when the delimiter parameter is a string of zero or multiple runes. The Swift API takes a single rune delimiter for common-prefix listing, so any multi-character delimiter is rejected before the request is sent.","triggerScenarios":"Thrown at pkg/object/swift.go:90 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Use a single-character delimiter (typically '/') for hierarchical listing"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"c9a67b23e8e08ec23ec331aa6f1675e2319e921c","analyzedAt":"2026-09-06T17:55:48.476Z","contentChangedAt":"2026-09-06T17:55:48.476Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}