Skip to content
This repository has been archived by the owner on Sep 26, 2023. It is now read-only.

Commit

Permalink
feat: Add numeric enum support. (#1743)
Browse files Browse the repository at this point in the history
Add numeric enum support based on go/actools-numeric-enum-impl.
Add a new overloaded toBody method that support serializing request object to Json with numeric enums.
  • Loading branch information
blakeli0 committed Aug 22, 2022
1 parent ded44a6 commit 3f7628e
Show file tree
Hide file tree
Showing 7 changed files with 80 additions and 12 deletions.
Expand Up @@ -79,7 +79,7 @@ public ResponseT parse(Reader httpContent, TypeRegistry registry) {
/* {@inheritDoc} */
@Override
public String serialize(ResponseT response) {
return ProtoRestSerializer.create(defaultRegistry).toJson(response);
return ProtoRestSerializer.create(defaultRegistry).toJson(response, false);
}

// Convert to @AutoValue if this class gets more complicated
Expand Down
Expand Up @@ -35,6 +35,7 @@
import com.google.protobuf.Message;
import com.google.protobuf.TypeRegistry;
import com.google.protobuf.util.JsonFormat;
import com.google.protobuf.util.JsonFormat.Printer;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
Expand Down Expand Up @@ -69,12 +70,19 @@ static <RequestT extends Message> ProtoRestSerializer<RequestT> create(TypeRegis
* protobuf native JSON formatter.
*
* @param message a message to serialize
* @param numericEnum a boolean flag that determine if enum values should be serialized to number
* or not
* @throws InvalidProtocolBufferException if failed to serialize the protobuf message to JSON
* format
*/
String toJson(RequestT message) {
String toJson(RequestT message, boolean numericEnum) {
try {
return JsonFormat.printer().usingTypeRegistry(registry).print(message);
Printer printer = JsonFormat.printer().usingTypeRegistry(registry);
if (numericEnum) {
return printer.printingEnumsAsInts().print(message);
} else {
return printer.print(message);
}
} catch (InvalidProtocolBufferException e) {
throw new RestSerializationException("Failed to serialize message to JSON", e);
}
Expand Down Expand Up @@ -138,6 +146,17 @@ public void putQueryParam(Map<String, List<String>> fields, String fieldName, Ob
* @param fieldValue a field value to serialize
*/
public String toBody(String fieldName, RequestT fieldValue) {
return toJson(fieldValue);
return toJson(fieldValue, false);
}

/**
* Serializes a message to a request body in a form of JSON-encoded string.
*
* @param fieldName a name of a request message field this message belongs to
* @param fieldValue a field value to serialize
* @param numericEnum a boolean flag that determine if enum values should be serialized to number
*/
public String toBody(String fieldName, RequestT fieldValue, boolean numericEnum) {
return toJson(fieldValue, numericEnum);
}
}
Expand Up @@ -123,7 +123,7 @@ public void onClose(int statusCode, HttpJsonMetadata trailers) {
.setRequestBodyExtractor(
request ->
ProtoRestSerializer.create()
.toBody("*", request.toBuilder().clearName().build()))
.toBody("*", request.toBuilder().clearName().build(), false))
.build())
.setResponseParser(
ProtoMessageResponseParser.<Field>newBuilder()
Expand Down
Expand Up @@ -83,7 +83,7 @@ public class HttpJsonDirectCallableTest {
.setRequestBodyExtractor(
request ->
ProtoRestSerializer.create()
.toBody("*", request.toBuilder().clearName().build()))
.toBody("*", request.toBuilder().clearName().build(), false))
.build())
.setResponseParser(
ProtoMessageResponseParser.<Field>newBuilder()
Expand Down
Expand Up @@ -92,7 +92,8 @@ public class HttpJsonDirectServerStreamingCallableTest {
.setRequestBodyExtractor(
request ->
ProtoRestSerializer.create()
.toBody("*", request.toBuilder().clearBlue().clearRed().build()))
.toBody(
"*", request.toBuilder().clearBlue().clearRed().build(), false))
.build())
.setResponseParser(
ProtoMessageResponseParser.<Money>newBuilder()
Expand Down
Expand Up @@ -79,7 +79,7 @@ public void setUp() {
.setRequestBodyExtractor(
request -> {
ProtoRestSerializer<Field> serializer = ProtoRestSerializer.create();
return serializer.toBody("field", request);
return serializer.toBody("field", request, false);
})
.setAdditionalPaths("/api/v1/names/{name=field_name1/**}/hello")
.build();
Expand Down
Expand Up @@ -48,6 +48,8 @@ public class ProtoRestSerializerTest {
private ProtoRestSerializer<Field> requestSerializer;
private Field field;
private String fieldJson;
private String fieldJsonNumericEnum;
private String fieldJsonUnknownNumericEnum;

@Before
public void setUp() {
Expand All @@ -72,21 +74,67 @@ public void setUp() {
+ " \"name\": \"opt_name2\"\n"
+ " }]\n"
+ "}";

fieldJsonNumericEnum =
"{\n"
+ " \"cardinality\": 1,\n"
+ " \"number\": 2,\n"
+ " \"name\": \"field_name1\",\n"
+ " \"options\": [{\n"
+ " \"name\": \"opt_name1\"\n"
+ " }, {\n"
+ " \"name\": \"opt_name2\"\n"
+ " }]\n"
+ "}";

fieldJsonUnknownNumericEnum =
"{\n"
+ " \"cardinality\": 7,\n"
+ " \"number\": 2,\n"
+ " \"name\": \"field_name1\",\n"
+ " \"options\": [{\n"
+ " \"name\": \"opt_name1\"\n"
+ " }, {\n"
+ " \"name\": \"opt_name2\"\n"
+ " }]\n"
+ "}";
}

@Test
public void toJson() {
String fieldToJson = requestSerializer.toJson(field);
public void toJson_numericEnumTrue() {
String fieldToJson = requestSerializer.toJson(field, true);
Truth.assertThat(fieldToJson).isEqualTo(fieldJsonNumericEnum);
}

@Test
public void toJson_numericEnumFalse() {
String fieldToJson = requestSerializer.toJson(field, false);
Truth.assertThat(fieldToJson).isEqualTo(fieldJson);
}

@Test
public void fromJson() {
public void fromJson_numericEnumTrue() {
Field fieldFromJson =
requestSerializer.fromJson(new StringReader(fieldJsonNumericEnum), Field.newBuilder());
Truth.assertThat(fieldFromJson).isEqualTo(field);
}

@Test
public void fromJson_numericEnumFalse() {
Field fieldFromJson =
requestSerializer.fromJson(new StringReader(fieldJson), Field.newBuilder());
Truth.assertThat(fieldFromJson).isEqualTo(field);
}

@Test
public void fromJson_numericEnumTrueAndUnknownEnum() {
Field expected = field.toBuilder().setCardinalityValue(7).build();
Field fieldFromJson =
requestSerializer.fromJson(
new StringReader(fieldJsonUnknownNumericEnum), Field.newBuilder());
Truth.assertThat(fieldFromJson).isEqualTo(expected);
}

@Test
public void fromJsonInvalidJson() {
try {
Expand Down Expand Up @@ -135,7 +183,7 @@ public void putQueryParam() {

@Test
public void toBody() {
String body = requestSerializer.toBody("bodyField1", field);
String body = requestSerializer.toBody("bodyField1", field, false);
Truth.assertThat(body).isEqualTo(fieldJson);
}
}

0 comments on commit 3f7628e

Please sign in to comment.