blob: c775e419f11d756a69054e07ea878bd19ef97cbe [file] [log] [blame]
Jon Skeet68036862008-10-22 13:30:34 +01001using System;
2using System.Collections.Generic;
3using Google.ProtocolBuffers.Descriptors;
4
5namespace Google.ProtocolBuffers.ProtoGen {
6 internal static class SourceGenerators {
7
8 private static readonly Dictionary<Type, Func<IDescriptor, ISourceGenerator>> GeneratorFactories = new Dictionary<Type, Func<IDescriptor, ISourceGenerator>> {
9 { typeof(FileDescriptor), descriptor => new UmbrellaClassGenerator((FileDescriptor) descriptor) },
10 { typeof(EnumDescriptor), descriptor => new EnumGenerator((EnumDescriptor) descriptor) },
11 { typeof(ServiceDescriptor), descriptor => new ServiceGenerator((ServiceDescriptor) descriptor) },
12 { typeof(MessageDescriptor), descriptor => new MessageGenerator((MessageDescriptor) descriptor) },
13 // For other fields, we have IFieldSourceGenerators.
14 { typeof(FieldDescriptor), descriptor => new ExtensionGenerator((FieldDescriptor) descriptor) }
15 };
16
17 public static IFieldSourceGenerator CreateFieldGenerator(FieldDescriptor field) {
18 switch (field.MappedType) {
19 case MappedType.Message :
20 return field.IsRepeated
21 ? (IFieldSourceGenerator) new RepeatedMessageFieldGenerator(field)
22 : new MessageFieldGenerator(field);
23 case MappedType.Enum:
24 return field.IsRepeated
25 ? (IFieldSourceGenerator)new RepeatedEnumFieldGenerator(field)
26 : new EnumFieldGenerator(field);
27 default:
28 return field.IsRepeated
29 ? (IFieldSourceGenerator)new RepeatedPrimitiveFieldGenerator(field)
30 : new PrimitiveFieldGenerator(field);
31 }
32 }
33
34 public static ISourceGenerator CreateGenerator<T>(T descriptor) where T : IDescriptor {
35 Func<IDescriptor, ISourceGenerator> factory;
36 if (!GeneratorFactories.TryGetValue(typeof(T), out factory)) {
37 throw new ArgumentException("No generator registered for " + typeof(T).Name);
38 }
39 return factory(descriptor);
40 }
41 }
42}