{"record":{"id":"c9f532e382cbb068","repo":"Humanizr/Humanizer","slug":"unsupported-grammatical-case-c9f532","errorCode":null,"errorMessage":"Unsupported grammatical case.","messagePattern":"Unsupported grammatical case\\.","errorType":"validation","errorClass":"ArgumentOutOfRangeException","httpStatus":null,"severity":"error","filePath":"src/Humanizer/TimeSpanHumanizeExtensions.cs","lineNumber":963,"sourceCode":"        }\n\n        return grammaticalCase is null && toWords && !toSymbols\n                ? cultureFormatter.TimeSpanHumanize_Zero()\n                : FormatTimePart(\n                    cultureFormatter,\n                    minUnit,\n                    0,\n                    culture,\n                    toWords,\n                    toSymbols,\n                    grammaticalCase);\n    }\n\n    static void ValidateGrammaticalCase(GrammaticalCase grammaticalCase)\n    {\n        if ((uint)grammaticalCase > (uint)GrammaticalCase.Causal)\n        {\n            throw new ArgumentOutOfRangeException(nameof(grammaticalCase), grammaticalCase, \"Unsupported grammatical case.\");\n        }\n    }\n\n    static string ConcatenateTimeSpanParts(List<string> timeSpanParts, CultureInfo? culture, string? collectionSeparator)\n    {\n        if (collectionSeparator == null)\n        {\n            return Configurator\n                .CollectionFormatters.ResolveForCulture(culture)\n                .Humanize(timeSpanParts);\n        }\n\n        return string.Join(collectionSeparator, timeSpanParts);\n    }\n}","sourceCodeStart":945,"sourceCodeEnd":978,"githubUrl":"https://github.com/Humanizr/Humanizer/blob/ffc2b77c0f30d2fb176875841424379319d0ae9b/src/Humanizer/TimeSpanHumanizeExtensions.cs#L945-L978","documentation":"Thrown by ValidateGrammaticalCase when the GrammaticalCase enum value cast from an integer is outside the defined range (0 through Causal). This guards against undefined enum values produced by casting arbitrary integers or deserialization of invalid enum data.","triggerScenarios":"Casting an arbitrary integer to GrammaticalCase, e.g. (GrammaticalCase)999, and passing it to HumanizeWithCase. Also from deserializing JSON or config with an out-of-range case number.","commonSituations":"Enum value sourced from user input or external data without validation. Numeric cast from a database column. Serialization/deserialization round-trip that produced an invalid value.","solutions":["Validate the GrammaticalCase with Enum.IsDefined before passing it.","Use only named GrammaticalCase constants.","Default to GrammaticalCase.Nominative when the value is undefined."],"exampleFix":"// before\nvar gc = (GrammaticalCase)userValue;\nvar s = ts.HumanizeWithCase(gc, precision: 3);\n\n// after\nvar gc = Enum.IsDefined(typeof(GrammaticalCase), userValue)\n    ? (GrammaticalCase)userValue\n    : GrammaticalCase.Nominative;\nvar s = ts.HumanizeWithCase(gc, precision: 3);","handlingStrategy":"validation","validationCode":"static bool IsValidGrammaticalCase(GrammaticalCase gc) =>\n    (uint)gc <= (uint)GrammaticalCase.Causal;","typeGuard":"static GrammaticalCase SafeGrammaticalCase(int value) =>\n    Enum.IsDefined(typeof(GrammaticalCase), value)\n        ? (GrammaticalCase)value\n        : GrammaticalCase.Nominative;","tryCatchPattern":null,"preventionTips":["Always use named GrammaticalCase constants, never integer casts.","Use Enum.IsDefined to validate deserialized enum values.","Default to Nominative for invalid inputs."],"tags":["timespan","grammatical-case","enum-validation","range-check"],"backgroundTag":null,"analyzedSha":"ffc2b77c0f30d2fb176875841424379319d0ae9b","analyzedAt":"2026-08-13T21:42:34.584Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}