{"record":{"id":"35d6f8216bb246ee","repo":"AvaloniaUI/Avalonia","slug":"invalid-hsv-color-string-s","errorCode":null,"errorMessage":"Invalid HSV color string: '{s}'.","messagePattern":"Invalid HSV color string: '(.+?)'\\.","errorType":"exception","errorClass":"FormatException","httpStatus":null,"severity":"error","filePath":"src/Avalonia.Base/Media/HsvColor.cs","lineNumber":256,"sourceCode":"\n        /// <summary>\n        /// Parses an HSV color string.\n        /// </summary>\n        /// <param name=\"s\">The HSV color string to parse.</param>\n        /// <returns>The parsed <see cref=\"HsvColor\"/>.</returns>\n        public static HsvColor Parse(string s)\n        {\n            if (s is null)\n            {\n                throw new ArgumentNullException(nameof(s));\n            }\n\n            if (TryParse(s, out HsvColor hsvColor))\n            {\n                return hsvColor;\n            }\n\n            throw new FormatException($\"Invalid HSV color string: '{s}'.\");\n        }\n\n        /// <summary>\n        /// Parses an HSV color string.\n        /// </summary>\n        /// <param name=\"s\">The HSV color string to parse.</param>\n        /// <param name=\"hsvColor\">The parsed <see cref=\"HsvColor\"/>.</param>\n        /// <returns>True if parsing was successful; otherwise, false.</returns>\n        public static bool TryParse(string? s, out HsvColor hsvColor)\n        {\n            bool prefixMatched = false;\n\n            hsvColor = default;\n\n            if (s is null)\n            {\n                return false;\n            }","sourceCodeStart":238,"sourceCodeEnd":274,"githubUrl":"https://github.com/AvaloniaUI/Avalonia/blob/11c542726898ae954a1ef668c65ec79ec92ab17d/src/Avalonia.Base/Media/HsvColor.cs#L238-L274","documentation":"HsvColor.Parse parses a 'hsv(...)' / 'hsva(...)' string into an HsvColor and throws FormatException on malformed input. It mirrors HslColor.Parse: prefix check, channel split, and per-channel range validation must all pass inside TryParse.","triggerScenarios":"Passing 'hsv(240,100,100)' with wrong separator grammar; missing a channel; using 'hsb()' (an alternate name) when the parser only accepts hsv/hsva; trailing junk after the closing paren; S/V given as percentages when the grammar expects numbers (or vice versa).","commonSituations":"Loading HSV strings from a picker UI that emits a different format than the parser expects; copy-pasting CSS (which does not standardize hsv) into an HSV field; mixing up hsl and hsv notations.","solutions":["Call HsvColor.TryParse(s, out var c) and report a friendly error on failure.","Confirm the prefix is exactly 'hsv' or 'hsva' and the channel separators match the parser grammar.","Normalize the picker output before parsing (consistent separators, channel order, % vs raw).","Dispatch by prefix if multiple color notations are supported."],"exampleFix":"// before\nvar c = HsvColor.Parse(userInput); // throws on malformed hsv string\n\n// after\nif (!HsvColor.TryParse(userInput?.Trim(), out var c))\n    return Result.Fail($\"'{userInput}' is not a valid hsv()/hsva() color.\");","handlingStrategy":"type-guard","validationCode":"if (!HsvColor.TryParse(s?.Trim(), out var c))\n    throw new ArgumentException($\"'{s}' is not a valid hsv()/hsva() color.\");","typeGuard":"static bool IsHsvColorString(string? s)\n{\n    var t = s?.Trim();\n    return t != null\n        && (t.StartsWith(\"hsv(\", StringComparison.OrdinalIgnoreCase)\n            || t.StartsWith(\"hsva(\", StringComparison.OrdinalIgnoreCase))\n        && t.EndsWith(\")\")\n        && HsvColor.TryParse(t, out _);\n}","tryCatchPattern":"try { return HsvColor.Parse(s); }\ncatch (FormatException ex) { throw new ArgumentException($\"Bad HSV: '{s}'\", ex); }","preventionTips":["Use TryParse for untrusted color strings.","Confirm the parser's expected prefix and channel separators.","Normalize picker output before parsing."],"tags":["color","hsv","parsing","format-exception","argument-validation"],"backgroundTag":null,"analyzedSha":"11c542726898ae954a1ef668c65ec79ec92ab17d","analyzedAt":"2026-08-13T11:57:40.261Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}