Skip to content

Commit

Permalink
Improve code generation (opensearch-project#1219)
Browse files Browse the repository at this point in the history
- Render descriptions using markdown
- Support generating "DictionaryResponse" types
- Support discriminated unions

Signed-off-by: Thomas Farr <[email protected]>
(cherry picked from commit d045d86)
  • Loading branch information
Xtansia committed Oct 31, 2024
1 parent 85be720 commit 21403d0
Show file tree
Hide file tree
Showing 62 changed files with 1,355 additions and 400 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ Inspired from [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
### Removed

### Fixed
- Fixed `UndeployModelResponse` deserialization ([#]())

### Security

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ public final List<ErrorCause> rootCause() {
}

/**
* The server stack trace. Present only if the `error_trace=true` parameter was sent with the request.
* The server stack trace. Present only if the <code>error_trace=true</code> parameter was sent with the request.
* <p>
* API name: {@code stack_trace}
* </p>
Expand Down Expand Up @@ -298,7 +298,7 @@ public final Builder rootCause(Function<ErrorCause.Builder, ObjectBuilder<ErrorC
}

/**
* The server stack trace. Present only if the `error_trace=true` parameter was sent with the request.
* The server stack trace. Present only if the <code>error_trace=true</code> parameter was sent with the request.
* <p>
* API name: {@code stack_trace}
* </p>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public static DeleteAgentResponse of(Function<DeleteAgentResponse.Builder, Objec
* Builder for {@link DeleteAgentResponse}.
*/
public static class Builder extends WriteResponseBase.AbstractBuilder<Builder> implements ObjectBuilder<DeleteAgentResponse> {

@Override
protected Builder self() {
return this;
Expand Down Expand Up @@ -71,7 +72,7 @@ public DeleteAgentResponse build() {
);

protected static void setupDeleteAgentResponseDeserializer(ObjectDeserializer<DeleteAgentResponse.Builder> op) {
WriteResponseBase.setupWriteResponseBaseDeserializer(op);
setupWriteResponseBaseDeserializer(op);
}

public int hashCode() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public static DeleteConnectorResponse of(Function<DeleteConnectorResponse.Builde
* Builder for {@link DeleteConnectorResponse}.
*/
public static class Builder extends WriteResponseBase.AbstractBuilder<Builder> implements ObjectBuilder<DeleteConnectorResponse> {

@Override
protected Builder self() {
return this;
Expand Down Expand Up @@ -71,7 +72,7 @@ public DeleteConnectorResponse build() {
);

protected static void setupDeleteConnectorResponseDeserializer(ObjectDeserializer<DeleteConnectorResponse.Builder> op) {
WriteResponseBase.setupWriteResponseBaseDeserializer(op);
setupWriteResponseBaseDeserializer(op);
}

public int hashCode() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public static DeleteModelGroupResponse of(Function<DeleteModelGroupResponse.Buil
* Builder for {@link DeleteModelGroupResponse}.
*/
public static class Builder extends WriteResponseBase.AbstractBuilder<Builder> implements ObjectBuilder<DeleteModelGroupResponse> {

@Override
protected Builder self() {
return this;
Expand Down Expand Up @@ -71,7 +72,7 @@ public DeleteModelGroupResponse build() {
);

protected static void setupDeleteModelGroupResponseDeserializer(ObjectDeserializer<DeleteModelGroupResponse.Builder> op) {
WriteResponseBase.setupWriteResponseBaseDeserializer(op);
setupWriteResponseBaseDeserializer(op);
}

public int hashCode() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public static DeleteModelResponse of(Function<DeleteModelResponse.Builder, Objec
* Builder for {@link DeleteModelResponse}.
*/
public static class Builder extends WriteResponseBase.AbstractBuilder<Builder> implements ObjectBuilder<DeleteModelResponse> {

@Override
protected Builder self() {
return this;
Expand Down Expand Up @@ -71,7 +72,7 @@ public DeleteModelResponse build() {
);

protected static void setupDeleteModelResponseDeserializer(ObjectDeserializer<DeleteModelResponse.Builder> op) {
WriteResponseBase.setupWriteResponseBaseDeserializer(op);
setupWriteResponseBaseDeserializer(op);
}

public int hashCode() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public static DeleteTaskResponse of(Function<DeleteTaskResponse.Builder, ObjectB
* Builder for {@link DeleteTaskResponse}.
*/
public static class Builder extends WriteResponseBase.AbstractBuilder<Builder> implements ObjectBuilder<DeleteTaskResponse> {

@Override
protected Builder self() {
return this;
Expand Down Expand Up @@ -71,7 +72,7 @@ public DeleteTaskResponse build() {
);

protected static void setupDeleteTaskResponseDeserializer(ObjectDeserializer<DeleteTaskResponse.Builder> op) {
WriteResponseBase.setupWriteResponseBaseDeserializer(op);
setupWriteResponseBaseDeserializer(op);
}

public int hashCode() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,115 +12,52 @@

package org.opensearch.client.opensearch.ml;

import jakarta.json.stream.JsonGenerator;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
import javax.annotation.Generated;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import org.opensearch.client.json.JsonpDeserializable;
import org.opensearch.client.json.JsonpDeserializer;
import org.opensearch.client.json.JsonpMapper;
import org.opensearch.client.json.ObjectBuilderDeserializer;
import org.opensearch.client.json.ObjectDeserializer;
import org.opensearch.client.json.PlainJsonSerializable;
import org.opensearch.client.util.ApiTypeHelper;
import org.opensearch.client.transport.endpoints.DictionaryResponse;
import org.opensearch.client.util.ObjectBuilder;
import org.opensearch.client.util.ObjectBuilderBase;

// typedef: ml.undeploy_model.Response

@JsonpDeserializable
@Generated("org.opensearch.client.codegen.CodeGenerator")
public class UndeployModelResponse implements PlainJsonSerializable {

@Nonnull
private final Map<String, UndeployModelNode> nodes;

public class UndeployModelResponse extends DictionaryResponse<String, UndeployModelNode> {
// ---------------------------------------------------------------------------------------------

private UndeployModelResponse(Builder builder) {
this.nodes = ApiTypeHelper.unmodifiable(builder.nodes);
super(builder);
}

public static UndeployModelResponse of(Function<UndeployModelResponse.Builder, ObjectBuilder<UndeployModelResponse>> fn) {
return fn.apply(new Builder()).build();
}

/**
*/
@Nonnull
public final Map<String, UndeployModelNode> nodes() {
return this.nodes;
}

/**
* Serialize this object to JSON.
*/
@Override
public void serialize(JsonGenerator generator, JsonpMapper mapper) {
generator.writeStartObject();
serializeInternal(generator, mapper);
generator.writeEnd();
}

protected void serializeInternal(JsonGenerator generator, JsonpMapper mapper) {
for (Map.Entry<String, UndeployModelNode> item0 : this.nodes.entrySet()) {
generator.writeKey(item0.getKey());
item0.getValue().serialize(generator, mapper);
}
}

// ---------------------------------------------------------------------------------------------

/**
* Builder for {@link UndeployModelResponse}.
*/
public static class Builder extends ObjectBuilderBase implements ObjectBuilder<UndeployModelResponse> {
@Nullable
private Map<String, UndeployModelNode> nodes;

/**
*
* <p>
* Adds all elements of <code>map</code> to <code>nodes</code>.
* </p>
*/
public final Builder nodes(Map<String, UndeployModelNode> map) {
this.nodes = _mapPutAll(this.nodes, map);
public static class Builder extends DictionaryResponse.AbstractBuilder<String, UndeployModelNode, Builder>
implements
ObjectBuilder<UndeployModelResponse> {
@Override
protected Builder self() {
return this;
}

/**
*
* <p>
* Adds an entry to <code>nodes</code>.
* </p>
*/
public final Builder nodes(String key, UndeployModelNode value) {
this.nodes = _mapPut(this.nodes, key, value);
return this;
}

/**
*
* <p>
* Adds a value to <code>nodes</code> using a builder lambda.
* </p>
*/
public final Builder nodes(String key, Function<UndeployModelNode.Builder, ObjectBuilder<UndeployModelNode>> fn) {
return nodes(key, fn.apply(new UndeployModelNode.Builder()).build());
}

/**
* Builds a {@link UndeployModelResponse}.
*
* @throws NullPointerException if some of the required fields are null.
*/
public UndeployModelResponse build() {
_checkSingleUse();
super.tKeySerializer(null);
super.tValueSerializer(null);

return new UndeployModelResponse(this);
}
Expand All @@ -137,24 +74,6 @@ public UndeployModelResponse build() {
);

protected static void setupUndeployModelResponseDeserializer(ObjectDeserializer<UndeployModelResponse.Builder> op) {
op.setUnknownFieldHandler((builder, name, parser, mapper) -> {
if (builder.nodes == null) {
builder.nodes = new HashMap<>();
}
builder.nodes.put(name, UndeployModelNode._DESERIALIZER.deserialize(parser, mapper));
});
}

public int hashCode() {
int result = 17;
result = 31 * result + Objects.hashCode(this.nodes);
return result;
}

public boolean equals(Object o) {
if (this == o) return true;
if (o == null || this.getClass() != o.getClass()) return false;
UndeployModelResponse other = (UndeployModelResponse) o;
return Objects.equals(this.nodes, other.nodes);
setupDictionaryResponseDeserializer(op, JsonpDeserializer.stringDeserializer(), UndeployModelNode._DESERIALIZER);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import javax.annotation.Nullable;
import org.opensearch.client.json.JsonpDeserializer;
import org.opensearch.client.json.JsonpMapper;
Expand Down Expand Up @@ -162,4 +163,19 @@ protected static <TKey, TValue, BuilderT extends AbstractBuilder<TKey, TValue, B
(builder, name, parser, params) -> { builder.putResult(name, tValueParser.deserialize(parser, params)); }
);
}

@Override
public int hashCode() {
int result = 17;
result = 31 * result + Objects.hashCode(result);
return result;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
DictionaryResponse<?, ?> other = (DictionaryResponse<?, ?>) o;
return Objects.equals(this.result, other.result);
}
}
3 changes: 3 additions & 0 deletions java-codegen/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,9 @@ dependencies {
// MIT
implementation("org.semver4j", "semver4j", "5.3.0")

// BSD-2-Clause
implementation("org.commonmark", "commonmark", "0.23.0")

// EPL-2.0
testImplementation(platform("org.junit:junit-bom:5.11.1"))
testImplementation("org.junit.jupiter", "junit-jupiter")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/*
* SPDX-License-Identifier: Apache-2.0
*
* The OpenSearch Contributors require contributions made to
* this file be licensed under the Apache-2.0 license or a
* compatible open source license.
*/

package org.opensearch.client.codegen.model;

import java.util.Collection;
import java.util.List;

public class DictionaryResponseShape extends Shape {
private final Type keyType;
private final Type valueType;

public DictionaryResponseShape(
Namespace parent,
String className,
String typedefName,
String description,
Type keyType,
Type valueType
) {
super(parent, className, typedefName, description);
this.keyType = keyType;
this.valueType = valueType;
setExtendsType(Types.Client.Transport.Endpoints.DictionaryResponse(keyType, valueType));
}

@Override
public Collection<Type> getAnnotations() {
return List.of(Types.Client.Json.JsonpDeserializable);
}

@Override
public boolean extendsOtherShape() {
return true;
}
}
Loading

0 comments on commit 21403d0

Please sign in to comment.