Timothee Guerin 2024-03-12 14:49:17 -07:00 коммит произвёл GitHub
Родитель d8576effd5
Коммит 128a508c25
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: B5690EEEBB952194
3 изменённых файлов: 40 добавлений и 13 удалений

Просмотреть файл

@ -0,0 +1,8 @@
---
# Change versionKind to one of: internal, fix, dependencies, feature, deprecation, breaking
changeKind: feature
packages:
- "@typespec/compiler"
---
Enable the use of `@encode` for model properties that have a union type. This supports cases like `@encode("rfc3339") prop: utcDateTime | null`

Просмотреть файл

@ -756,25 +756,20 @@ export function $encode(
type: encodeAs ?? context.program.checker.getStdType("string"),
};
const targetType = getPropertyType(target);
if (targetType.kind !== "Scalar") {
return;
}
validateEncodeData(context, targetType, encodeData);
context.program.stateMap(encodeKey).set(target, encodeData);
}
function validateEncodeData(context: DecoratorContext, target: Scalar, encodeData: EncodeData) {
function validateEncodeData(context: DecoratorContext, target: Type, encodeData: EncodeData) {
function check(validTargets: StdTypeName[], validEncodeTypes: StdTypeName[]) {
const checker = context.program.checker;
const isTargetValid = validTargets.some((validTarget) => {
return ignoreDiagnostics(
checker.isTypeAssignableTo(
target.projectionBase ?? target,
checker.getStdType(validTarget),
target
)
);
});
const isTargetValid = isTypeIn(target.projectionBase ?? target, (type) =>
validTargets.some((validTarget) => {
return ignoreDiagnostics(
checker.isTypeAssignableTo(type, checker.getStdType(validTarget), target)
);
})
);
if (!isTargetValid) {
reportDiagnostic(context.program, {

Просмотреть файл

@ -587,6 +587,30 @@ describe("compiler: built-in decorators", () => {
strictEqual(getEncode(runner.program, s)?.encoding, "rfc3339");
});
it(`set encoding on model property`, async () => {
const { prop } = (await runner.compile(`
model Foo {
@encode("rfc3339")
@test
prop: utcDateTime;
}
`)) as { prop: ModelProperty };
strictEqual(getEncode(runner.program, prop)?.encoding, "rfc3339");
});
it(`set encoding on model property of union type`, async () => {
const { prop } = (await runner.compile(`
model Foo {
@encode("rfc3339")
@test
prop: utcDateTime | null;
}
`)) as { prop: ModelProperty };
strictEqual(getEncode(runner.program, prop)?.encoding, "rfc3339");
});
it(`encode type default to string`, async () => {
const { s } = (await runner.compile(`
@encode("rfc3339")