1#region Copyright notice and license
2// Protocol Buffers - Google's data interchange format
3// Copyright 2008 Google Inc.  All rights reserved.
4// https://developers.google.com/protocol-buffers/
5//
6// Redistribution and use in source and binary forms, with or without
7// modification, are permitted provided that the following conditions are
8// met:
9//
10//     * Redistributions of source code must retain the above copyright
11// notice, this list of conditions and the following disclaimer.
12//     * Redistributions in binary form must reproduce the above
13// copyright notice, this list of conditions and the following disclaimer
14// in the documentation and/or other materials provided with the
15// distribution.
16//     * Neither the name of Google Inc. nor the names of its
17// contributors may be used to endorse or promote products derived from
18// this software without specific prior written permission.
19//
20// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31#endregion
32
33using Google.Protobuf.Collections;
34using System;
35
36namespace Google.Protobuf.Reflection
37{
38    /// <summary>
39    /// Descriptor for a single enum value within an enum in a .proto file.
40    /// </summary>
41    public sealed class EnumValueDescriptor : DescriptorBase
42    {
43        private readonly EnumDescriptor enumDescriptor;
44        private readonly EnumValueDescriptorProto proto;
45
46        internal EnumValueDescriptor(EnumValueDescriptorProto proto, FileDescriptor file,
47                                     EnumDescriptor parent, int index)
48            : base(file, parent.FullName + "." + proto.Name, index)
49        {
50            this.proto = proto;
51            enumDescriptor = parent;
52            file.DescriptorPool.AddSymbol(this);
53            file.DescriptorPool.AddEnumValueByNumber(this);
54        }
55
56        internal EnumValueDescriptorProto Proto { get { return proto; } }
57
58        /// <summary>
59        /// Returns the name of the enum value described by this object.
60        /// </summary>
61        public override string Name { get { return proto.Name; } }
62
63        /// <summary>
64        /// Returns the number associated with this enum value.
65        /// </summary>
66        public int Number { get { return Proto.Number; } }
67
68        /// <summary>
69        /// Returns the enum descriptor that this value is part of.
70        /// </summary>
71        public EnumDescriptor EnumDescriptor { get { return enumDescriptor; } }
72
73        /// <summary>
74        /// The (possibly empty) set of custom options for this enum value.
75        /// </summary>
76        [Obsolete("CustomOptions are obsolete. Use the GetOptions() method.")]
77        public CustomOptions CustomOptions => new CustomOptions(Proto.Options?._extensions?.ValuesByNumber);
78
79        /// <summary>
80        /// The <c>EnumValueOptions</c>, defined in <c>descriptor.proto</c>.
81        /// If the options message is not present (i.e. there are no options), <c>null</c> is returned.
82        /// Custom options can be retrieved as extensions of the returned message.
83        /// NOTE: A defensive copy is created each time this property is retrieved.
84        /// </summary>
85        public EnumValueOptions GetOptions() => Proto.Options?.Clone();
86
87        /// <summary>
88        /// Gets a single value enum value option for this descriptor
89        /// </summary>
90        [Obsolete("GetOption is obsolete. Use the GetOptions() method.")]
91        public T GetOption<T>(Extension<EnumValueOptions, T> extension)
92        {
93            var value = Proto.Options.GetExtension(extension);
94            return value is IDeepCloneable<T> ? (value as IDeepCloneable<T>).Clone() : value;
95        }
96
97        /// <summary>
98        /// Gets a repeated value enum value option for this descriptor
99        /// </summary>
100        [Obsolete("GetOption is obsolete. Use the GetOptions() method.")]
101        public RepeatedField<T> GetOption<T>(RepeatedExtension<EnumValueOptions, T> extension)
102        {
103            return Proto.Options.GetExtension(extension).Clone();
104        }
105    }
106}
107