1 /*
2  * Copyright (c) 2009-2021, Google LLC
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *     * Redistributions of source code must retain the above copyright
8  *       notice, this list of conditions and the following disclaimer.
9  *     * Redistributions in binary form must reproduce the above copyright
10  *       notice, this list of conditions and the following disclaimer in the
11  *       documentation and/or other materials provided with the distribution.
12  *     * Neither the name of Google LLC nor the
13  *       names of its contributors may be used to endorse or promote products
14  *       derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY DIRECT,
20  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 // IWYU pragma: private, include "upb/reflection/def.h"
29 
30 #ifndef UPB_REFLECTION_MESSAGE_DEF_H_
31 #define UPB_REFLECTION_MESSAGE_DEF_H_
32 
33 #include "upb/base/string_view.h"
34 #include "upb/reflection/common.h"
35 
36 // Must be last.
37 #include "upb/port/def.inc"
38 
39 // Well-known field tag numbers for map-entry messages.
40 #define kUpb_MapEntry_KeyFieldNumber 1
41 #define kUpb_MapEntry_ValueFieldNumber 2
42 
43 // Well-known field tag numbers for Any messages.
44 #define kUpb_Any_TypeFieldNumber 1
45 #define kUpb_Any_ValueFieldNumber 2
46 
47 // Well-known field tag numbers for duration messages.
48 #define kUpb_Duration_SecondsFieldNumber 1
49 #define kUpb_Duration_NanosFieldNumber 2
50 
51 // Well-known field tag numbers for timestamp messages.
52 #define kUpb_Timestamp_SecondsFieldNumber 1
53 #define kUpb_Timestamp_NanosFieldNumber 2
54 
55 // All the different kind of well known type messages. For simplicity of check,
56 // number wrappers and string wrappers are grouped together. Make sure the
57 // order and number of these groups are not changed.
58 typedef enum {
59   kUpb_WellKnown_Unspecified,
60   kUpb_WellKnown_Any,
61   kUpb_WellKnown_FieldMask,
62   kUpb_WellKnown_Duration,
63   kUpb_WellKnown_Timestamp,
64 
65   // number wrappers
66   kUpb_WellKnown_DoubleValue,
67   kUpb_WellKnown_FloatValue,
68   kUpb_WellKnown_Int64Value,
69   kUpb_WellKnown_UInt64Value,
70   kUpb_WellKnown_Int32Value,
71   kUpb_WellKnown_UInt32Value,
72 
73   // string wrappers
74   kUpb_WellKnown_StringValue,
75   kUpb_WellKnown_BytesValue,
76   kUpb_WellKnown_BoolValue,
77   kUpb_WellKnown_Value,
78   kUpb_WellKnown_ListValue,
79   kUpb_WellKnown_Struct,
80 } upb_WellKnown;
81 
82 #ifdef __cplusplus
83 extern "C" {
84 #endif
85 
86 const upb_MessageDef* upb_MessageDef_ContainingType(const upb_MessageDef* m);
87 
88 const upb_ExtensionRange* upb_MessageDef_ExtensionRange(const upb_MessageDef* m,
89                                                         int i);
90 int upb_MessageDef_ExtensionRangeCount(const upb_MessageDef* m);
91 
92 const upb_FieldDef* upb_MessageDef_Field(const upb_MessageDef* m, int i);
93 int upb_MessageDef_FieldCount(const upb_MessageDef* m);
94 
95 const upb_FileDef* upb_MessageDef_File(const upb_MessageDef* m);
96 
97 // Returns a field by either JSON name or regular proto name.
98 const upb_FieldDef* upb_MessageDef_FindByJsonNameWithSize(
99     const upb_MessageDef* m, const char* name, size_t size);
upb_MessageDef_FindByJsonName(const upb_MessageDef * m,const char * name)100 UPB_INLINE const upb_FieldDef* upb_MessageDef_FindByJsonName(
101     const upb_MessageDef* m, const char* name) {
102   return upb_MessageDef_FindByJsonNameWithSize(m, name, strlen(name));
103 }
104 
105 // Lookup of either field or oneof by name. Returns whether either was found.
106 // If the return is true, then the found def will be set, and the non-found
107 // one set to NULL.
108 bool upb_MessageDef_FindByNameWithSize(const upb_MessageDef* m,
109                                        const char* name, size_t size,
110                                        const upb_FieldDef** f,
111                                        const upb_OneofDef** o);
upb_MessageDef_FindByName(const upb_MessageDef * m,const char * name,const upb_FieldDef ** f,const upb_OneofDef ** o)112 UPB_INLINE bool upb_MessageDef_FindByName(const upb_MessageDef* m,
113                                           const char* name,
114                                           const upb_FieldDef** f,
115                                           const upb_OneofDef** o) {
116   return upb_MessageDef_FindByNameWithSize(m, name, strlen(name), f, o);
117 }
118 
119 const upb_FieldDef* upb_MessageDef_FindFieldByName(const upb_MessageDef* m,
120                                                    const char* name);
121 const upb_FieldDef* upb_MessageDef_FindFieldByNameWithSize(
122     const upb_MessageDef* m, const char* name, size_t size);
123 const upb_FieldDef* upb_MessageDef_FindFieldByNumber(const upb_MessageDef* m,
124                                                      uint32_t i);
125 const upb_OneofDef* upb_MessageDef_FindOneofByName(const upb_MessageDef* m,
126                                                    const char* name);
127 const upb_OneofDef* upb_MessageDef_FindOneofByNameWithSize(
128     const upb_MessageDef* m, const char* name, size_t size);
129 const char* upb_MessageDef_FullName(const upb_MessageDef* m);
130 bool upb_MessageDef_HasOptions(const upb_MessageDef* m);
131 bool upb_MessageDef_IsMapEntry(const upb_MessageDef* m);
132 bool upb_MessageDef_IsMessageSet(const upb_MessageDef* m);
133 
134 // Creates a mini descriptor string for a message, returns true on success.
135 bool upb_MessageDef_MiniDescriptorEncode(const upb_MessageDef* m, upb_Arena* a,
136                                          upb_StringView* out);
137 
138 const upb_MiniTable* upb_MessageDef_MiniTable(const upb_MessageDef* m);
139 const char* upb_MessageDef_Name(const upb_MessageDef* m);
140 
141 const upb_EnumDef* upb_MessageDef_NestedEnum(const upb_MessageDef* m, int i);
142 const upb_FieldDef* upb_MessageDef_NestedExtension(const upb_MessageDef* m,
143                                                    int i);
144 const upb_MessageDef* upb_MessageDef_NestedMessage(const upb_MessageDef* m,
145                                                    int i);
146 
147 int upb_MessageDef_NestedEnumCount(const upb_MessageDef* m);
148 int upb_MessageDef_NestedExtensionCount(const upb_MessageDef* m);
149 int upb_MessageDef_NestedMessageCount(const upb_MessageDef* m);
150 
151 const upb_OneofDef* upb_MessageDef_Oneof(const upb_MessageDef* m, int i);
152 int upb_MessageDef_OneofCount(const upb_MessageDef* m);
153 int upb_MessageDef_RealOneofCount(const upb_MessageDef* m);
154 
155 const UPB_DESC(MessageOptions) *
156     upb_MessageDef_Options(const upb_MessageDef* m);
157 
158 upb_StringView upb_MessageDef_ReservedName(const upb_MessageDef* m, int i);
159 int upb_MessageDef_ReservedNameCount(const upb_MessageDef* m);
160 
161 const upb_MessageReservedRange* upb_MessageDef_ReservedRange(
162     const upb_MessageDef* m, int i);
163 int upb_MessageDef_ReservedRangeCount(const upb_MessageDef* m);
164 
165 upb_Syntax upb_MessageDef_Syntax(const upb_MessageDef* m);
166 upb_WellKnown upb_MessageDef_WellKnownType(const upb_MessageDef* m);
167 
168 #ifdef __cplusplus
169 } /* extern "C" */
170 #endif
171 
172 #include "upb/port/undef.inc"
173 
174 #endif /* UPB_REFLECTION_MESSAGE_DEF_H_ */
175