blob: 59868c1f402baacb074b60cb08327691ca9abe0f [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;
Jan Tattermusch286975f2015-03-12 14:04:36 -070022using Grpc.Core.Internal;
Jan Tattermusch15111f52015-02-05 18:15:14 -080023
Jan Tattermusch30868622015-02-19 09:22:33 -080024namespace Grpc.Core
Jan Tattermusch15111f52015-02-05 18:15:14 -080025{
Jan Tattermusch286975f2015-03-12 14:04:36 -070026 /// <summary>
27 /// Mapping of method names to server call handlers.
Jan Tattermusch12855fc2015-08-24 16:43:23 -070028 /// Normally, the <c>ServerServiceDefinition</c> objects will be created by the <c>BindService</c> factory method
29 /// that is part of the autogenerated code for a protocol buffers service definition.
Jan Tattermusch286975f2015-03-12 14:04:36 -070030 /// </summary>
Jan Tattermusch15111f52015-02-05 18:15:14 -080031 public class ServerServiceDefinition
32 {
Jan Tattermuschdc64fb52015-08-04 18:45:40 -070033 readonly ReadOnlyDictionary<string, IServerCallHandler> callHandlers;
Jan Tattermusch15111f52015-02-05 18:15:14 -080034
Jan Tattermuschdc64fb52015-08-04 18:45:40 -070035 private ServerServiceDefinition(Dictionary<string, IServerCallHandler> callHandlers)
Jan Tattermusch15111f52015-02-05 18:15:14 -080036 {
Jan Tattermuschdc64fb52015-08-04 18:45:40 -070037 this.callHandlers = new ReadOnlyDictionary<string, IServerCallHandler>(callHandlers);
Jan Tattermusch15111f52015-02-05 18:15:14 -080038 }
39
Jan Tattermuschdc64fb52015-08-04 18:45:40 -070040 internal IDictionary<string, IServerCallHandler> CallHandlers
Jan Tattermusch15111f52015-02-05 18:15:14 -080041 {
42 get
43 {
44 return this.callHandlers;
45 }
46 }
47
Jan Tattermusch12855fc2015-08-24 16:43:23 -070048 /// <summary>
49 /// Creates a new builder object for <c>ServerServiceDefinition</c>.
50 /// </summary>
Jan Tattermusch12855fc2015-08-24 16:43:23 -070051 /// <returns>The builder object.</returns>
Jan Tattermusch781720f2016-06-03 17:40:28 -070052 public static Builder CreateBuilder()
Jan Tattermusch15111f52015-02-05 18:15:14 -080053 {
Jan Tattermusch781720f2016-06-03 17:40:28 -070054 return new Builder();
Jan Tattermusch15111f52015-02-05 18:15:14 -080055 }
56
Jan Tattermusch12855fc2015-08-24 16:43:23 -070057 /// <summary>
58 /// Builder class for <see cref="ServerServiceDefinition"/>.
59 /// </summary>
Jan Tattermusch15111f52015-02-05 18:15:14 -080060 public class Builder
61 {
Jan Tattermusch075dde42015-03-11 18:21:00 -070062 readonly Dictionary<string, IServerCallHandler> callHandlers = new Dictionary<string, IServerCallHandler>();
Jan Tattermusch15111f52015-02-05 18:15:14 -080063
Jan Tattermusch12855fc2015-08-24 16:43:23 -070064 /// <summary>
65 /// Creates a new instance of builder.
66 /// </summary>
Jan Tattermusch781720f2016-06-03 17:40:28 -070067 public Builder()
Jan Tattermusch15111f52015-02-05 18:15:14 -080068 {
Jan Tattermusch15111f52015-02-05 18:15:14 -080069 }
70
Jan Tattermusch12855fc2015-08-24 16:43:23 -070071 /// <summary>
72 /// Adds a definitions for a single request - single response method.
73 /// </summary>
74 /// <typeparam name="TRequest">The request message class.</typeparam>
75 /// <typeparam name="TResponse">The response message class.</typeparam>
76 /// <param name="method">The method.</param>
77 /// <param name="handler">The method handler.</param>
78 /// <returns>This builder instance.</returns>
Jan Tattermusch15111f52015-02-05 18:15:14 -080079 public Builder AddMethod<TRequest, TResponse>(
Craig Tiller190d3602015-02-18 09:23:38 -080080 Method<TRequest, TResponse> method,
Jan Tattermuscha5272b62015-04-30 11:56:46 -070081 UnaryServerMethod<TRequest, TResponse> handler)
Jan Tattermuschbdb1b482015-05-06 14:46:25 -070082 where TRequest : class
83 where TResponse : class
Jan Tattermusch15111f52015-02-05 18:15:14 -080084 {
Jan Tattermusch66eb18d2015-08-09 20:03:24 -070085 callHandlers.Add(method.FullName, ServerCalls.UnaryCall(method, handler));
Jan Tattermusch15111f52015-02-05 18:15:14 -080086 return this;
87 }
88
Jan Tattermusch12855fc2015-08-24 16:43:23 -070089 /// <summary>
90 /// Adds a definitions for a client streaming method.
91 /// </summary>
92 /// <typeparam name="TRequest">The request message class.</typeparam>
93 /// <typeparam name="TResponse">The response message class.</typeparam>
94 /// <param name="method">The method.</param>
95 /// <param name="handler">The method handler.</param>
96 /// <returns>This builder instance.</returns>
Jan Tattermusch15111f52015-02-05 18:15:14 -080097 public Builder AddMethod<TRequest, TResponse>(
Craig Tiller190d3602015-02-18 09:23:38 -080098 Method<TRequest, TResponse> method,
Jan Tattermuscha5272b62015-04-30 11:56:46 -070099 ClientStreamingServerMethod<TRequest, TResponse> handler)
Jan Tattermuschbdb1b482015-05-06 14:46:25 -0700100 where TRequest : class
101 where TResponse : class
Jan Tattermusch15111f52015-02-05 18:15:14 -0800102 {
Jan Tattermusch66eb18d2015-08-09 20:03:24 -0700103 callHandlers.Add(method.FullName, ServerCalls.ClientStreamingCall(method, handler));
Jan Tattermuscha5272b62015-04-30 11:56:46 -0700104 return this;
105 }
106
Jan Tattermusch12855fc2015-08-24 16:43:23 -0700107 /// <summary>
108 /// Adds a definitions for a server streaming method.
109 /// </summary>
110 /// <typeparam name="TRequest">The request message class.</typeparam>
111 /// <typeparam name="TResponse">The response message class.</typeparam>
112 /// <param name="method">The method.</param>
113 /// <param name="handler">The method handler.</param>
114 /// <returns>This builder instance.</returns>
Jan Tattermuscha5272b62015-04-30 11:56:46 -0700115 public Builder AddMethod<TRequest, TResponse>(
116 Method<TRequest, TResponse> method,
117 ServerStreamingServerMethod<TRequest, TResponse> handler)
Jan Tattermuschbdb1b482015-05-06 14:46:25 -0700118 where TRequest : class
119 where TResponse : class
Jan Tattermuscha5272b62015-04-30 11:56:46 -0700120 {
Jan Tattermusch66eb18d2015-08-09 20:03:24 -0700121 callHandlers.Add(method.FullName, ServerCalls.ServerStreamingCall(method, handler));
Jan Tattermuscha5272b62015-04-30 11:56:46 -0700122 return this;
123 }
124
Jan Tattermusch12855fc2015-08-24 16:43:23 -0700125 /// <summary>
126 /// Adds a definitions for a bidirectional streaming method.
127 /// </summary>
128 /// <typeparam name="TRequest">The request message class.</typeparam>
129 /// <typeparam name="TResponse">The response message class.</typeparam>
130 /// <param name="method">The method.</param>
131 /// <param name="handler">The method handler.</param>
132 /// <returns>This builder instance.</returns>
Jan Tattermuscha5272b62015-04-30 11:56:46 -0700133 public Builder AddMethod<TRequest, TResponse>(
134 Method<TRequest, TResponse> method,
135 DuplexStreamingServerMethod<TRequest, TResponse> handler)
Jan Tattermuschbdb1b482015-05-06 14:46:25 -0700136 where TRequest : class
137 where TResponse : class
Jan Tattermuscha5272b62015-04-30 11:56:46 -0700138 {
Jan Tattermusch66eb18d2015-08-09 20:03:24 -0700139 callHandlers.Add(method.FullName, ServerCalls.DuplexStreamingCall(method, handler));
Jan Tattermusch15111f52015-02-05 18:15:14 -0800140 return this;
141 }
142
Jan Tattermusch12855fc2015-08-24 16:43:23 -0700143 /// <summary>
144 /// Creates an immutable <c>ServerServiceDefinition</c> from this builder.
145 /// </summary>
146 /// <returns>The <c>ServerServiceDefinition</c> object.</returns>
Jan Tattermusch15111f52015-02-05 18:15:14 -0800147 public ServerServiceDefinition Build()
148 {
Jan Tattermuschdc64fb52015-08-04 18:45:40 -0700149 return new ServerServiceDefinition(callHandlers);
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700150 }
Jan Tattermusch15111f52015-02-05 18:15:14 -0800151 }
152 }
153}