The generated gRPC service code was using locale-dependent parsing
for decimal and DateTime values. On French locale systems, this
caused FormatException when parsing "0.95" because the system
expected a comma as decimal separator.
Now uses CultureInfo.InvariantCulture for all decimal.Parse() and
DateTime.Parse() calls to ensure consistent behavior across locales.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
When a C# property is nullable (int?, long?, etc.), protobuf3 defaults
to 0 when the field is not set. The generator now treats 0 as null
for nullable numeric properties, allowing proper optional field semantics.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add ProtoPropertyName to PropertyInfo for correct proto property naming
- Fix ToPascalCaseHelper to match Grpc.Tools naming (e.g., value_per100g → ValuePer100G)
- Add IsResultNullable and ResultTypeWithoutNullable to QueryInfo
- Fix IsPrimitiveType to correctly handle nullable complex types
- Add GetCollectionElementType helper (excludes strings from collection detection)
- Use AddRange pattern for repeated/collection fields in proto messages
- Add explicit Analyzer reference in props for reliable source generator loading
- Handle null cases in single complex type response mapping
- Fix collection properties in complex results with proper nested type mapping
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>