Skip to content

Commit

Permalink
Fix azure scalars (#343)
Browse files Browse the repository at this point in the history
  • Loading branch information
iscai-msft authored Mar 5, 2024
1 parent 2d1b9d4 commit ab3763f
Show file tree
Hide file tree
Showing 5 changed files with 104 additions and 128 deletions.
7 changes: 7 additions & 0 deletions .chronus/changes/fix_azure_scalars-2024-1-29-18-19-4.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
changeKind: internal
packages:
- "@azure-tools/typespec-client-generator-core"
---

clean up code for built in kidns and format
2 changes: 1 addition & 1 deletion packages/typespec-client-generator-core/doc/types.tsp
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ model SdkBuiltInType extends SdkType {
| "armId"
| "ipAddress"
| "azureLocation"
| "etag";
| "eTag";
encode: string;
}

Expand Down
112 changes: 79 additions & 33 deletions packages/typespec-client-generator-core/src/interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,41 +79,87 @@ export interface SdkBuiltInType extends SdkTypeBase {
encode: string;
}

type SdkIntKinds =
| "numeric"
| "integer"
| "safeint"
| "int8"
| "int16"
| "int32"
| "int64"
| "uint8"
| "uint16"
| "uint32"
| "uint64";

type SdkFloatKinds = "float" | "float32" | "float64" | "decimal" | "decimal128";

type SdkStringKinds =
| "string"
| "password"
| "guid"
| "url"
| "uuid"
| "etag"
| "armId"
| "ipAddress"
| "azureLocation";
enum SdkIntKindsEnum {
numeric = "numeric",
integer = "integer",
safeint = "safeint",
int8 = "int8",
int16 = "int16",
int32 = "int32",
int64 = "int64",
uint8 = "uint8",
uint16 = "uint16",
uint32 = "uint32",
uint64 = "uint64",
}

enum SdkFloatKindsEnum {
float = "float",
float32 = "float32",
float64 = "float64",
decimal = "decimal",
decimal128 = "decimal128",
}

enum SdkAzureBuiltInStringKindsEnum {
uuid = "uuid",
ipV4Address = "ipV4Address",
ipV6Address = "ipV6Address",
eTag = "eTag",
armId = "armId",
azureLocation = "azureLocation",
}

enum SdkGenericBuiltInStringKindsEnum {
string = "string",
password = "password",
guid = "guid",
url = "url",
uri = "uri",
ipAddress = "ipAddress",
}

enum SdkBuiltInKindsMiscellaneousEnum {
bytes = "bytes",
boolean = "boolean",
plainDate = "plainDate",
plainTime = "plainTime",
any = "any",
}

export type SdkBuiltInKinds =
| "bytes"
| "boolean"
| "plainDate"
| "plainTime"
| "any"
| SdkIntKinds
| SdkFloatKinds
| SdkStringKinds;
| keyof typeof SdkBuiltInKindsMiscellaneousEnum
| keyof typeof SdkIntKindsEnum
| keyof typeof SdkFloatKindsEnum
| keyof typeof SdkGenericBuiltInStringKindsEnum
| keyof typeof SdkAzureBuiltInStringKindsEnum;

export function getKnownScalars(): Record<string, SdkBuiltInKinds> {
const retval: Record<string, SdkBuiltInKinds> = {};
const typespecNamespace = Object.keys(SdkBuiltInKindsMiscellaneousEnum)
.concat(Object.keys(SdkIntKindsEnum))
.concat(Object.keys(SdkFloatKindsEnum))
.concat(Object.keys(SdkGenericBuiltInStringKindsEnum));
for (const kind of typespecNamespace) {
if (!isSdkBuiltInKind(kind)) continue; // it will always be true
retval[`TypeSpec.${kind}`] = kind;
}
for (const kind in SdkAzureBuiltInStringKindsEnum) {
if (!isSdkBuiltInKind(kind)) continue; // it will always be true
retval[`Azure.Core.${kind}`] = kind;
}
return retval;
}

export function isSdkBuiltInKind(kind: string): kind is SdkBuiltInKinds {
return (
kind in SdkBuiltInKindsMiscellaneousEnum ||
kind in SdkIntKindsEnum ||
kind in SdkFloatKindsEnum ||
kind in SdkGenericBuiltInStringKindsEnum ||
kind in SdkAzureBuiltInStringKindsEnum
);
}

const SdkDatetimeEncodingsConst = ["rfc3339", "rfc7231", "unixTimestamp"] as const;

Expand Down
62 changes: 11 additions & 51 deletions packages/typespec-client-generator-core/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ import {
SdkModelType,
SdkTupleType,
SdkType,
getKnownScalars,
isSdkBuiltInKind,
} from "./interfaces.js";
import { createDiagnostic } from "./lib.js";
import {
Expand Down Expand Up @@ -117,26 +119,8 @@ function addFormatInfo(
type: ModelProperty | Scalar,
propertyType: SdkType
): void {
const format = getFormat(context.program, type);
if (format) {
switch (format) {
case "guid":
case "uuid":
case "password":
case "etag":
case "azureLocation":
case "armId":
case "ipAddress":
propertyType.kind = format;
break;
case "url":
case "uri":
propertyType.kind = "url";
break;
default:
break;
}
}
const format = getFormat(context.program, type) ?? "";
if (isSdkBuiltInKind(format)) propertyType.kind = format;
}

/**
Expand Down Expand Up @@ -187,34 +171,10 @@ function addEncodeInfo(
* @returns the corresponding sdk built in kind
*/
function getScalarKind(scalar: Scalar): SdkBuiltInKinds {
switch (scalar.name) {
case "int8":
case "int16":
case "int32":
case "int64":
case "uint8":
case "uint16":
case "uint32":
case "uint64":
case "numeric":
case "integer":
case "safeint":
case "decimal128":
case "bytes":
case "float":
case "float32":
case "float64":
case "boolean":
case "string":
case "url":
case "decimal":
case "plainDate":
case "plainTime":
case "azureLocation":
return scalar.name;
default:
throw Error(`Unknown scalar kind ${scalar.name}`);
if (isSdkBuiltInKind(scalar.name)) {
return scalar.name;
}
throw Error(`Unknown scalar kind ${scalar.name}`);
}

/**
Expand All @@ -230,7 +190,9 @@ export function getSdkBuiltInType(
if (context.program.checker.isStdType(type) || type.kind === "Intrinsic") {
let kind: SdkBuiltInKinds = "any";
if (type.kind === "Scalar") {
kind = getScalarKind(type);
if (isSdkBuiltInKind(type.name)) {
kind = getScalarKind(type);
}
}
return {
...getSdkTypeBaseHelper(context, type, kind),
Expand Down Expand Up @@ -747,9 +709,7 @@ export function getClientTypeWithDiagnostics(
operation?: Operation
): [SdkType, readonly Diagnostic[]] {
if (!context.knownScalars) {
context.knownScalars = {
"Azure.Core.azureLocation": "azureLocation",
};
context.knownScalars = getKnownScalars();
}
const diagnostics = createDiagnosticCollector();
let retval: SdkType | undefined = undefined;
Expand Down
49 changes: 6 additions & 43 deletions packages/typespec-client-generator-core/test/types.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -147,58 +147,21 @@ describe("typespec-client-generator-core: types", () => {
await runnerWithCore.compile(
`
@useDependency(Azure.Core.Versions.v1_0_Preview_2)
@service({})
namespace MyService;
@format("guid")
scalar guid extends string;
@format("url")
scalar url extends string;
@format("uuid")
scalar uuid extends string;
@format("password")
scalar password extends string;
@format("armId")
scalar armId extends string;
@format("ipAddress")
scalar ipAddress extends string;
@format("etag")
scalar etag extends string;
@service
namespace MyNamespace;
@usage(Usage.input | Usage.output)
@access(Access.public)
model Test {
guidScalar: guid;
urlScalar: url;
uuidScalar: uuid;
passwordScalar: password;
armIdScalar: armId;
ipAddressScalar: ipAddress;
azureLocationScalar: azureLocation;
etagScalar: etag;
@format("guid")
guidProperty: string;
eTagScalar: eTag;
@format("url")
urlProperty: string;
@format("uuid")
uuidProperty: string;
@format("password")
passwordProperty: string;
@format("armId")
armIdProperty: string;
@format("ipAddress")
ipAddressProperty: string;
@format("azureLocation")
azureLocationProperty: string;
@format("etag")
etagProperty: string;
@format("eTag")
eTagProperty: string;
}
`
);
Expand Down

0 comments on commit ab3763f

Please sign in to comment.