Fix GrpcGenerator type mapping for commands and nullable primitives
- Add proper complex type mapping for command results (same as queries already had) - Handle nullable primitives (long?, int?, etc.) with default value fallback - Fixes CS0029 and CS0266 compilation errors in generated gRPC service implementations 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
99aebcf314
commit
661f5b4b1c
@ -904,9 +904,14 @@ namespace Svrnty.CQRS.Grpc.Generators
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Default: direct assignment (strings, ints, bools, etc.)
|
// Default: direct assignment (strings, ints, bools, etc.)
|
||||||
if (prop.IsNullable && prop.Type.Contains("string"))
|
if (prop.IsNullable)
|
||||||
{
|
{
|
||||||
return $"{indent}{prop.Name} = {source} ?? string.Empty,";
|
if (prop.Type.Contains("string"))
|
||||||
|
{
|
||||||
|
return $"{indent}{prop.Name} = {source} ?? string.Empty,";
|
||||||
|
}
|
||||||
|
// Handle nullable primitives (long?, int?, etc.) - use default value
|
||||||
|
return $"{indent}{prop.Name} = {source} ?? default,";
|
||||||
}
|
}
|
||||||
return $"{indent}{prop.Name} = {source},";
|
return $"{indent}{prop.Name} = {source},";
|
||||||
}
|
}
|
||||||
@ -1921,14 +1926,38 @@ namespace Svrnty.CQRS.Grpc.Generators
|
|||||||
if (command.HasResult)
|
if (command.HasResult)
|
||||||
{
|
{
|
||||||
sb.AppendLine(" var result = await handler.HandleAsync(command, context.CancellationToken);");
|
sb.AppendLine(" var result = await handler.HandleAsync(command, context.CancellationToken);");
|
||||||
// Handle Guid result conversion
|
|
||||||
if (command.ResultFullyQualifiedName?.Contains("System.Guid") == true)
|
// Generate response with mapping if complex type
|
||||||
|
if (command.IsResultPrimitiveType)
|
||||||
{
|
{
|
||||||
sb.AppendLine($" return new {responseType} {{ Result = result.ToString() }};");
|
// Handle primitive type result conversion (e.g., Guid.ToString())
|
||||||
|
if (command.ResultFullyQualifiedName?.Contains("System.Guid") == true)
|
||||||
|
{
|
||||||
|
sb.AppendLine($" return new {responseType} {{ Result = result.ToString() }};");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sb.AppendLine($" return new {responseType} {{ Result = result }};");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sb.AppendLine($" return new {responseType} {{ Result = result }};");
|
// Complex type - need to map from C# type to proto type
|
||||||
|
sb.AppendLine($" if (result == null)");
|
||||||
|
sb.AppendLine($" {{");
|
||||||
|
sb.AppendLine($" return new {responseType}();");
|
||||||
|
sb.AppendLine($" }}");
|
||||||
|
sb.AppendLine($" return new {responseType}");
|
||||||
|
sb.AppendLine(" {");
|
||||||
|
sb.AppendLine($" Result = new {command.ResultType}");
|
||||||
|
sb.AppendLine(" {");
|
||||||
|
foreach (var prop in command.ResultProperties)
|
||||||
|
{
|
||||||
|
var assignment = GenerateResultPropertyMapping(prop, "result", " ");
|
||||||
|
sb.AppendLine(assignment);
|
||||||
|
}
|
||||||
|
sb.AppendLine(" }");
|
||||||
|
sb.AppendLine(" };");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@ -108,6 +108,12 @@ internal static class ProtoFileTypeMapper
|
|||||||
needsImport = true;
|
needsImport = true;
|
||||||
importPath = "google/protobuf/timestamp.proto";
|
importPath = "google/protobuf/timestamp.proto";
|
||||||
return "google.protobuf.Timestamp";
|
return "google.protobuf.Timestamp";
|
||||||
|
case "DateOnly":
|
||||||
|
// DateOnly serialized as string (YYYY-MM-DD format)
|
||||||
|
return "string";
|
||||||
|
case "TimeOnly":
|
||||||
|
// TimeOnly serialized as string (HH:mm:ss format)
|
||||||
|
return "string";
|
||||||
case "TimeSpan":
|
case "TimeSpan":
|
||||||
needsImport = true;
|
needsImport = true;
|
||||||
importPath = "google/protobuf/duration.proto";
|
importPath = "google/protobuf/duration.proto";
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user