{"record":{"id":"bb0157f9c3905dc5","repo":"golang/go","slug":"flate-invalid-compression-level-d-want-value-in","errorCode":null,"errorMessage":"flate: invalid compression level %d: want value in range [-2, 9]","messagePattern":"flate: invalid compression level (.+?): want value in range \\[-2, 9\\]","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/compress/flate/deflate.go","lineNumber":748,"sourceCode":"\t\td.step = (*compressor).deflateHuff\n\tcase level == DefaultCompression:\n\t\tlevel = 6\n\t\tfallthrough\n\tcase 1 <= level && level <= 6:\n\t\td.w.logNewTablePenalty = 7\n\t\td.fast = newFastEnc(level)\n\t\td.window = make([]byte, maxStoreBlockSize)\n\t\td.fill = (*compressor).fillBlock\n\t\td.step = (*compressor).deflateFast\n\tcase 7 <= level && level <= 9:\n\t\td.w.logNewTablePenalty = 8\n\t\td.state = &advancedState{}\n\t\td.compressionLevel = levels[level]\n\t\td.initDeflate()\n\t\td.fill = (*compressor).fillDeflate\n\t\td.step = (*compressor).deflateLazy\n\tdefault:\n\t\treturn fmt.Errorf(\"flate: invalid compression level %d: want value in range [-2, 9]\", level)\n\t}\n\td.level = level\n\treturn nil\n}\n\n// reset resets the compressor with a new output writer.\nfunc (d *compressor) reset(w io.Writer) {\n\td.w.reset(w)\n\td.sync = false\n\td.err = nil\n\td.windowEnd = 0\n\t// We only need to reset a few things for fast encoders.\n\tif d.fast != nil {\n\t\td.fast.reset()\n\t\td.tokens.Reset()\n\t\treturn\n\t}\n\tif d.compressionLevel.chain == 0 {","sourceCodeStart":730,"sourceCodeEnd":766,"githubUrl":"https://github.com/golang/go/blob/b6b368adc57c96c3151d224d172029f233ead2c3/src/compress/flate/deflate.go#L730-L766","documentation":"The `compress/flate` package's `compressor` setup accepts only levels in the inclusive range [-2, 9]: HuffmanOnly(-2), through BestCompression(9), plus the constant aliases. A level outside that range hits the `default` case and the function returns this error. The same range is enforced for both `flate` and the underlying DEFLATE writer.","triggerScenarios":"Calling `flate.NewWriter(w, level)` / `reset`-ing a compressor with level 10, -3, 11, or any int outside [-2,9]; passing a user-config value (e.g. from YAML) without clamping; arithmetic that produces e.g. `level = max+1`.","commonSituations":"Config file lets a user set `level: 11`; defaulting a numeric level from an env var that defaults to 0 or a sentinel interpreted as a real level; mixing up gzip/flate/zlib level ranges (they share the same -2..9, but callers sometimes pass 1..12).","solutions":["Clamp the level to the valid range: `if level < flate.HuffmanOnly { level = flate.HuffmanOnly } else if level > flate.BestCompression { level = flate.BestCompression }`.","Use the package constants (`flate.DefaultCompression`, `flate.BestSpeed`, `flate.BestCompression`, `flate.HuffmanOnly`) instead of literals.","Map a `Compression` enum from your config to one of the constants before passing it in."],"exampleFix":"// before\nw, err := flate.NewWriter(out, 11)\n// after\nlevel := 11\nif level > flate.BestCompression {\n    level = flate.BestCompression\n}\nw, err := flate.NewWriter(out, level)","handlingStrategy":"validation","validationCode":"if level < flate.HuffmanOnly || level > flate.BestCompression {\n    level = flate.DefaultCompression\n}","typeGuard":null,"tryCatchPattern":"w, err := flate.NewWriter(out, level)\nif err != nil { /* level invalid — clamp and retry */ }","preventionTips":["Always use flate's named level constants rather than raw integers.","Validate user-supplied compression levels at config-load time."],"tags":["compress","flate","argument-validation","configuration"],"backgroundTag":null,"analyzedSha":"b6b368adc57c96c3151d224d172029f233ead2c3","analyzedAt":"2026-08-12T00:22:02.250Z","schemaVersion":2},"datasetVersion":"2026-08-12T12:31:55.035Z"}