Skip to content

Commit

Permalink
feat: only change to new generic version if the service might return …
Browse files Browse the repository at this point in the history
…a response
  • Loading branch information
allout58 committed Sep 9, 2024
1 parent 0719d5e commit 853d39c
Showing 1 changed file with 31 additions and 13 deletions.
44 changes: 31 additions & 13 deletions src/i-call-service.extension.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { DOWN, is, TServiceParams, UP } from "@digital-alchemy/core";
import { HassServiceDTO, ServiceListField, ServiceListServiceTarget } from "@digital-alchemy/hass";
import { factory, SyntaxKind, TypeElement, TypeNode } from "typescript";
import { factory, SyntaxKind, TypeElement, TypeNode, TypeParameterDeclaration } from "typescript";

export async function ICallServiceExtension({ hass, type_build }: TServiceParams) {
return async function () {
Expand Down Expand Up @@ -49,31 +49,49 @@ export async function ICallServiceExtension({ hass, type_build }: TServiceParams
// > [service_name]: (service_data) => Promise<void | unknown>
// > }
// > }
const isReturnResponse = is.boolean(value.response?.optional);
const genericIdent = "T";
let defaultReturnType: TypeNode = factory.createKeywordTypeNode(SyntaxKind.VoidKeyword);

// Override default return type for some known cases
let defaultReturnType: TypeNode = factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);
if (domain === "weather" && key === "get_forecasts") {
defaultReturnType = factory.createTypeReferenceNode(
factory.createIdentifier("WeatherGetForecasts"),
undefined,
);
}

// Set up for the default case of (service_data) => Promise<void>
let generic: TypeParameterDeclaration[] | undefined = undefined;
let returnType: TypeNode | undefined = factory.createTypeReferenceNode(
factory.createIdentifier("Promise"),
[factory.createKeywordTypeNode(SyntaxKind.VoidKeyword)],
);

// If the service might return a response, change instead to <T = unknown>(service_data) => Promise<T>
if (isReturnResponse) {
generic = [
factory.createTypeParameterDeclaration(
undefined,
factory.createIdentifier(genericIdent),
undefined,
defaultReturnType,
),
];
returnType = factory.createExpressionWithTypeArguments(
factory.createIdentifier("Promise"),
[factory.createTypeReferenceNode(factory.createIdentifier(genericIdent), undefined)],
);
}

return type_build.tsdoc.serviceComment(
factory.createMethodSignature(
undefined,
factory.createIdentifier(key),
undefined,
[
factory.createTypeParameterDeclaration(
undefined,
factory.createIdentifier(genericIdent),
undefined,
defaultReturnType,
),
],
generic,
serviceParameters(domain, key, value),
factory.createExpressionWithTypeArguments(factory.createIdentifier("Promise"), [
factory.createTypeReferenceNode(factory.createIdentifier(genericIdent), undefined),
]),
returnType,
),
key,
value,
Expand Down

0 comments on commit 853d39c

Please sign in to comment.