skir-cc-gen 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,282 @@
1
+ // Skir client library for testing
2
+
3
+ #ifndef SKIR_SKIR_TESTING_H
4
+ #define SKIR_SKIR_TESTING_H
5
+
6
+ #include <gtest/gtest.h>
7
+
8
+ #include <sstream>
9
+ #include <string>
10
+ #include <utility>
11
+ #include <vector>
12
+
13
+ #include "absl/base/nullability.h"
14
+ #include "absl/log/die_if_null.h"
15
+ #include "gmock/gmock.h"
16
+ #include "skir.h"
17
+
18
+ namespace testing {
19
+ namespace skirout {
20
+ template <typename Struct>
21
+ struct StructIs {
22
+ static_assert(skir::reflection::IsStruct<Struct>());
23
+ static_assert(false, "did you forget to include the *.testing.h file?");
24
+ };
25
+ } // namespace skirout
26
+
27
+ namespace skir_internal {
28
+ template <typename Matcher>
29
+ bool IsAnythingMatcher(const Matcher& matcher) {
30
+ static const std::string* absl_nonnull const kIsAnything = []() {
31
+ std::stringstream ss;
32
+ _.DescribeTo(&ss);
33
+ return new std::string(ss.str());
34
+ }();
35
+ std::stringstream ss;
36
+ matcher.DescribeTo(&ss);
37
+ return ss.str() == *kIsAnything;
38
+ }
39
+
40
+ namespace field_matcher {
41
+
42
+ // Helper function to do comma folding in C++11.
43
+ // The array ensures left-to-right order of evaluation.
44
+ // Usage: VariadicExpand({expr...});
45
+ template <typename T, size_t N>
46
+ void VariadicExpand(const T (&)[N]) {}
47
+
48
+ template <typename Getter, typename Matcher>
49
+ std::nullopt_t DescribeTo(const std::pair<Getter, Matcher>& field_matcher,
50
+ ::std::ostream* absl_nonnull os, bool& first) {
51
+ const Matcher& matcher = field_matcher.second;
52
+ if (IsAnythingMatcher(matcher)) return std::nullopt;
53
+ *os << (first ? "" : ", and ") << "has field " << Getter::kFieldName
54
+ << " that ";
55
+ matcher.DescribeTo(os);
56
+ first = false;
57
+ return std::nullopt;
58
+ }
59
+
60
+ template <typename Getter, typename Matcher>
61
+ std::nullopt_t DescribeNegationTo(
62
+ const std::pair<Getter, Matcher>& field_matcher,
63
+ ::std::ostream* absl_nonnull os, bool& first) {
64
+ const Matcher& matcher = field_matcher.second;
65
+
66
+ if (IsAnythingMatcher(matcher)) return std::nullopt;
67
+ *os << (first ? "" : ", or ") << "has field " << Getter::kFieldName
68
+ << " that ";
69
+ matcher.DescribeNegationTo(os);
70
+ first = false;
71
+ return std::nullopt;
72
+ }
73
+
74
+ template <size_t I, typename Struct, typename FieldMatcher>
75
+ std::nullopt_t MatchAndExplain(
76
+ const FieldMatcher& field_matcher, const Struct& t,
77
+ StringMatchResultListener* absl_nonnull inner_listener,
78
+ size_t& failed_pos) {
79
+ if (failed_pos != ~size_t{}) return std::nullopt;
80
+ const auto& [getter, matcher] = field_matcher;
81
+ if (IsAnythingMatcher(matcher)) return std::nullopt;
82
+ if (!matcher.MatchAndExplain(getter(t), inner_listener)) {
83
+ failed_pos = I;
84
+ }
85
+ return std::nullopt;
86
+ }
87
+
88
+ template <typename FieldMatcher, typename Struct>
89
+ bool Matches(const FieldMatcher& field_matcher, const Struct& t) {
90
+ const auto& [getter, matcher] = field_matcher;
91
+ if (IsAnythingMatcher(matcher)) return true;
92
+ return matcher.Matches(getter(t));
93
+ }
94
+
95
+ } // namespace field_matcher
96
+
97
+ template <typename Struct, typename FieldMatchers, typename StructSize>
98
+ class StructIsMatcherImpl;
99
+
100
+ template <typename Struct, typename FieldMatchers, size_t... I>
101
+ class StructIsMatcherImpl<Struct, FieldMatchers, std::index_sequence<I...>>
102
+ : public MatcherInterface<const Struct&> {
103
+ public:
104
+ explicit StructIsMatcherImpl(FieldMatchers matchers)
105
+ : matchers_(std::move(matchers)) {
106
+ field_matcher::VariadicExpand({(field_names_.emplace_back(
107
+ decltype(std::get<I>(matchers_).first)::kFieldName))...});
108
+ }
109
+
110
+ void DescribeTo(::std::ostream* absl_nonnull os) const override {
111
+ bool first = true;
112
+ field_matcher::VariadicExpand(
113
+ {(field_matcher::DescribeTo(std::get<I>(matchers_), os, first))...});
114
+ if (first) {
115
+ *os << "is anything";
116
+ }
117
+ }
118
+
119
+ void DescribeNegationTo(::std::ostream* absl_nonnull os) const override {
120
+ bool first = true;
121
+ field_matcher::VariadicExpand({(field_matcher::DescribeNegationTo(
122
+ std::get<I>(matchers_), os, first))...});
123
+ if (first) {
124
+ *os << "never matches";
125
+ }
126
+ }
127
+
128
+ bool MatchAndExplain(const Struct& t, MatchResultListener* absl_nonnull
129
+ listener) const override {
130
+ return MatchInternal(t, listener);
131
+ }
132
+
133
+ private:
134
+ bool MatchInternal(const Struct& t,
135
+ MatchResultListener* absl_nonnull listener) const {
136
+ if (!listener->IsInterested()) {
137
+ // If the listener is not interested, we don't need to construct the
138
+ // explanation.
139
+ bool good = true;
140
+ field_matcher::VariadicExpand(
141
+ {good =
142
+ good && field_matcher::Matches(std::get<I>(matchers_), t)...});
143
+ return good;
144
+ }
145
+ size_t failed_pos = ~size_t{};
146
+ std::vector<StringMatchResultListener> inner_listener(sizeof...(I));
147
+ field_matcher::VariadicExpand({field_matcher::MatchAndExplain<I>(
148
+ std::get<I>(matchers_), t, &inner_listener[I], failed_pos)...});
149
+ if (failed_pos != ~size_t{}) {
150
+ *listener << "whose field " << field_names_[failed_pos]
151
+ << " does not match";
152
+ const std::string explanation = inner_listener[failed_pos].str();
153
+ if (!explanation.empty() && listener->stream() != nullptr) {
154
+ *listener->stream() << ", " << explanation;
155
+ }
156
+ return false;
157
+ }
158
+ *listener << "whose all elements match";
159
+ const char* separator = ", where";
160
+ for (size_t index = 0; index < sizeof...(I); ++index) {
161
+ const std::string str = inner_listener[index].str();
162
+ if (!str.empty()) {
163
+ *listener << separator << " field " << field_names_[index]
164
+ << " is a value " << str;
165
+ separator = ", and";
166
+ }
167
+ }
168
+ return true;
169
+ }
170
+
171
+ FieldMatchers matchers_;
172
+ std::vector<absl::string_view> field_names_;
173
+ };
174
+
175
+ template <typename Struct, typename... FieldMatcher>
176
+ Matcher<Struct> StructIs(FieldMatcher... matchers) {
177
+ return Matcher<Struct>(
178
+ new StructIsMatcherImpl<Struct, tuple<FieldMatcher...>,
179
+ std::index_sequence_for<FieldMatcher...>>(
180
+ std::make_tuple(matchers...)));
181
+ }
182
+
183
+ template <typename Option, typename InnerMatcher>
184
+ class EnumValueIsMatcher {
185
+ public:
186
+ explicit EnumValueIsMatcher(InnerMatcher matcher)
187
+ : matcher_(std::move(matcher)) {}
188
+
189
+ template <typename Enum>
190
+ operator Matcher<Enum>() const {
191
+ return Matcher<Enum>(new Impl<Enum>(matcher_));
192
+ }
193
+
194
+ private:
195
+ // The monomorphic implementation that works for a particular enum type.
196
+ template <typename Enum>
197
+ class Impl : public MatcherInterface<const Enum&> {
198
+ public:
199
+ using value_type =
200
+ decltype(*Option::get_or_null(std::declval<const Enum&>()));
201
+
202
+ explicit Impl(const InnerMatcher& matcher)
203
+ : matcher_(MatcherCast<const value_type&>(matcher)) {}
204
+
205
+ void DescribeTo(::std::ostream* absl_nonnull os) const override {
206
+ *os << "is a " << Option::kVariantName;
207
+ if (!IsAnythingMatcher(matcher_)) {
208
+ *os << " that ";
209
+ matcher_.DescribeTo(os);
210
+ }
211
+ }
212
+
213
+ void DescribeNegationTo(::std::ostream* absl_nonnull os) const override {
214
+ *os << "is not a " << Option::kVariantName;
215
+ if (!IsAnythingMatcher(matcher_)) {
216
+ *os << " that ";
217
+ matcher_.DescribeTo(os);
218
+ }
219
+ }
220
+
221
+ bool MatchAndExplain(const Enum& e, MatchResultListener* absl_nonnull
222
+ listener) const override {
223
+ const auto* actual_value = Option::get_or_null(e);
224
+ if (actual_value == nullptr) {
225
+ *listener << "which is " << e;
226
+ return false;
227
+ } else {
228
+ *listener << "which is ";
229
+ return MatchPrintAndExplain(*actual_value, matcher_, listener);
230
+ }
231
+ }
232
+
233
+ private:
234
+ const Matcher<value_type> matcher_;
235
+ };
236
+
237
+ const InnerMatcher matcher_;
238
+ };
239
+
240
+ template <typename Option, typename InnerMatcher>
241
+ EnumValueIsMatcher<Option, InnerMatcher> EnumValueIs(InnerMatcher matcher) {
242
+ return EnumValueIsMatcher<Option, InnerMatcher>(std::move(matcher));
243
+ }
244
+
245
+ template <typename FakeOrMockApiImpl>
246
+ class ClientForTesting : public ::skir::service::Client {
247
+ public:
248
+ explicit ClientForTesting(FakeOrMockApiImpl* absl_nonnull api_impl)
249
+ : api_impl_(*ABSL_DIE_IF_NULL(api_impl)) {}
250
+
251
+ virtual ~ClientForTesting() = default;
252
+
253
+ absl::StatusOr<std::string> operator()(
254
+ absl::string_view request_data,
255
+ const skir::service::HttpHeaders& request_headers,
256
+ skir::service::HttpHeaders& response_headers) const override {
257
+ return ::skir::service::HandleRequest(api_impl_, request_data,
258
+ request_headers, response_headers)
259
+ .AsStatus();
260
+ }
261
+
262
+ private:
263
+ FakeOrMockApiImpl& api_impl_;
264
+ };
265
+
266
+ } // namespace skir_internal
267
+ } // namespace testing
268
+
269
+ namespace skir {
270
+ namespace service {
271
+
272
+ template <typename FakeOrMockApiImpl>
273
+ std::unique_ptr<::skir::service::Client> MakeClientForTesting(
274
+ FakeOrMockApiImpl* absl_nonnull api_impl) {
275
+ return std::make_unique<
276
+ testing::skir_internal::ClientForTesting<FakeOrMockApiImpl>>(api_impl);
277
+ }
278
+
279
+ } // namespace service
280
+ } // namespace skir
281
+
282
+ #endif
@@ -0,0 +1,33 @@
1
+ import { Doc, Field } from "skir-internal";
2
+ import { TypeSpeller } from "./type_speller.js";
3
+ interface MutableEnumField {
4
+ /** As specified in the .skir file. */
5
+ readonly fieldName: string;
6
+ /** Examples: "bool", "Foo". Empty if the field is a constant field. */
7
+ readonly valueType: string;
8
+ /** Examples: "bool", "foo::Foo". Empty if the field is a constant field. */
9
+ readonly valueTypeWithNamespace: string;
10
+ /** As specified in the .skir file. */
11
+ fieldNumber: number;
12
+ /** Whether the field is the special UNKNOWN field. */
13
+ isUnknownField: boolean;
14
+ /** Examples: "f_field", "wrap_field". */
15
+ readonly structType: string;
16
+ /** Example: "wrap_field_type". Empty if the field is a constant field. */
17
+ readonly typeAlias: string;
18
+ /** kField or wrap_field. */
19
+ readonly identifier: string;
20
+ /** kConstField or kValField */
21
+ readonly kindEnumerator: string;
22
+ /**
23
+ * True if the field is a wrapper field and the value should be allocated on
24
+ * the
25
+ heap.
26
+ */
27
+ readonly usePointer: boolean;
28
+ readonly doc: Doc;
29
+ }
30
+ export type EnumField = Readonly<MutableEnumField>;
31
+ export declare function getEnumFields(fields: readonly Field[], typeSpeller: TypeSpeller): readonly EnumField[];
32
+ export {};
33
+ //# sourceMappingURL=enum_field.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enum_field.d.ts","sourceRoot":"","sources":["../src/enum_field.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,KAAK,EAA6B,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,UAAU,gBAAgB;IACxB,sCAAsC;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,uEAAuE;IACvE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,4EAA4E;IAC5E,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,sCAAsC;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,cAAc,EAAE,OAAO,CAAC;IACxB,yCAAyC;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,0EAA0E;IAC1E,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,4BAA4B;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,+BAA+B;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;CACnB;AAED,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAC;AAEnD,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,KAAK,EAAE,EACxB,WAAW,EAAE,WAAW,GACvB,SAAS,SAAS,EAAE,CActB"}
@@ -0,0 +1,85 @@
1
+ import { convertCase } from "skir-internal";
2
+ export function getEnumFields(fields, typeSpeller) {
3
+ const result = [];
4
+ result.push(makeUnknownField());
5
+ for (const inField of fields) {
6
+ let outField;
7
+ if (inField.type) {
8
+ outField = makeWrapperField(inField, inField.doc, typeSpeller);
9
+ }
10
+ else {
11
+ outField = makeConstantField(inField.name.text, inField.doc);
12
+ }
13
+ outField.fieldNumber = inField.number;
14
+ result.push(outField);
15
+ }
16
+ return result;
17
+ }
18
+ function makeUnknownField() {
19
+ return {
20
+ fieldName: "?",
21
+ valueType: "",
22
+ valueTypeWithNamespace: "",
23
+ fieldNumber: 0,
24
+ isUnknownField: true,
25
+ structType: `k_unknown`,
26
+ typeAlias: "",
27
+ identifier: `kUnknown`,
28
+ kindEnumerator: `kUnknown`,
29
+ usePointer: false,
30
+ doc: { text: "", pieces: [] },
31
+ };
32
+ }
33
+ function makeConstantField(fieldName, doc) {
34
+ const lowerUnderscore = convertCase(fieldName, "lower_underscore");
35
+ const upperCamel = convertCase(fieldName, "UpperCamel");
36
+ return {
37
+ fieldName: fieldName,
38
+ valueType: "",
39
+ valueTypeWithNamespace: "",
40
+ fieldNumber: 0,
41
+ isUnknownField: false,
42
+ structType: `k_${lowerUnderscore}`,
43
+ typeAlias: "",
44
+ identifier: `k${upperCamel}`,
45
+ kindEnumerator: `k${upperCamel}Const`,
46
+ usePointer: false,
47
+ doc: doc,
48
+ };
49
+ }
50
+ function makeWrapperField(field, doc, typeSpeller) {
51
+ const fieldName = field.name.text;
52
+ const upperCamel = convertCase(fieldName, "UpperCamel");
53
+ const type = field.type;
54
+ return {
55
+ fieldName: fieldName,
56
+ valueType: typeSpeller.getCcType(type),
57
+ valueTypeWithNamespace: typeSpeller.getCcType(type, {
58
+ forceNamespace: true,
59
+ }),
60
+ fieldNumber: 0,
61
+ isUnknownField: false,
62
+ structType: `wrap_${fieldName}`,
63
+ typeAlias: `wrap_${fieldName}_type`,
64
+ identifier: `wrap_${fieldName}`,
65
+ kindEnumerator: `k${upperCamel}Wrapper`,
66
+ usePointer: usePointer(field.type),
67
+ doc: doc,
68
+ };
69
+ }
70
+ function usePointer(type) {
71
+ if (type.kind !== "primitive")
72
+ return true;
73
+ switch (type.primitive) {
74
+ case "bool":
75
+ case "int32":
76
+ case "int64":
77
+ case "uint64":
78
+ case "float32":
79
+ case "float64":
80
+ case "timestamp":
81
+ return false;
82
+ }
83
+ return true;
84
+ }
85
+ //# sourceMappingURL=enum_field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enum_field.js","sourceRoot":"","sources":["../src/enum_field.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { Doc, Field } from "skir-internal";
2
+ import { TypeSpeller } from "./type_speller.js";
3
+ interface MutableEnumVariant {
4
+ /** As specified in the .skir file. */
5
+ readonly variantName: string;
6
+ /** Examples: "bool", "Foo". Empty if the variant is a constant. */
7
+ readonly valueType: string;
8
+ /** Examples: "bool", "foo::Foo". Empty if the variant is a constant. */
9
+ readonly valueTypeWithNamespace: string;
10
+ /** As specified in the .skir file. */
11
+ variantNumber: number;
12
+ /** Whether the variant is the special UNKNOWN variant. */
13
+ isUnknownVariant: boolean;
14
+ /** Examples: "k_variant", "wrap_variant". */
15
+ readonly structType: string;
16
+ /** Example: "wrap_variant_type". Empty if the variant is a constant. */
17
+ readonly typeAlias: string;
18
+ /** kVariant or wrap_variant. */
19
+ readonly identifier: string;
20
+ /** kConstVariant or kValVariant */
21
+ readonly kindEnumerator: string;
22
+ /**
23
+ * True if the variant is a wrapper and the value should be allocated on the heap.
24
+ */
25
+ readonly usePointer: boolean;
26
+ readonly doc: Doc;
27
+ }
28
+ export type EnumVariant = Readonly<MutableEnumVariant>;
29
+ export declare function getEnumVariants(variants: readonly Field[], typeSpeller: TypeSpeller): readonly EnumVariant[];
30
+ export {};
31
+ //# sourceMappingURL=enum_variant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enum_variant.d.ts","sourceRoot":"","sources":["../src/enum_variant.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,KAAK,EAA6B,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,UAAU,kBAAkB;IAC1B,sCAAsC;IACtC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,mEAAmE;IACnE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,wEAAwE;IACxE,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,gBAAgB,EAAE,OAAO,CAAC;IAC1B,6CAA6C;IAC7C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,wEAAwE;IACxE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,gCAAgC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,mCAAmC;IACnC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;CACnB;AAED,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,kBAAkB,CAAC,CAAC;AAEvD,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,SAAS,KAAK,EAAE,EAC1B,WAAW,EAAE,WAAW,GACvB,SAAS,WAAW,EAAE,CAcxB"}
@@ -0,0 +1,85 @@
1
+ import { convertCase } from "skir-internal";
2
+ export function getEnumVariants(variants, typeSpeller) {
3
+ const result = [];
4
+ result.push(makeUnknownVariant());
5
+ for (const inVariant of variants) {
6
+ let outVariant;
7
+ if (inVariant.type) {
8
+ outVariant = makeWrapperVariant(inVariant, inVariant.doc, typeSpeller);
9
+ }
10
+ else {
11
+ outVariant = makeConstantVariant(inVariant.name.text, inVariant.doc);
12
+ }
13
+ outVariant.variantNumber = inVariant.number;
14
+ result.push(outVariant);
15
+ }
16
+ return result;
17
+ }
18
+ function makeUnknownVariant() {
19
+ return {
20
+ variantName: "?",
21
+ valueType: "",
22
+ valueTypeWithNamespace: "",
23
+ variantNumber: 0,
24
+ isUnknownVariant: true,
25
+ structType: `k_unknown`,
26
+ typeAlias: "",
27
+ identifier: `kUnknown`,
28
+ kindEnumerator: `kUnknown`,
29
+ usePointer: false,
30
+ doc: { text: "", pieces: [] },
31
+ };
32
+ }
33
+ function makeConstantVariant(variantName, doc) {
34
+ const lowerUnderscore = convertCase(variantName, "lower_underscore");
35
+ const upperCamel = convertCase(variantName, "UpperCamel");
36
+ return {
37
+ variantName: variantName,
38
+ valueType: "",
39
+ valueTypeWithNamespace: "",
40
+ variantNumber: 0,
41
+ isUnknownVariant: false,
42
+ structType: `k_${lowerUnderscore}`,
43
+ typeAlias: "",
44
+ identifier: `k${upperCamel}`,
45
+ kindEnumerator: `k${upperCamel}Const`,
46
+ usePointer: false,
47
+ doc: doc,
48
+ };
49
+ }
50
+ function makeWrapperVariant(variant, doc, typeSpeller) {
51
+ const variantName = variant.name.text;
52
+ const upperCamel = convertCase(variantName, "UpperCamel");
53
+ const type = variant.type;
54
+ return {
55
+ variantName: variantName,
56
+ valueType: typeSpeller.getCcType(type),
57
+ valueTypeWithNamespace: typeSpeller.getCcType(type, {
58
+ forceNamespace: true,
59
+ }),
60
+ variantNumber: 0,
61
+ isUnknownVariant: false,
62
+ structType: `wrap_${variantName}`,
63
+ typeAlias: `wrap_${variantName}_type`,
64
+ identifier: `wrap_${variantName}`,
65
+ kindEnumerator: `k${upperCamel}Wrapper`,
66
+ usePointer: usePointer(variant.type),
67
+ doc: doc,
68
+ };
69
+ }
70
+ function usePointer(type) {
71
+ if (type.kind !== "primitive")
72
+ return true;
73
+ switch (type.primitive) {
74
+ case "bool":
75
+ case "int32":
76
+ case "int64":
77
+ case "uint64":
78
+ case "float32":
79
+ case "float64":
80
+ case "timestamp":
81
+ return false;
82
+ }
83
+ return true;
84
+ }
85
+ //# sourceMappingURL=enum_variant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enum_variant.js","sourceRoot":"","sources":["../src/enum_variant.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type CodeGenerator } from "skir-internal";
2
+ import { z } from "zod";
3
+ declare const Config: z.ZodObject<{
4
+ writeGoogleTestHeaders: z.ZodBoolean;
5
+ }, z.core.$strip>;
6
+ type Config = z.infer<typeof Config>;
7
+ declare class CcCodeGenerator implements CodeGenerator<Config> {
8
+ readonly id = "cc";
9
+ readonly configType: z.ZodObject<{
10
+ writeGoogleTestHeaders: z.ZodBoolean;
11
+ }, z.core.$strip>;
12
+ readonly version = "1.0.0";
13
+ generateCode(input: CodeGenerator.Input<Config>): CodeGenerator.Output;
14
+ }
15
+ export declare const GENERATOR: CcCodeGenerator;
16
+ export {};
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAWnB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,QAAA,MAAM,MAAM;;iBAEV,CAAC;AAEH,KAAK,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,CAAC;AAErC,cAAM,eAAgB,YAAW,aAAa,CAAC,MAAM,CAAC;IACpD,QAAQ,CAAC,EAAE,QAAQ;IACnB,QAAQ,CAAC,UAAU;;sBAAU;IAC7B,QAAQ,CAAC,OAAO,WAAW;IAE3B,YAAY,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC,MAAM;CAwBvE;AAm9DD,eAAO,MAAM,SAAS,iBAAwB,CAAC"}