{"record":{"id":"27ec028139fa27c1","repo":"AvaloniaUI/Avalonia","slug":"invalid-bool-rule","errorCode":null,"errorMessage":"Invalid bool rule.","messagePattern":"Invalid bool rule\\.","errorType":"exception","errorClass":"InvalidDataException","httpStatus":null,"severity":"error","filePath":"src/Avalonia.Base/Media/PathMarkupParser.cs","lineNumber":539,"sourceCode":"                span = span.Slice(1);\n            }\n            return span;\n        }\n\n        private static ReadOnlySpan<char> SkipWhitespace(ReadOnlySpan<char> span)\n        {\n            int i = 0;\n            for (; i < span.Length && char.IsWhiteSpace(span[i]); i++) ;\n            return span.Slice(i);\n        }\n\n        private static bool ReadBool(ref ReadOnlySpan<char> span)\n        {\n            span = SkipWhitespace(span);\n            \n            if (span.IsEmpty)\n            {\n                throw new InvalidDataException(\"Invalid bool rule.\");\n            }\n            \n            var c = span[0];\n            \n            span = span.Slice(1);\n            \n            switch (c)\n            {\n                case '0':\n                    return false;\n                case '1':\n                    return true;\n                default:\n                    throw new InvalidDataException(\"Invalid bool rule\");\n            }\n        }\n\n        private static double ReadDouble(ref ReadOnlySpan<char> span)","sourceCodeStart":521,"sourceCodeEnd":557,"githubUrl":"https://github.com/AvaloniaUI/Avalonia/blob/11c542726898ae954a1ef668c65ec79ec92ab17d/src/Avalonia.Base/Media/PathMarkupParser.cs#L521-L557","documentation":"Thrown by the private ReadBool helper when the remaining span is empty at the point a boolean flag is expected. ReadBool reads single '0'/'1' characters for arc command flags (large-arc-flag and sweep-flag in an 'A' command). An empty span means the A command's arguments were truncated before both flags were supplied.","triggerScenarios":"An arc 'A' command missing its boolean flags, e.g. 'M0,0 A5,5 0' (missing large-arc-flag and sweep-flag), or 'M0,0 A5,5 0 0' (missing the sweep-flag).","commonSituations":"Hand-editing arc path data and dropping the trailing flags; converting SVG arcs and losing the flag fields; locale/format tools that strip trailing tokens.","solutions":["Provide all seven arc arguments: rx,ry x-axis-rotation large-arc-flag sweep-flag x,y.","Use '0' or '1' for both flags (e.g. large-arc-flag=0, sweep-flag=1).","Validate the arc token count before parsing if generating path data programmatically."],"exampleFix":"// before (missing sweep flag)\ngeometry.Parse(\"M0,0 A5,5 0 1 10,0\");\n// note: only one bool was supplied in a truncated string like \"M0,0 A5,5 0 0\"\n\n// after\ngeometry.Parse(\"M0,0 A5,5 0 0 1 10,0\");","handlingStrategy":"validation","validationCode":"// For each 'A' command, count arguments; require >= 7 tokens\n// (rx,ry,rot,large-arc-flag,sweep-flag,x,y). Throw/sanitize if fewer.\nstatic bool ArcHasFlags(ReadOnlySpan<char> arcArgs) => /* parse & ensure 2 flag chars present */ true;","typeGuard":"static bool IsBoolFlagChar(char c) => c is '0' or '1';","tryCatchPattern":"try { parser.Parse(data); }\ncatch (InvalidDataException ex) when (ex.Message == \"Invalid bool rule.\")\n{ /* arc flags missing — report truncated A command */ }","preventionTips":["Always emit both arc flags when generating path data.","Run path strings through an SVG-path lint/validator when they originate from external sources."],"tags":["avalonia","path-markup","arc","invalid-data","parse"],"backgroundTag":null,"analyzedSha":"11c542726898ae954a1ef668c65ec79ec92ab17d","analyzedAt":"2026-08-13T11:57:40.261Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}