Skip to content

Commit

Permalink
Standardize service namespace management and handling
Browse files Browse the repository at this point in the history
  • Loading branch information
daviwil committed Apr 1, 2021
1 parent 6ac9e55 commit e9fd428
Showing 1 changed file with 27 additions and 18 deletions.
45 changes: 27 additions & 18 deletions packages/adl/lib/rest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -128,53 +128,62 @@ export function _delete(program: Program, entity: Type, subPath?: string) {

// -- Service-level Metadata

let _serviceTitle: { type: NamespaceType; title: string } | undefined = undefined;
const serviceDetails: {
namespace?: NamespaceType;
title?: string;
version?: string;
} = {};

export function _setServiceNamespace(namespace: NamespaceType): void {
if (serviceDetails.namespace && serviceDetails.namespace !== namespace) {
throw new Error("Cannot set service namespace more than once in an ADL project.");
}

serviceDetails.namespace = namespace;
}

export function _checkIfServiceNamespace(namespace: NamespaceType): boolean {
return serviceDetails.namespace === namespace;
}

export function serviceTitle(program: Program, entity: Type, title: string) {
if (_serviceTitle && _serviceTitle.type !== entity) {
if (serviceDetails.title) {
throw new Error("Service title can only be set once per ADL document.");
}

if (entity.kind !== "Namespace") {
throw new Error("The @serviceTitle decorator can only be applied to namespaces.");
}

_serviceTitle = {
type: entity,
title,
};
_setServiceNamespace(entity);
serviceDetails.title = title;
}

export function getServiceTitle(): string {
return _serviceTitle ? _serviceTitle.title : "(title)";
return serviceDetails.title || "(title)";
}

let _serviceVersion: { type: NamespaceType; version: string } | undefined = undefined;

export function serviceVersion(program: Program, entity: Type, version: string) {
// TODO: This will need to change once we support multiple service versions
if (_serviceVersion && _serviceVersion.type !== entity) {
if (serviceDetails.version) {
throw new Error("Service version can only be set once per ADL document.");
}

if (entity.kind !== "Namespace") {
throw new Error("The @serviceVersion decorator can only be applied to namespaces.");
}

_serviceVersion = {
type: entity,
version,
};
_setServiceNamespace(entity);
serviceDetails.version = version;
}

export function getServiceVersion(): string {
return _serviceVersion ? _serviceVersion.version : "0000-00-00";
return serviceDetails.version || "0000-00-00";
}

export function detectServiceNamespace(program: Program): string | undefined {
export function getServiceNamespaceString(program: Program): string | undefined {
return (
(_serviceTitle && program.checker!.getNamespaceString(_serviceTitle.type)) ||
(_serviceVersion && program.checker!.getNamespaceString(_serviceVersion.type)) ||
(serviceDetails.namespace && program.checker!.getNamespaceString(serviceDetails.namespace)) ||
undefined
);
}
Expand Down

0 comments on commit e9fd428

Please sign in to comment.