9
9
using System . Collections . Generic ;
10
10
using System . IO ;
11
11
using System . Linq ;
12
+ using System . Runtime . InteropServices ;
12
13
13
14
namespace ProtoBuf . Grpc . Reflection
14
15
{
@@ -40,34 +41,38 @@ private static void Populate(FileDescriptorSet fileDescriptorSet, Type serviceTy
40
41
41
42
var serviceDescriptor = new ServiceDescriptorProto
42
43
{
43
- Name = serviceName ! . Split ( '.' ) . Last ( )
44
+ Name = ServiceBinder . GetNameParts ( serviceName , serviceType , out var package ) ,
44
45
} ;
45
46
46
47
var dependencies = new HashSet < string > ( ) ;
47
48
foreach ( var op in ContractOperation . FindOperations ( binderConfiguration , serviceContract , null ) )
48
49
{
49
50
// TODO: Validate op
50
- serviceDescriptor . Methods . Add ( new MethodDescriptorProto
51
+ if ( TryGetType ( binderConfiguration , op . From , fileDescriptorSet , out var inputType , out var inputFile )
52
+ && TryGetType ( binderConfiguration , op . From , fileDescriptorSet , out var outputType , out var outputFile ) )
51
53
{
52
- Name = op . Name ,
53
- InputType = GetType ( binderConfiguration , op . From , fileDescriptorSet , out string ? inputFile ) ,
54
- OutputType = GetType ( binderConfiguration , op . To , fileDescriptorSet , out string ? outputFile ) ,
55
- ClientStreaming = op . MethodType == MethodType . ClientStreaming ||
56
- op . MethodType == MethodType . DuplexStreaming ,
57
- ServerStreaming = op . MethodType == MethodType . ServerStreaming ||
58
- op . MethodType == MethodType . DuplexStreaming
59
- } ) ;
60
-
61
- dependencies . Add ( inputFile ) ;
62
- dependencies . Add ( outputFile ) ;
54
+ serviceDescriptor . Methods . Add ( new MethodDescriptorProto
55
+ {
56
+ Name = op . Name ,
57
+ InputType = inputType ,
58
+ OutputType = outputType ,
59
+ ClientStreaming = op . MethodType == MethodType . ClientStreaming ||
60
+ op . MethodType == MethodType . DuplexStreaming ,
61
+ ServerStreaming = op . MethodType == MethodType . ServerStreaming ||
62
+ op . MethodType == MethodType . DuplexStreaming
63
+ } ) ;
64
+
65
+ dependencies . Add ( inputFile ) ;
66
+ dependencies . Add ( outputFile ) ;
67
+ }
63
68
}
64
69
65
70
var fileDescriptor = new FileDescriptorProto
66
71
{
67
72
Name = serviceName + ".proto" ,
68
73
Services = { serviceDescriptor } ,
69
74
Syntax = "proto3" ,
70
- Package = serviceContract . Namespace
75
+ Package = package
71
76
} ;
72
77
73
78
foreach ( var dependency in dependencies )
@@ -80,7 +85,7 @@ private static void Populate(FileDescriptorSet fileDescriptorSet, Type serviceTy
80
85
}
81
86
}
82
87
83
- private static string GetType ( BinderConfiguration binderConfiguration , Type type , FileDescriptorSet fileDescriptorSet , out string descriptorProto )
88
+ private static bool TryGetType ( BinderConfiguration binderConfiguration , Type type , FileDescriptorSet fileDescriptorSet , out string fullyQualifiedName , out string descriptorProto )
84
89
{
85
90
var typeName = type . Name ;
86
91
var fileName = type . FullName + ".proto" ;
@@ -95,13 +100,23 @@ private static string GetType(BinderConfiguration binderConfiguration, Type type
95
100
using var reader = new StringReader ( schema ) ;
96
101
97
102
fileDescriptorSet . Add ( fileName , includeInOutput : true , reader ) ;
98
- fileDescriptor = fileDescriptorSet . Files . Single ( f => f . Name . Equals ( fileName , StringComparison . Ordinal ) ) ;
103
+ fileDescriptor = fileDescriptorSet . Files . SingleOrDefault ( f => f . Name . Equals ( fileName , StringComparison . Ordinal ) ) ;
104
+ if ( fileDescriptor is null )
105
+ {
106
+ fullyQualifiedName = descriptorProto = "" ;
107
+ return false ;
108
+ }
99
109
}
100
110
111
+ var msgType = fileDescriptor . MessageTypes . SingleOrDefault ( m => m . Name . Equals ( typeName , StringComparison . OrdinalIgnoreCase ) ) ;
112
+ if ( msgType is null )
113
+ {
114
+ fullyQualifiedName = descriptorProto = "" ;
115
+ return false ;
116
+ }
101
117
descriptorProto = fileDescriptor . Name ;
102
-
103
- return "." + fileDescriptor . Package + "." + fileDescriptor . MessageTypes
104
- . Single ( m => m . Name . Equals ( typeName , StringComparison . OrdinalIgnoreCase ) ) . Name ;
118
+ fullyQualifiedName = "." + fileDescriptor . Package + "." + msgType . Name ;
119
+ return true ;
105
120
}
106
121
}
107
122
}
0 commit comments