Skip to content

Commit

Permalink
feat(rust/java/node/python): Use enums for types with limited values …
Browse files Browse the repository at this point in the history
…for better type inference on caller side (#33)
  • Loading branch information
yquansah committed Jan 11, 2024
1 parent 7a1d422 commit 03e8d30
Show file tree
Hide file tree
Showing 12 changed files with 178 additions and 41 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ public class BooleanEvaluationResponse {

private final String flagKey;

private final String reason;
private final EvaluationReason reason;

private final float requestDurationMillis;

Expand All @@ -18,7 +18,7 @@ public class BooleanEvaluationResponse {
public BooleanEvaluationResponse(
@JsonProperty("enabled") boolean enabled,
@JsonProperty("flagKey") String flagKey,
@JsonProperty("reason") String reason,
@JsonProperty("reason") EvaluationReason reason,
@JsonProperty("requestDurationMillis") float requestDurationMillis,
@JsonProperty("timesteamp") String timestamp) {
this.enabled = enabled;
Expand All @@ -39,7 +39,7 @@ public String getFlagKey() {
}

@JsonProperty("reason")
public String getReason() {
public EvaluationReason getReason() {
return reason;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package io.flipt.api.evaluation.models;

import com.fasterxml.jackson.annotation.JsonValue;

public enum ErrorEvaluationReason {
UNKNOWN_ERROR_EVALUATION_REASON("UNKNOWN_ERROR_EVALUATION_REASON"),

NOT_FOUND_ERROR_EVALUATION_REASON("NOT_FOUND_ERROR_EVALUATION_REASON");

private final String value;

ErrorEvaluationReason(String value) {
this.value = value;
}

@JsonValue
@Override
public String toString() {
return this.value;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ public class ErrorEvaluationResponse {

private final String namespaceKey;

private final String reason;
private final ErrorEvaluationReason reason;

@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
public ErrorEvaluationResponse(
@JsonProperty("flagKey") String flagKey,
@JsonProperty("namespaceKey") String namespaceKey,
@JsonProperty("reason") String reason) {
@JsonProperty("reason") ErrorEvaluationReason reason) {
this.flagKey = flagKey;
this.namespaceKey = namespaceKey;
this.reason = reason;
Expand All @@ -31,7 +31,7 @@ public String getNamespaceKey() {
}

@JsonProperty("reason")
public String getReason() {
public ErrorEvaluationReason getReason() {
return reason;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package io.flipt.api.evaluation.models;

import com.fasterxml.jackson.annotation.JsonValue;

public enum EvaluationReason {
UNKNOWN_EVALUATION_REASON("UNKNOWN_EVALUATION_REASON"),

FLAG_DISABLED_EVALUATION_REASON("FLAG_DISABLED_EVALUATION_REASON"),

MATCH_EVALUATION_REASON("MATCH_EVALUATION_REASON"),

DEFAULT_EVALUATION_REASON("DEFAULT_EVALUATION_REASON");

private final String value;

EvaluationReason(String value) {
this.value = value;
}

@JsonValue
@Override
public String toString() {
return this.value;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import java.util.Optional;

public class EvaluationResponse {
private final String type;
private final EvaluationResponseType type;

private final Optional<BooleanEvaluationResponse> booleanResponse;

Expand All @@ -15,7 +15,7 @@ public class EvaluationResponse {

@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
public EvaluationResponse(
@JsonProperty("type") String type,
@JsonProperty("type") EvaluationResponseType type,
@JsonProperty("booleanResponse") Optional<BooleanEvaluationResponse> booleanResponse,
@JsonProperty("variantResponse") Optional<VariantEvaluationResponse> variantResponse,
@JsonProperty("errorResponse") Optional<ErrorEvaluationResponse> errorResponse) {
Expand All @@ -26,7 +26,7 @@ public EvaluationResponse(
}

@JsonProperty("type")
public String getType() {
public EvaluationResponseType getType() {
return type;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package io.flipt.api.evaluation.models;

import com.fasterxml.jackson.annotation.JsonValue;

public enum EvaluationResponseType {
VARIANT_EVALUATION_RESPONSE_TYPE("VARIANT_EVALUATION_RESPONSE_TYPE"),

BOOLEAN_EVALUATION_RESPONSE_TYPE("BOOLEAN_EVALUATION_RESPONSE_TYPE"),

ERROR_EVALUATION_RESPONSE_TYPE("ERROR_EVALUATION_RESPONSE_TYPE");

private final String value;

EvaluationResponseType(String value) {
this.value = value;
}

@JsonValue
@Override
public String toString() {
return this.value;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
public class VariantEvaluationResponse {
private final boolean match;
private final List<String> segmentKeys;
private final String reason;
private final EvaluationReason reason;
private final String flagKey;
private final String variantKey;
private final String variantAttachment;
Expand All @@ -18,7 +18,7 @@ public class VariantEvaluationResponse {
public VariantEvaluationResponse(
@JsonProperty("match") boolean match,
@JsonProperty("segmentKeys") List<String> segmentKeys,
@JsonProperty("reason") String reason,
@JsonProperty("reason") EvaluationReason reason,
@JsonProperty("flagKey") String flagKey,
@JsonProperty("variantKey") String variantKey,
@JsonProperty("variantAttachment") String variantAttachment,
Expand Down Expand Up @@ -65,7 +65,7 @@ public String getFlagKey() {
}

@JsonProperty("reason")
public String getReason() {
public EvaluationReason getReason() {
return reason;
}

Expand Down
17 changes: 9 additions & 8 deletions flipt-java/src/test/java/TestFliptClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ void testVariant() {

Assertions.assertTrue(variant.isMatch());
Assertions.assertEquals("flag1", variant.getFlagKey());
Assertions.assertEquals("MATCH_EVALUATION_REASON", variant.getReason());
Assertions.assertEquals("MATCH_EVALUATION_REASON", variant.getReason().toString());
Assertions.assertEquals("variant1", variant.getVariantKey());
Assertions.assertEquals("segment1", variant.getSegmentKeys().get(0));
}
Expand Down Expand Up @@ -56,7 +56,7 @@ void testBoolean() {

Assertions.assertTrue(booleanEvaluation.isEnabled());
Assertions.assertEquals("flag_boolean", booleanEvaluation.getFlagKey());
Assertions.assertEquals("MATCH_EVALUATION_REASON", booleanEvaluation.getReason());
Assertions.assertEquals("MATCH_EVALUATION_REASON", booleanEvaluation.getReason().toString());
}

@Test
Expand Down Expand Up @@ -93,31 +93,32 @@ void testBatch() {

// Variant
EvaluationResponse first = batch.getResponses().get(0);
Assertions.assertEquals("VARIANT_EVALUATION_RESPONSE_TYPE", first.getType());
Assertions.assertEquals("VARIANT_EVALUATION_RESPONSE_TYPE", first.getType().toString());

VariantEvaluationResponse variant = first.getVariantResponse().get();
Assertions.assertTrue(variant.isMatch());
Assertions.assertEquals("flag1", variant.getFlagKey());
Assertions.assertEquals("MATCH_EVALUATION_REASON", variant.getReason());
Assertions.assertEquals("MATCH_EVALUATION_REASON", variant.getReason().toString());
Assertions.assertEquals("variant1", variant.getVariantKey());
Assertions.assertEquals("segment1", variant.getSegmentKeys().get(0));

// Boolean
EvaluationResponse second = batch.getResponses().get(1);
Assertions.assertEquals("BOOLEAN_EVALUATION_RESPONSE_TYPE", second.getType());
Assertions.assertEquals("BOOLEAN_EVALUATION_RESPONSE_TYPE", second.getType().toString());

BooleanEvaluationResponse booleanEvaluation = second.getBooleanResponse().get();
Assertions.assertTrue(booleanEvaluation.isEnabled());
Assertions.assertEquals("flag_boolean", booleanEvaluation.getFlagKey());
Assertions.assertEquals("MATCH_EVALUATION_REASON", booleanEvaluation.getReason());
Assertions.assertEquals("MATCH_EVALUATION_REASON", booleanEvaluation.getReason().toString());

// Error
EvaluationResponse third = batch.getResponses().get(2);
Assertions.assertEquals("ERROR_EVALUATION_RESPONSE_TYPE", third.getType());
Assertions.assertEquals("ERROR_EVALUATION_RESPONSE_TYPE", third.getType().toString());

ErrorEvaluationResponse errorEvaluation = third.getErrorResponse().get();
Assertions.assertEquals("flag1234", errorEvaluation.getFlagKey());
Assertions.assertEquals("default", errorEvaluation.getNamespaceKey());
Assertions.assertEquals("NOT_FOUND_ERROR_EVALUATION_REASON", errorEvaluation.getReason());
Assertions.assertEquals(
"NOT_FOUND_ERROR_EVALUATION_REASON", errorEvaluation.getReason().toString());
}
}
23 changes: 19 additions & 4 deletions flipt-node/src/evaluation/models.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ export interface EvaluationRequest {
export interface VariantEvaluationResponse {
match: boolean;
segmentKeys: string[];
reason: string;
reason: EvaluationReason;
flagKey: string;
variantKey: string;
variantAttachment: string;
Expand All @@ -19,7 +19,7 @@ export interface VariantEvaluationResponse {
export interface BooleanEvaluationResponse {
enabled: boolean;
flagKey: string;
reason: string;
reason: EvaluationReason;
requestDurationMillis: number;
timestamp: string;
}
Expand All @@ -32,11 +32,11 @@ export interface BatchEvaluationRequest {
interface ErrorEvaluationResponse {
flagKey: string;
namespaceKey: string;
reason: string;
reason: ErrorEvaluationReason;
}

export interface EvaluationResponse {
type: string;
type: EvaluationResponseType;
booleanResponse?: BooleanEvaluationResponse;
variantResponse?: VariantEvaluationResponse;
errorResponse?: ErrorEvaluationResponse;
Expand All @@ -47,3 +47,18 @@ export interface BatchEvaluationResponse {
responses: EvaluationResponse[];
requestDurationMillis: number;
}

export type EvaluationResponseType =
| "VARIANT_EVALUATION_RESPONSE_TYPE"
| "BOOLEAN_EVALUATION_RESPONSE_TYPE"
| "ERROR_EVALUATION_RESPONSE_TYPE";

export type EvaluationReason =
| "UNKNOWN_EVALUATION_REASON"
| "FLAG_DISABLED_EVALUATION_REASON"
| "MATCH_EVALUATION_REASON"
| "DEFAULT_EVALUATION_REASON";

export type ErrorEvaluationReason =
| "UNKNOWN_ERROR_EVALUATION_REASON"
| "NOT_FOUND_ERROR_EVALUATION_REASON";
27 changes: 23 additions & 4 deletions flipt-python/flipt/evaluation/models.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,26 @@
import enum
from pydantic import BaseModel, Field
from typing import List, Optional


class EvaluationResponseType(str, enum.Enum):
VARIANT_EVALUATION_RESPONSE_TYPE = "VARIANT_EVALUATION_RESPONSE_TYPE"
BOOLEAN_EVALUATION_RESPONSE_TYPE = "BOOLEAN_EVALUATION_RESPONSE_TYPE"
ERROR_EVALUATION_RESPONSE_TYPE = "ERROR_EVALUATION_RESPONSE_TYPE"


class EvaluationReason(str, enum.Enum):
UNKNOWN_EVALUATION_REASON = "UNKNOWN_EVALUATION_REASON"
FLAG_DISABLED_EVALUATION_REASON = "FLAG_DISABLED_EVALUATION_REASON"
MATCH_EVALUATION_REASON = "MATCH_EVALUATION_REASON"
DEFAULT_EVALUATION_REASON = "DEFAULT_EVALUATION_REASON"


class ErrorEvaluationReason(str, enum.Enum):
UNKNOWN_ERROR_EVALUATION_REASON = "UNKNOWN_ERROR_EVALUATION_REASON"
NOT_FOUND_ERROR_EVALUATION_REASON = "NOT_FOUND_ERROR_EVALUATION_REASON"


class EvaluationRequest(BaseModel):
namespace_key: str = Field(default="default")
flag_key: str
Expand All @@ -17,7 +36,7 @@ class BatchEvaluationRequest(BaseModel):
class VariantEvaluationResponse(BaseModel):
match: bool
segment_keys: List[str] = Field(..., alias="segmentKeys")
reason: str
reason: EvaluationReason
flag_key: str = Field(..., alias="flagKey")
variant_key: str = Field(..., alias="variantKey")
variant_attachment: str = Field(..., alias="variantAttachment")
Expand All @@ -28,19 +47,19 @@ class VariantEvaluationResponse(BaseModel):
class BooleanEvaluationResponse(BaseModel):
enabled: bool
flag_key: str = Field(..., alias="flagKey")
reason: str
reason: EvaluationReason
request_duration_millis: float = Field(..., alias="requestDurationMillis")
timestamp: str


class ErrorEvaluationReponse(BaseModel):
flag_key: str = Field(..., alias="flagKey")
namespace_key: str = Field(..., alias="namespaceKey")
reason: str
reason: ErrorEvaluationReason


class EvaluationResponse(BaseModel):
type: str
type: EvaluationResponseType
boolean_response: Optional[BooleanEvaluationResponse] = Field(
default=None, alias="booleanResponse"
)
Expand Down
Loading

0 comments on commit 03e8d30

Please sign in to comment.