Skip to content

Commit 4c05200

Browse files
authored
feat(specs): recursive snippets and highlights result (#3497)
1 parent 4fb106b commit 4c05200

File tree

8 files changed

+75
-16
lines changed

8 files changed

+75
-16
lines changed

generators/src/main/java/com/algolia/codegen/utils/OneOf.java

+10
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ public static void addOneOfMetadata(Map<String, ModelsMap> models) {
137137
var model = modelContainer.getModels().get(0).getModel();
138138
var oneOfs = getCodegenProperties(model);
139139
if (isMultiArrayOneOfs(oneOfs)) model.vendorExtensions.put("x-is-multi-array", true);
140+
if (isMultiMapOneOfs(oneOfs)) model.vendorExtensions.put("x-is-multi-map", true);
140141
if (hasAtModelOrEnum(oneOfs)) model.vendorExtensions.put("x-has-model", true);
141142
markOneOfModels(oneOfs);
142143
sortOneOfs(oneOfs);
@@ -151,6 +152,15 @@ private static List<CodegenProperty> getCodegenProperties(CodegenModel model) {
151152
return oneOfs;
152153
}
153154

155+
/** Get true if a composed type has more than a one array-subtype */
156+
private static boolean isMultiMapOneOfs(List<CodegenProperty> oneOfs) {
157+
var map = 0;
158+
for (var prop : oneOfs) {
159+
if (prop.isMap) map++;
160+
}
161+
return map > 1;
162+
}
163+
154164
/** Get true if a composed type has more than a one array-subtype */
155165
private static boolean isMultiArrayOneOfs(List<CodegenProperty> oneOfs) {
156166
var arrays = 0;

specs/common/schemas/HighlightResult.yml

+1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ highlightResultOptionArray:
4646

4747
highlightResult:
4848
oneOf:
49+
- $ref: '#/highlightResultMap'
4950
- $ref: '#/highlightResultOption'
5051
- $ref: '#/highlightResultOptionMap'
5152
- $ref: '#/highlightResultOptionArray'

specs/common/schemas/SnippetResult.yml

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ snippetResultOptionArray:
2626

2727
snippetResult:
2828
oneOf:
29+
- $ref: '#/snippetResultMap'
2930
- $ref: '#/snippetResultOption'
3031
- $ref: '#/snippetResultOptionMap'
3132
- $ref: '#/snippetResultOptionArray'

templates/csharp/modelOneOf.mustache

+3-3
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
/// the InvalidClassException will be thrown{{/lambda.escape-generic}}
6666
/// </summary>
6767
/// <returns>An instance of {{#lambda.escape-generic}}{{dataType}}{{/lambda.escape-generic}}</returns>
68-
public {{{dataType}}}{{#vendorExtensions.x-has-child-generic}}<T>{{/vendorExtensions.x-has-child-generic}} As{{#lambda.titlecase}}{{baseType}}{{/lambda.titlecase}}{{#isArray}}{{^complexType}}{{#lambda.titlecase}}{{{items.dataType}}}{{/lambda.titlecase}}{{/complexType}}{{/isArray}}()
68+
public {{{dataType}}}{{#vendorExtensions.x-has-child-generic}}<T>{{/vendorExtensions.x-has-child-generic}} As{{#lambda.titlecase}}{{baseType}}{{/lambda.titlecase}}{{#lambda.titlecase}}{{{items.dataType}}}{{/lambda.titlecase}}()
6969
{
7070
return ({{{dataType}}}{{#vendorExtensions.x-has-child-generic}}<T>{{/vendorExtensions.x-has-child-generic}})ActualInstance;
7171
}
@@ -81,7 +81,7 @@
8181
/// {{#lambda.escape-generic}}Check if the actual instance is of `{{{dataType}}}` type.{{/lambda.escape-generic}}
8282
/// </summary>
8383
/// <returns>Whether or not the instance is the type</returns>
84-
public bool Is{{#lambda.titlecase}}{{baseType}}{{/lambda.titlecase}}{{#isArray}}{{^complexType}}{{#lambda.titlecase}}{{{items.dataType}}}{{/lambda.titlecase}}{{/complexType}}{{/isArray}}()
84+
public bool Is{{#lambda.titlecase}}{{baseType}}{{/lambda.titlecase}}{{#lambda.titlecase}}{{{items.dataType}}}{{/lambda.titlecase}}()
8585
{
8686
return ActualInstance.GetType() == typeof({{{dataType}}}{{#vendorExtensions.x-has-child-generic}}<T>{{/vendorExtensions.x-has-child-generic}});
8787
}
@@ -243,4 +243,4 @@
243243
writer.WriteRawValue(value.ToJson());
244244
}
245245
}
246-
{{/model}}
246+
{{/model}}

templates/java/oneof_interface.mustache

+16-3
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,20 @@ public interface {{classname}}{{#vendorExtensions.x-has-child-generic}}<T>{{/ven
3333
{{/composedSchemas.oneOf}}
3434
{{/vendorExtensions.x-is-multi-array}}
3535

36-
{{^vendorExtensions.x-is-multi-array}}
36+
{{#vendorExtensions.x-is-multi-map}}
37+
{{#composedSchemas.oneOf}}
38+
{{^isModel}}
39+
{{^isEnumRef}}
40+
// {{classname}} as {{{datatypeWithEnum}}} wrapper.
41+
static {{classname}} of{{#isMap}}{{#lambda.type-to-name}}{{{datatypeWithEnum}}}{{/lambda.type-to-name}}{{/isMap}}({{{datatypeWithEnum}}} value) {
42+
return new {{#lambda.type-to-name}}{{{datatypeWithEnum}}}{{/lambda.type-to-name}}Wrapper(value);
43+
}
44+
{{/isEnumRef}}
45+
{{/isModel}}
46+
{{/composedSchemas.oneOf}}
47+
{{/vendorExtensions.x-is-multi-map}}
48+
49+
{{^vendorExtensions.x-is-multi-array}}{{^vendorExtensions.x-is-multi-map}}
3750
{{#composedSchemas.oneOf}}
3851
{{^isModel}}
3952
{{^isEnumRef}}
@@ -44,7 +57,7 @@ public interface {{classname}}{{#vendorExtensions.x-has-child-generic}}<T>{{/ven
4457
{{/isEnumRef}}
4558
{{/isModel}}
4659
{{/composedSchemas.oneOf}}
47-
{{/vendorExtensions.x-is-multi-array}}
60+
{{/vendorExtensions.x-is-multi-map}}{{/vendorExtensions.x-is-multi-array}}
4861

4962
{{#composedSchemas.oneOf}}
5063
{{^isModel}}
@@ -125,4 +138,4 @@ public interface {{classname}}{{#vendorExtensions.x-has-child-generic}}<T>{{/ven
125138
{{/isNullable}}
126139
}
127140
}
128-
}
141+
}

templates/kotlin/oneof_interface.mustache

+14-2
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,19 @@ public sealed interface {{classname}} {
4848
{{/composedSchemas.oneOf}}
4949
{{/vendorExtensions.x-is-multi-array}}
5050

51-
{{^vendorExtensions.x-is-multi-array}}
51+
{{#vendorExtensions.x-is-multi-map}}
52+
{{#composedSchemas.oneOf}}
53+
{{^isModel}}
54+
{{^isEnumRef}}
55+
public fun of{{#isMap}}{{#lambda.type-to-name}}{{{datatypeWithEnum}}}{{/lambda.type-to-name}}{{/isMap}}(value: {{{datatypeWithEnum}}}): {{classname}} {
56+
return {{#lambda.type-to-name}}{{{datatypeWithEnum}}}{{/lambda.type-to-name}}Value(value);
57+
}
58+
{{/isEnumRef}}
59+
{{/isModel}}
60+
{{/composedSchemas.oneOf}}
61+
{{/vendorExtensions.x-is-multi-map}}
62+
63+
{{^vendorExtensions.x-is-multi-array}}{{^vendorExtensions.x-is-multi-map}}
5264
{{#composedSchemas.oneOf}}
5365
{{^isModel}}
5466
{{^isEnumRef}}
@@ -58,7 +70,7 @@ public sealed interface {{classname}} {
5870
{{/isEnumRef}}
5971
{{/isModel}}
6072
{{/composedSchemas.oneOf}}
61-
{{/vendorExtensions.x-is-multi-array}}
73+
{{/vendorExtensions.x-is-multi-map}}{{/vendorExtensions.x-is-multi-array}}
6274
}
6375
}
6476

templates/python/model_oneof.mustache

+4-6
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class {{classname}}({{#parent}}{{{.}}}{{/parent}}{{^parent}}BaseModel{{/parent}}
2121
"""
2222
Unwraps the `actual_instance` when calling the `to_json` method.
2323
"""
24-
return self.actual_instance
24+
return self.actual_instance if hasattr(self, "actual_instance") else self
2525

2626
@classmethod
2727
def from_dict(cls, obj: dict) -> Self:
@@ -76,8 +76,7 @@ class {{classname}}({{#parent}}{{{.}}}{{/parent}}{{^parent}}BaseModel{{/parent}}
7676
if self.actual_instance is None:
7777
return "null"
7878

79-
to_json = getattr(self.actual_instance, "to_json", None)
80-
if callable(to_json):
79+
if hasattr(self.actual_instance, "to_json"):
8180
return self.actual_instance.to_json()
8281
else:
8382
return dumps(self.actual_instance)
@@ -87,8 +86,7 @@ class {{classname}}({{#parent}}{{{.}}}{{/parent}}{{^parent}}BaseModel{{/parent}}
8786
if self.actual_instance is None:
8887
return None
8988

90-
to_dict = getattr(self.actual_instance, "to_dict", None)
91-
if callable(to_dict):
89+
if hasattr(self.actual_instance, "to_dict"):
9290
return self.actual_instance.to_dict()
9391
else:
94-
return self.actual_instance
92+
return self.actual_instance

templates/scala/oneof_trait.mustache

+26-2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,18 @@ object {{classname}}Evidence {
2323
}
2424
{{/vendorExtensions.x-is-multi-array}}
2525

26+
{{#vendorExtensions.x-is-multi-map}}
27+
trait {{classname}}Evidence
28+
29+
object {{classname}}Evidence {
30+
{{#composedSchemas.oneOf}}
31+
{{#isMap}}
32+
implicit object {{#lambda.type-to-name}}{{{datatypeWithEnum}}}{{/lambda.type-to-name}}Evidence extends {{classname}}Evidence
33+
{{/isMap}}
34+
{{/composedSchemas.oneOf}}
35+
}
36+
{{/vendorExtensions.x-is-multi-map}}
37+
2638
object {{classname}} {
2739
2840
{{#composedSchemas.oneOf}}
@@ -44,8 +56,20 @@ object {{classname}} {
4456
{{/isModel}}
4557
{{/composedSchemas.oneOf}}
4658
{{/vendorExtensions.x-is-multi-array}}
59+
60+
{{#vendorExtensions.x-is-multi-map}}
61+
{{#composedSchemas.oneOf}}
62+
{{^isModel}}
63+
{{^isEnumRef}}
64+
def apply(value: {{{datatypeWithEnum}}}){{#isMap}}(implicit ev: {{classname}}Evidence.{{#lambda.type-to-name}}{{{datatypeWithEnum}}}{{/lambda.type-to-name}}Evidence.type){{/isMap}}: {{classname}} = {
65+
{{classname}}.{{#isMap}}{{#lambda.type-to-name}}{{{datatypeWithEnum}}}{{/lambda.type-to-name}}{{/isMap}}{{#isArray}}{{#lambda.type-to-name}}{{{datatypeWithEnum}}}{{/lambda.type-to-name}}{{/isArray}}{{^isMap}}{{^isArray}}{{{datatypeWithEnum}}}Value{{/isArray}}{{/isMap}}(value)
66+
}
67+
{{/isEnumRef}}
68+
{{/isModel}}
69+
{{/composedSchemas.oneOf}}
70+
{{/vendorExtensions.x-is-multi-map}}
4771

48-
{{^vendorExtensions.x-is-multi-array}}
72+
{{^vendorExtensions.x-is-multi-array}}{{^vendorExtensions.x-is-multi-map}}
4973
{{#composedSchemas.oneOf}}
5074
{{^isModel}}
5175
{{^isEnumRef}}
@@ -55,7 +79,7 @@ object {{classname}} {
5579
{{/isEnumRef}}
5680
{{/isModel}}
5781
{{/composedSchemas.oneOf}}
58-
{{/vendorExtensions.x-is-multi-array}}
82+
{{/vendorExtensions.x-is-multi-map}}{{/vendorExtensions.x-is-multi-array}}
5983
}
6084

6185
object {{classname}}Serializer extends Serializer[{{classname}}] {

0 commit comments

Comments
 (0)