blob: 07c6aa179671ca7869d1627f4f91d65a88342eda [file] [log] [blame]
Jan Tattermuscha7fff862015-02-13 11:08:08 -08001#region Copyright notice and license
2
Jan Tattermusch7897ae92017-06-07 22:57:36 +02003// Copyright 2015 gRPC authors.
Craig Tiller190d3602015-02-18 09:23:38 -08004//
Jan Tattermusch7897ae92017-06-07 22:57:36 +02005// Licensed under the Apache License, Version 2.0 (the "License");
6// you may not use this file except in compliance with the License.
7// You may obtain a copy of the License at
Craig Tiller190d3602015-02-18 09:23:38 -08008//
Jan Tattermusch7897ae92017-06-07 22:57:36 +02009// http://www.apache.org/licenses/LICENSE-2.0
Craig Tiller190d3602015-02-18 09:23:38 -080010//
Jan Tattermusch7897ae92017-06-07 22:57:36 +020011// Unless required by applicable law or agreed to in writing, software
12// distributed under the License is distributed on an "AS IS" BASIS,
13// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14// See the License for the specific language governing permissions and
15// limitations under the License.
Jan Tattermuscha7fff862015-02-13 11:08:08 -080016
17#endregion
18
Jan Tattermusch15111f52015-02-05 18:15:14 -080019using System;
20using System.Collections.Generic;
Jan Tattermuschdc64fb52015-08-04 18:45:40 -070021using System.Collections.ObjectModel;
Mehrdad Afshari4df68ae2018-02-11 20:11:07 -080022using System.Linq;
23using Grpc.Core.Interceptors;
Jan Tattermusch286975f2015-03-12 14:04:36 -070024using Grpc.Core.Internal;
Mehrdad Afshari4df68ae2018-02-11 20:11:07 -080025using Grpc.Core.Utils;
Jan Tattermusch15111f52015-02-05 18:15:14 -080026
Jan Tattermusch30868622015-02-19 09:22:33 -080027namespace Grpc.Core
Jan Tattermusch15111f52015-02-05 18:15:14 -080028{
Jan Tattermusch286975f2015-03-12 14:04:36 -070029 /// <summary>
30 /// Mapping of method names to server call handlers.
Jan Tattermusch12855fc2015-08-24 16:43:23 -070031 /// Normally, the <c>ServerServiceDefinition</c> objects will be created by the <c>BindService</c> factory method
32 /// that is part of the autogenerated code for a protocol buffers service definition.
Jan Tattermusch286975f2015-03-12 14:04:36 -070033 /// </summary>
Jan Tattermusch15111f52015-02-05 18:15:14 -080034 public class ServerServiceDefinition
35 {
Jan Tattermuschdc64fb52015-08-04 18:45:40 -070036 readonly ReadOnlyDictionary<string, IServerCallHandler> callHandlers;
Jan Tattermusch15111f52015-02-05 18:15:14 -080037
Mehrdad Afsharicd918d92018-02-21 10:32:01 -080038 internal ServerServiceDefinition(Dictionary<string, IServerCallHandler> callHandlers)
Jan Tattermusch15111f52015-02-05 18:15:14 -080039 {
Jan Tattermuschdc64fb52015-08-04 18:45:40 -070040 this.callHandlers = new ReadOnlyDictionary<string, IServerCallHandler>(callHandlers);
Jan Tattermusch15111f52015-02-05 18:15:14 -080041 }
42
Jan Tattermuschdc64fb52015-08-04 18:45:40 -070043 internal IDictionary<string, IServerCallHandler> CallHandlers
Jan Tattermusch15111f52015-02-05 18:15:14 -080044 {
45 get
46 {
47 return this.callHandlers;
48 }
49 }
50
Jan Tattermusch12855fc2015-08-24 16:43:23 -070051 /// <summary>
52 /// Creates a new builder object for <c>ServerServiceDefinition</c>.
53 /// </summary>
Jan Tattermusch12855fc2015-08-24 16:43:23 -070054 /// <returns>The builder object.</returns>
Jan Tattermusch781720f2016-06-03 17:40:28 -070055 public static Builder CreateBuilder()
Jan Tattermusch15111f52015-02-05 18:15:14 -080056 {
Jan Tattermusch781720f2016-06-03 17:40:28 -070057 return new Builder();
Jan Tattermusch15111f52015-02-05 18:15:14 -080058 }
59
Jan Tattermusch12855fc2015-08-24 16:43:23 -070060 /// <summary>
61 /// Builder class for <see cref="ServerServiceDefinition"/>.
62 /// </summary>
Jan Tattermusch15111f52015-02-05 18:15:14 -080063 public class Builder
64 {
Jan Tattermusch075dde42015-03-11 18:21:00 -070065 readonly Dictionary<string, IServerCallHandler> callHandlers = new Dictionary<string, IServerCallHandler>();
Jan Tattermusch15111f52015-02-05 18:15:14 -080066
Jan Tattermusch12855fc2015-08-24 16:43:23 -070067 /// <summary>
68 /// Creates a new instance of builder.
69 /// </summary>
Jan Tattermusch781720f2016-06-03 17:40:28 -070070 public Builder()
Jan Tattermusch15111f52015-02-05 18:15:14 -080071 {
Jan Tattermusch15111f52015-02-05 18:15:14 -080072 }
73
Jan Tattermusch12855fc2015-08-24 16:43:23 -070074 /// <summary>
75 /// Adds a definitions for a single request - single response method.
76 /// </summary>
77 /// <typeparam name="TRequest">The request message class.</typeparam>
78 /// <typeparam name="TResponse">The response message class.</typeparam>
79 /// <param name="method">The method.</param>
80 /// <param name="handler">The method handler.</param>
81 /// <returns>This builder instance.</returns>
Jan Tattermusch15111f52015-02-05 18:15:14 -080082 public Builder AddMethod<TRequest, TResponse>(
Craig Tiller190d3602015-02-18 09:23:38 -080083 Method<TRequest, TResponse> method,
Jan Tattermuscha5272b62015-04-30 11:56:46 -070084 UnaryServerMethod<TRequest, TResponse> handler)
Jan Tattermuschbdb1b482015-05-06 14:46:25 -070085 where TRequest : class
86 where TResponse : class
Jan Tattermusch15111f52015-02-05 18:15:14 -080087 {
Jan Tattermusch66eb18d2015-08-09 20:03:24 -070088 callHandlers.Add(method.FullName, ServerCalls.UnaryCall(method, handler));
Jan Tattermusch15111f52015-02-05 18:15:14 -080089 return this;
90 }
91
Jan Tattermusch12855fc2015-08-24 16:43:23 -070092 /// <summary>
93 /// Adds a definitions for a client streaming method.
94 /// </summary>
95 /// <typeparam name="TRequest">The request message class.</typeparam>
96 /// <typeparam name="TResponse">The response message class.</typeparam>
97 /// <param name="method">The method.</param>
98 /// <param name="handler">The method handler.</param>
99 /// <returns>This builder instance.</returns>
Jan Tattermusch15111f52015-02-05 18:15:14 -0800100 public Builder AddMethod<TRequest, TResponse>(
Craig Tiller190d3602015-02-18 09:23:38 -0800101 Method<TRequest, TResponse> method,
Jan Tattermuscha5272b62015-04-30 11:56:46 -0700102 ClientStreamingServerMethod<TRequest, TResponse> handler)
Jan Tattermuschbdb1b482015-05-06 14:46:25 -0700103 where TRequest : class
104 where TResponse : class
Jan Tattermusch15111f52015-02-05 18:15:14 -0800105 {
Jan Tattermusch66eb18d2015-08-09 20:03:24 -0700106 callHandlers.Add(method.FullName, ServerCalls.ClientStreamingCall(method, handler));
Jan Tattermuscha5272b62015-04-30 11:56:46 -0700107 return this;
108 }
109
Jan Tattermusch12855fc2015-08-24 16:43:23 -0700110 /// <summary>
111 /// Adds a definitions for a server streaming method.
112 /// </summary>
113 /// <typeparam name="TRequest">The request message class.</typeparam>
114 /// <typeparam name="TResponse">The response message class.</typeparam>
115 /// <param name="method">The method.</param>
116 /// <param name="handler">The method handler.</param>
117 /// <returns>This builder instance.</returns>
Jan Tattermuscha5272b62015-04-30 11:56:46 -0700118 public Builder AddMethod<TRequest, TResponse>(
119 Method<TRequest, TResponse> method,
120 ServerStreamingServerMethod<TRequest, TResponse> handler)
Jan Tattermuschbdb1b482015-05-06 14:46:25 -0700121 where TRequest : class
122 where TResponse : class
Jan Tattermuscha5272b62015-04-30 11:56:46 -0700123 {
Jan Tattermusch66eb18d2015-08-09 20:03:24 -0700124 callHandlers.Add(method.FullName, ServerCalls.ServerStreamingCall(method, handler));
Jan Tattermuscha5272b62015-04-30 11:56:46 -0700125 return this;
126 }
127
Jan Tattermusch12855fc2015-08-24 16:43:23 -0700128 /// <summary>
129 /// Adds a definitions for a bidirectional streaming method.
130 /// </summary>
131 /// <typeparam name="TRequest">The request message class.</typeparam>
132 /// <typeparam name="TResponse">The response message class.</typeparam>
133 /// <param name="method">The method.</param>
134 /// <param name="handler">The method handler.</param>
135 /// <returns>This builder instance.</returns>
Jan Tattermuscha5272b62015-04-30 11:56:46 -0700136 public Builder AddMethod<TRequest, TResponse>(
137 Method<TRequest, TResponse> method,
138 DuplexStreamingServerMethod<TRequest, TResponse> handler)
Jan Tattermuschbdb1b482015-05-06 14:46:25 -0700139 where TRequest : class
140 where TResponse : class
Jan Tattermuscha5272b62015-04-30 11:56:46 -0700141 {
Jan Tattermusch66eb18d2015-08-09 20:03:24 -0700142 callHandlers.Add(method.FullName, ServerCalls.DuplexStreamingCall(method, handler));
Jan Tattermusch15111f52015-02-05 18:15:14 -0800143 return this;
144 }
145
Jan Tattermusch12855fc2015-08-24 16:43:23 -0700146 /// <summary>
147 /// Creates an immutable <c>ServerServiceDefinition</c> from this builder.
148 /// </summary>
149 /// <returns>The <c>ServerServiceDefinition</c> object.</returns>
Jan Tattermusch15111f52015-02-05 18:15:14 -0800150 public ServerServiceDefinition Build()
151 {
Jan Tattermuschdc64fb52015-08-04 18:45:40 -0700152 return new ServerServiceDefinition(callHandlers);
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700153 }
Jan Tattermusch15111f52015-02-05 18:15:14 -0800154 }
155 }
156}