aboutsummaryrefslogtreecommitdiff
path: root/csharp/ProtocolBuffers/Descriptors/MethodDescriptor.cs
blob: 4b4dc70785d07dc2cb3f05db17211b5fe6ecd329 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
using Google.ProtocolBuffers.DescriptorProtos;

namespace Google.ProtocolBuffers.Descriptors {
  /// <summary>
  /// Describes a single method in a service.
  /// </summary>
  public class MethodDescriptor : IndexedDescriptorBase<MethodDescriptorProto, MethodOptions> {

    private readonly ServiceDescriptor service;
    private MessageDescriptor inputType;
    private MessageDescriptor outputType;

    /// <value>
    /// The service this method belongs to.
    /// </value>
    public ServiceDescriptor Service {
      get { return service; }
    }

    /// <value>
    /// The method's input type.
    /// </value>
    public MessageDescriptor InputType {
      get { return inputType; }
    }

    /// <value>
    /// The method's input type.
    /// </value>
    public MessageDescriptor OutputType {
      get { return outputType; }
    }

    internal MethodDescriptor(MethodDescriptorProto proto, FileDescriptor file,
        ServiceDescriptor parent, int index) 
        : base(proto, file, parent.FullName + "." + proto.Name, index) {
      service = parent;
      file.DescriptorPool.AddSymbol(this);
    }

    internal void CrossLink() {
      IDescriptor lookup = File.DescriptorPool.LookupSymbol(Proto.InputType, this);
      if (!(lookup is MessageDescriptor)) {
        throw new DescriptorValidationException(this, "\"" + Proto.InputType + "\" is not a message type.");
      }
      inputType = (MessageDescriptor) lookup;

      lookup = File.DescriptorPool.LookupSymbol(Proto.OutputType, this);
      if (!(lookup is MessageDescriptor)) {
        throw new DescriptorValidationException(this, "\"" + Proto.OutputType + "\" is not a message type.");
      }
      outputType = (MessageDescriptor) lookup;
    }
  }
}