{"record":{"id":"67144686cf51b887","repo":"iOfficeAI/OfficeCLI","slug":"invalid-softedge-value-value-expected-a-fin","errorCode":null,"errorMessage":"Invalid 'softedge' value '{value}'. Expected a finite non-negative numeric radius in points.","messagePattern":"Invalid 'softedge' value '(.+?)'\\. Expected a finite non-negative numeric radius in points\\.","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"warning","filePath":"src/officecli/Core/DrawingEffectsHelper.cs","lineNumber":170,"sourceCode":"            EndAlpha = 300,\n            EndPosition = endPos,\n            Distance = 0,\n            Direction = 5400000,\n            VerticalRatio = -100000,\n            Alignment = Drawing.RectangleAlignmentValues.BottomLeft,\n            RotateWithShape = false\n        };\n    }\n\n    /// <summary>\n    /// Build a SoftEdge element from a value string (radius in points).\n    /// </summary>\n    public static Drawing.SoftEdge BuildSoftEdge(string value)\n    {\n        var numStr = value.EndsWith(\"pt\", StringComparison.OrdinalIgnoreCase) ? value[..^2].Trim() : value;\n        if (!double.TryParse(numStr, System.Globalization.CultureInfo.InvariantCulture, out var radiusPt)\n            || double.IsNaN(radiusPt) || double.IsInfinity(radiusPt) || radiusPt < 0)\n            throw new ArgumentException($\"Invalid 'softedge' value '{value}'. Expected a finite non-negative numeric radius in points.\");\n        return new Drawing.SoftEdge { Radius = (long)(radiusPt * EmuConverter.EmuPerPoint) };\n    }\n\n    /// <summary>\n    /// Get or create EffectList in correct schema position within Drawing.RunProperties.\n    /// CT_TextCharacterProperties order: ln → fill → effectLst → highlight → ... → latin → ea → ...\n    /// </summary>\n    public static Drawing.EffectList EnsureRunEffectList(Drawing.RunProperties rPr)\n    {\n        var existing = rPr.GetFirstChild<Drawing.EffectList>();\n        if (existing != null) return existing;\n\n        var effectList = new Drawing.EffectList();\n        var insertBefore = (OpenXmlElement?)rPr.GetFirstChild<Drawing.Highlight>()\n            ?? (OpenXmlElement?)rPr.GetFirstChild<Drawing.UnderlineFollowsText>()\n            ?? (OpenXmlElement?)rPr.GetFirstChild<Drawing.Underline>()\n            ?? (OpenXmlElement?)rPr.GetFirstChild<Drawing.UnderlineFillText>()\n            ?? (OpenXmlElement?)rPr.GetFirstChild<Drawing.UnderlineFill>()","sourceCodeStart":152,"sourceCodeEnd":188,"githubUrl":"https://github.com/iOfficeAI/OfficeCLI/blob/1ced45e900782c5083ed550ddf328ee974e425e7/src/officecli/Core/DrawingEffectsHelper.cs#L152-L188","documentation":"BuildSoftEdge expects a softedge radius in points. It strips an optional trailing 'pt' (case-insensitive) and double-parses the remainder under the invariant culture, then rejects NaN, infinity, or negatives. The result is converted to EMU (radiusPt * EmuConverter.EmuPerPoint, 12700 EMU/pt).","triggerScenarios":"A softedge value like 'abc', '-5', '-5pt', '5px' (px isn't converted and parses but is misleading), 'NaN', 'infinity', or a locale decimal '5,5' parsed under invariant culture.","commonSituations":"User supplies a unit other than points ('5px', '5cm') that either fails to parse or parses misleadingly; a negative radius; a comma decimal separator on a machine where invariant culture rejects it.","solutions":["Supply a non-negative number in points, optionally with a 'pt' suffix: '8' or '8pt'.","Avoid other units (px/cm/in) — only 'pt' is recognized, bare numbers are points.","Use a '.' decimal separator."],"exampleFix":"// before\nshape.softedge=\"-5\"\nshape.softedge=\"5px\"\n\n// after\nshape.softedge=\"5\"\nshape.softedge=\"5pt\"","handlingStrategy":"validation","validationCode":"static bool IsValidSoftEdge(string v)\n{\n    var n = v.EndsWith(\"pt\", StringComparison.OrdinalIgnoreCase) ? v[..^2].Trim() : v;\n    return double.TryParse(n, CultureInfo.InvariantCulture, out var r)\n        && !double.IsNaN(r) && !double.IsInfinity(r) && r >= 0;\n}","typeGuard":null,"tryCatchPattern":"try { DrawingEffectsHelper.BuildSoftEdge(value); }\ncatch (ArgumentException ex) when (ex.Message.StartsWith(\"Invalid 'softedge'\", StringComparison.Ordinal))\n{ errors.Add(ex.Message); }","preventionTips":["Supply a non-negative number in points (optionally 'pt'-suffixed).","Avoid other units; bare numbers are points.","Use a '.' decimal separator."],"tags":["softedge","effect","validation","units","user-input","drawing"],"backgroundTag":null,"analyzedSha":"1ced45e900782c5083ed550ddf328ee974e425e7","analyzedAt":"2026-08-13T13:01:07.193Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}