private static IEnumerable <MemberDeclarationSyntax> GenerateServiceMethod(string domain, HassService service) { var serviceName = service.Service !; var serviceArguments = ServiceArguments.Create(domain, service); var haContextVariableName = GetVariableName <IHaContext>("_"); var serviceMethodName = GetServiceMethodName(serviceName); var targetParam = service.Target is not null ? $"{SimplifyTypeName(typeof(ServiceTarget))} target" : null; var targetArg = service.Target is not null ? "target" : "null"; var targetComment = service.Target is not null?ParameterComment("target", "The target for this service call") : (SyntaxTrivia?)null; if (serviceArguments is null) { // method without arguments yield return(ParseMethod( $@"void {serviceMethodName}({targetParam}) {{ {haContextVariableName}.CallService(""{domain}"", ""{serviceName}"", {targetArg}); }}") .ToPublic() .WithSummaryComment(service.Description) .AppendTrivia(targetComment)); } else { // method using arguments object yield return(ParseMethod( $@"void {serviceMethodName}({JoinList(targetParam, serviceArguments.TypeName)} data) {{ {haContextVariableName}.CallService(""{domain}"", ""{serviceName}"", {targetArg}, data); }}") .ToPublic() .WithSummaryComment(service.Description) .AppendTrivia(targetComment)); // method using arguments as separate parameters yield return(ParseMethod( $@"void {serviceMethodName}({JoinList(targetParam, serviceArguments.GetParametersList())}) {{ {haContextVariableName}.CallService(""{domain}"", ""{serviceName}"", {targetArg}, {serviceArguments.GetNewServiceArgumentsTypeExpression()}); }}") .ToPublic() .WithSummaryComment(service.Description) .AppendTrivia(targetComment) .WithParameterComments(serviceArguments)); } }
private static IEnumerable <TypeDeclarationSyntax> GenerateServiceArgsRecord(string domain, HassService service) { var serviceArguments = ServiceArguments.Create(domain, service); if (serviceArguments is null) { yield break; } var autoProperties = serviceArguments.Arguments .Select(argument => Property($"{argument.TypeName!}?", argument.PropertyName !).ToPublic() .WithJsonPropertyName(argument.HaName !).WithSummaryComment(argument.Comment)) .ToArray(); yield return(Record(serviceArguments.TypeName, autoProperties).ToPublic()); }
private static IEnumerable <MemberDeclarationSyntax> GenerateExtensionMethod(string domain, HassService service) { var serviceName = service.Service !; var serviceArguments = ServiceArguments.Create(domain, service); var entityTypeName = GetDomainEntityTypeName(service.Target?.Entity?.Domain !); var enumerableTargetTypeName = $"IEnumerable<{entityTypeName}>"; if (serviceArguments is null) { yield return(ExtensionMethodWithoutArguments(service, serviceName, entityTypeName)); yield return(ExtensionMethodWithoutArguments(service, serviceName, enumerableTargetTypeName)); } else { yield return(ExtensionMethodWithClassArgument(service, serviceName, entityTypeName, serviceArguments)); yield return(ExtensionMethodWithClassArgument(service, serviceName, enumerableTargetTypeName, serviceArguments)); yield return(ExtensionMethodWithSeparateArguments(service, serviceName, entityTypeName, serviceArguments)); yield return(ExtensionMethodWithSeparateArguments(service, serviceName, enumerableTargetTypeName, serviceArguments)); } }