Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[http-server-javascript] Implement scalar encoding #5819

Open
wants to merge 8 commits into
base: main
Choose a base branch
from
Prev Previous commit
Next Next commit
Clean up some of the encoder logic
  • Loading branch information
willmtemple committed Jan 30, 2025
commit 47fcf22187a358763acc08e339b7c66bea47f225
6 changes: 5 additions & 1 deletion packages/http-server-javascript/src/common/scalar.ts
Original file line number Diff line number Diff line change
@@ -579,7 +579,7 @@ export interface Encoder {
export interface JsScalar {
readonly type: string;

readonly scalar?: Scalar;
readonly scalar: Scalar | "unknown";

getEncoding(encoding: string, target: Scalar): Encoder | undefined;

@@ -601,8 +601,12 @@ const DEFAULT_STRING_ENCODER_RAW: Omit<Encoder, "target"> = {
},
};

/**
* A JsScalar value that represents an unknown scalar.
*/
export const JSSCALAR_UNKNOWN: JsScalar = {
type: "unknown",
scalar: "unknown",
getEncoding: () => undefined,
getDefaultMimeEncoding: () => undefined,
http: {
Original file line number Diff line number Diff line change
@@ -165,11 +165,10 @@ function* emitToJson(
const scalarEncoder = scalar.getEncoding(encoding.encoding ?? "default", encoding.type);

if (scalarEncoder) {
// Scalar must be defined here because we resolved an encoding. It can only be undefined when it comes
// from an `unknown` rendering, which cannot appear in a resolved encoding.
expr = transposeExpressionToJson(
ctx,
scalarEncoder.target.scalar!,
// Assertion: scalarEncoder.target.scalar is defined because we resolved an encoder.
scalarEncoder.target.scalar as Scalar,
scalarEncoder.encode(expr),
module,
);
@@ -267,7 +266,8 @@ function transposeExpressionToJson(
if (encoder.target.isJsonCompatible || !encoder.target.scalar) {
return encoded;
} else {
return transposeExpressionToJson(ctx, encoder.target.scalar, encoded, module);
// Assertion: encoder.target.scalar is a scalar because "unknown" is JSON compatible.
return transposeExpressionToJson(ctx, encoder.target.scalar as Scalar, encoded, module);
}
case "Union":
if (!requiresJsonSerialization(ctx, module, type)) {
@@ -401,7 +401,8 @@ function* emitFromJson(
if (scalarEncoder) {
expr = transposeExpressionFromJson(
ctx,
scalarEncoder.target.scalar!,
// Assertion: scalarEncoder.target.scalar is defined because we resolved an encoder.
scalarEncoder.target.scalar as Scalar,
scalarEncoder.decode(expr),
module,
);
@@ -416,7 +417,7 @@ function* emitFromJson(
},
});

// We treat this as unknown from here on out. The encoding was not decipher
// We treat this as unknown from here on out. The encoding was not deciphered.
}
} else {
expr = transposeExpressionFromJson(ctx, property.type, expr, module);
@@ -505,7 +506,8 @@ function transposeExpressionFromJson(
if (encoder.target.isJsonCompatible || !encoder.target.scalar) {
return decoded;
} else {
return transposeExpressionFromJson(ctx, encoder.target.scalar, decoded, module);
// Assertion: encoder.target.scalar is a scalar because "unknown" is JSON compatible.
return transposeExpressionFromJson(ctx, encoder.target.scalar as Scalar, decoded, module);
}
case "Union":
if (!requiresJsonSerialization(ctx, module, type)) {