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