From 21e5ed25041a2f8e0b95074f7f194611975d54ba Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Fri, 27 Mar 2026 11:00:54 -0700 Subject: [PATCH 1/5] Unify ATS withEnvironment exports Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../ValidationAppHost/apphost.ts | 8 +- .../ValidationAppHost/apphost.ts | 12 +- .../AzureBicepResourceExtensions.cs | 4 +- .../AtsTypeScriptCodeGenerator.cs | 7 + .../api/Aspire.Hosting.SqlServer.ats.txt | 153 +++- .../IManifestExpressionProvider.cs | 1 + .../ApplicationModel/IValueProvider.cs | 1 + .../ResourceBuilderExtensions.cs | 64 +- .../api/Aspire.Hosting.Capabilities.txt | 151 +++- ...ContainerResourceCapabilities.verified.txt | 56 -- ...TwoPassScanningGeneratedAspire.verified.ts | 774 +----------------- 11 files changed, 370 insertions(+), 861 deletions(-) diff --git a/playground/polyglot/TypeScript/Aspire.Hosting.Azure/ValidationAppHost/apphost.ts b/playground/polyglot/TypeScript/Aspire.Hosting.Azure/ValidationAppHost/apphost.ts index 26c1b2f02f2..c4981e3ec2b 100644 --- a/playground/polyglot/TypeScript/Aspire.Hosting.Azure/ValidationAppHost/apphost.ts +++ b/playground/polyglot/TypeScript/Aspire.Hosting.Azure/ValidationAppHost/apphost.ts @@ -89,12 +89,12 @@ await identity.publishAsExisting("identity-existing", "rg-identity"); await identity.publishAsExistingFromParameters(existingName, existingResourceGroup); await identity.asExisting(existingName, existingResourceGroup); -await container.withEnvironmentFromOutput("INFRA_URL", infrastructureOutput); -await container.withEnvironmentFromKeyVaultSecret("SECRET_FROM_IDENTITY", identity); +await container.withEnvironment("INFRA_URL", infrastructureOutput); +await container.withEnvironment("SECRET_FROM_IDENTITY", identity); await container.withAzureUserAssignedIdentity(identity); -await executable.withEnvironmentFromOutput("INFRA_URL", infrastructureOutput); -await executable.withEnvironmentFromKeyVaultSecret("SECRET_FROM_IDENTITY", identity); +await executable.withEnvironment("INFRA_URL", infrastructureOutput); +await executable.withEnvironment("SECRET_FROM_IDENTITY", identity); await executable.withAzureUserAssignedIdentity(identity); await builder.build().run(); diff --git a/playground/polyglot/TypeScript/Aspire.Hosting/ValidationAppHost/apphost.ts b/playground/polyglot/TypeScript/Aspire.Hosting/ValidationAppHost/apphost.ts index 4ecf0adeae4..c2c26d6fb86 100644 --- a/playground/polyglot/TypeScript/Aspire.Hosting/ValidationAppHost/apphost.ts +++ b/playground/polyglot/TypeScript/Aspire.Hosting/ValidationAppHost/apphost.ts @@ -73,14 +73,14 @@ await builtConnectionString.withConnectionPropertyValue("Mode", "Development"); // ResourceBuilderExtensions.cs — NEW exports on ContainerResource // =================================================================== -// withEnvironmentEndpoint -await container.withEnvironmentEndpoint("MY_ENDPOINT", endpoint); +// withEnvironment - EndpointReference +await container.withEnvironment("MY_ENDPOINT", endpoint); -// withEnvironmentParameter -await container.withEnvironmentParameter("MY_PARAM", configParam); +// withEnvironment - ParameterResource +await container.withEnvironment("MY_PARAM", configParam); -// withEnvironmentConnectionString -await container.withEnvironmentConnectionString("MY_CONN", builtConnectionString); +// withEnvironment - connection string resource +await container.withEnvironment("MY_CONN", builtConnectionString); // withConnectionProperty — with ReferenceExpression await builtConnectionString.withConnectionProperty("Endpoint", expr); diff --git a/src/Aspire.Hosting.Azure/AzureBicepResourceExtensions.cs b/src/Aspire.Hosting.Azure/AzureBicepResourceExtensions.cs index feb46a28a53..099bebb6c7d 100644 --- a/src/Aspire.Hosting.Azure/AzureBicepResourceExtensions.cs +++ b/src/Aspire.Hosting.Azure/AzureBicepResourceExtensions.cs @@ -78,7 +78,7 @@ public static BicepSecretOutputReference GetSecretOutput(this IResourceBuilderThe name of the environment variable. /// The reference to the bicep output. /// An . - [AspireExport("withEnvironmentFromOutput", Description = "Sets an environment variable from a Bicep output reference")] + [AspireExportIgnore(Reason = "Polyglot app hosts use the internal withEnvironment dispatcher export.")] public static IResourceBuilder WithEnvironment(this IResourceBuilder builder, string name, BicepOutputReference bicepOutputReference) where T : IResourceWithEnvironment { @@ -116,7 +116,7 @@ public static IResourceBuilder WithEnvironment(this IResourceBuilder bu /// The name of the environment variable. /// The reference to the key vault secret. /// An . - [AspireExport("withEnvironmentFromKeyVaultSecret", Description = "Sets an environment variable from an Azure Key Vault secret reference")] + [AspireExportIgnore(Reason = "Polyglot app hosts use the internal withEnvironment dispatcher export.")] public static IResourceBuilder WithEnvironment(this IResourceBuilder builder, string name, IAzureKeyVaultSecretReference secretReference) where T : IResourceWithEnvironment { diff --git a/src/Aspire.Hosting.CodeGeneration.TypeScript/AtsTypeScriptCodeGenerator.cs b/src/Aspire.Hosting.CodeGeneration.TypeScript/AtsTypeScriptCodeGenerator.cs index 8d2b152a7e7..27cea8722bb 100644 --- a/src/Aspire.Hosting.CodeGeneration.TypeScript/AtsTypeScriptCodeGenerator.cs +++ b/src/Aspire.Hosting.CodeGeneration.TypeScript/AtsTypeScriptCodeGenerator.cs @@ -272,6 +272,13 @@ private string MapParameterToTypeScript(AtsParameterInfo param) return GenerateCallbackTypeSignature(param.CallbackParameters, param.CallbackReturnType); } + if (param.Type?.Category == AtsTypeCategory.Union && param.Type.UnionTypes is { Count: > 0 }) + { + return string.Join(" | ", param.Type.UnionTypes + .Select(MapInputTypeToTypeScript) + .Distinct()); + } + return MapInputTypeToTypeScript(param.Type); } diff --git a/src/Aspire.Hosting.SqlServer/api/Aspire.Hosting.SqlServer.ats.txt b/src/Aspire.Hosting.SqlServer/api/Aspire.Hosting.SqlServer.ats.txt index 31fbe131e07..acb99dc241e 100644 --- a/src/Aspire.Hosting.SqlServer/api/Aspire.Hosting.SqlServer.ats.txt +++ b/src/Aspire.Hosting.SqlServer/api/Aspire.Hosting.SqlServer.ats.txt @@ -1,26 +1,26 @@ # Aspire Type System Capabilities # Generated by: aspire sdk dump --format ci -# Diagnostics -warning: Method 'addConnectionString' has collisions (Aspire.Hosting/addConnectionString, Aspire.Hosting/addConnectionStringExpression). 'Aspire.Hosting/addConnectionStringExpression' was removed. Use [AspireExport(MethodName = "uniqueName")] to set an explicit name. [Aspire.Hosting/addConnectionStringExpression] -warning: Method 'addContainerRegistry' has collisions (Aspire.Hosting/addContainerRegistry, Aspire.Hosting/addContainerRegistryFromString). 'Aspire.Hosting/addContainerRegistryFromString' was removed. Use [AspireExport(MethodName = "uniqueName")] to set an explicit name. [Aspire.Hosting/addContainerRegistryFromString] -warning: Method 'addExternalService' has collisions (Aspire.Hosting/addExternalService, Aspire.Hosting/addExternalServiceParameter, Aspire.Hosting/addExternalServiceUri). 'Aspire.Hosting/addExternalServiceParameter' was removed. Use [AspireExport(MethodName = "uniqueName")] to set an explicit name. [Aspire.Hosting/addExternalServiceParameter] -warning: Method 'addExternalService' has collisions (Aspire.Hosting/addExternalService, Aspire.Hosting/addExternalServiceParameter, Aspire.Hosting/addExternalServiceUri). 'Aspire.Hosting/addExternalServiceUri' was removed. Use [AspireExport(MethodName = "uniqueName")] to set an explicit name. [Aspire.Hosting/addExternalServiceUri] -warning: Method 'addParameter' has collisions (Aspire.Hosting/addParameter, Aspire.Hosting/addParameterWithValue). 'Aspire.Hosting/addParameterWithValue' was removed. Use [AspireExport(MethodName = "uniqueName")] to set an explicit name. [Aspire.Hosting/addParameterWithValue] - # Handle Types Aspire.Hosting.SqlServer/Aspire.Hosting.ApplicationModel.SqlServerDatabaseResource [ExposeProperties] Aspire.Hosting.SqlServer/Aspire.Hosting.ApplicationModel.SqlServerServerResource [ExposeProperties] +Aspire.Hosting/Aspire.Hosting.ApplicationModel.AfterResourcesCreatedEvent [ExposeProperties] +Aspire.Hosting/Aspire.Hosting.ApplicationModel.BeforeResourceStartedEvent [ExposeProperties] +Aspire.Hosting/Aspire.Hosting.ApplicationModel.BeforeStartEvent [ExposeProperties] Aspire.Hosting/Aspire.Hosting.ApplicationModel.CommandLineArgsCallbackContext [ExposeProperties] +Aspire.Hosting/Aspire.Hosting.ApplicationModel.ConnectionStringAvailableEvent [ExposeProperties] Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerRegistryResource Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerResource Aspire.Hosting/Aspire.Hosting.ApplicationModel.CSharpAppResource +Aspire.Hosting/Aspire.Hosting.ApplicationModel.DistributedApplicationModel Aspire.Hosting/Aspire.Hosting.ApplicationModel.DotnetToolResource Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReferenceExpression [ExposeProperties] Aspire.Hosting/Aspire.Hosting.ApplicationModel.EnvironmentCallbackContext [ExposeProperties] Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecutableResource Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext [ExposeProperties] +Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider [interface] +Aspire.Hosting/Aspire.Hosting.ApplicationModel.InitializeResourceEvent [ExposeProperties] Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource [interface] Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithArgs [interface] Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithConnectionString [interface] @@ -28,12 +28,16 @@ Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEndpoints [interface Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment [interface] Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithParent [interface] Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithWaitSupport [interface] +Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider [interface] Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource Aspire.Hosting/Aspire.Hosting.ApplicationModel.ProjectResource Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpression Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpressionBuilder [ExposeProperties] +Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceEndpointsAllocatedEvent [ExposeProperties] Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceLoggerService Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceNotificationService +Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceReadyEvent [ExposeProperties] +Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceStoppedEvent [ExposeProperties] Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceUrlsCallbackContext [ExposeProperties] Aspire.Hosting/Aspire.Hosting.ApplicationModel.UpdateCommandStateContext [ExposeProperties] Aspire.Hosting/Aspire.Hosting.ConnectionStringResource @@ -48,12 +52,21 @@ Aspire.Hosting/Aspire.Hosting.Eventing.IDistributedApplicationResourceEvent [int Aspire.Hosting/Aspire.Hosting.ExternalServiceResource Aspire.Hosting/Aspire.Hosting.IDistributedApplicationBuilder [interface] Aspire.Hosting/Aspire.Hosting.IResourceWithContainerFiles [interface] +Aspire.Hosting/Aspire.Hosting.IUserSecretsManager [interface, ExposeProperties, ExposeMethods] +Aspire.Hosting/Aspire.Hosting.Pipelines.IReportingStep [interface] +Aspire.Hosting/Aspire.Hosting.Pipelines.IReportingTask [interface] Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineConfigurationContext [ExposeProperties] +Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineContext [ExposeProperties] Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep [ExposeProperties] Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext [ExposeProperties] +Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepFactoryContext [ExposeProperties] +Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineSummary [ExposeMethods] Aspire.Hosting/Aspire.Hosting.ProjectResourceOptions [ExposeProperties] Microsoft.Extensions.Configuration.Abstractions/Microsoft.Extensions.Configuration.IConfiguration [interface] -Microsoft.Extensions.Hosting.Abstractions/Microsoft.Extensions.Hosting.IHostEnvironment [interface] +Microsoft.Extensions.Configuration.Abstractions/Microsoft.Extensions.Configuration.IConfigurationSection [interface, ExposeProperties] +Microsoft.Extensions.Hosting.Abstractions/Microsoft.Extensions.Hosting.IHostEnvironment [interface, ExposeProperties] +Microsoft.Extensions.Logging.Abstractions/Microsoft.Extensions.Logging.ILogger [interface] +Microsoft.Extensions.Logging.Abstractions/Microsoft.Extensions.Logging.ILoggerFactory [interface] System.ComponentModel/System.IServiceProvider [interface] System.Private.CoreLib/System.Threading.CancellationToken @@ -106,16 +119,28 @@ enum:Aspire.Hosting.OtlpProtocol = Grpc | HttpProtobuf | HttpJson enum:System.Net.Sockets.ProtocolType = IP | IPv6HopByHopOptions | Unspecified | Icmp | Igmp | Ggp | IPv4 | Tcp | Pup | Udp | Idp | IPv6 | IPv6RoutingHeader | IPv6FragmentHeader | IPSecEncapsulatingSecurityPayload | IPSecAuthenticationHeader | IcmpV6 | IPv6NoNextHeader | IPv6DestinationOptions | ND | Raw | Ipx | Spx | SpxII | Unknown # Capabilities +Aspire.Hosting.ApplicationModel/AfterResourcesCreatedEvent.model(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.AfterResourcesCreatedEvent) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.DistributedApplicationModel +Aspire.Hosting.ApplicationModel/AfterResourcesCreatedEvent.services(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.AfterResourcesCreatedEvent) -> System.ComponentModel/System.IServiceProvider Aspire.Hosting.ApplicationModel/appendFormatted(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpressionBuilder, value: string, format?: string) -> void Aspire.Hosting.ApplicationModel/appendLiteral(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpressionBuilder, value: string) -> void Aspire.Hosting.ApplicationModel/appendValueProvider(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpressionBuilder, valueProvider: any, format?: string) -> void +Aspire.Hosting.ApplicationModel/BeforeResourceStartedEvent.resource(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.BeforeResourceStartedEvent) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource +Aspire.Hosting.ApplicationModel/BeforeResourceStartedEvent.services(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.BeforeResourceStartedEvent) -> System.ComponentModel/System.IServiceProvider +Aspire.Hosting.ApplicationModel/BeforeStartEvent.model(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.BeforeStartEvent) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.DistributedApplicationModel +Aspire.Hosting.ApplicationModel/BeforeStartEvent.services(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.BeforeStartEvent) -> System.ComponentModel/System.IServiceProvider Aspire.Hosting.ApplicationModel/build(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpressionBuilder) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpression Aspire.Hosting.ApplicationModel/CommandLineArgsCallbackContext.args(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.CommandLineArgsCallbackContext) -> Aspire.Hosting/List Aspire.Hosting.ApplicationModel/CommandLineArgsCallbackContext.cancellationToken(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.CommandLineArgsCallbackContext) -> cancellationToken Aspire.Hosting.ApplicationModel/CommandLineArgsCallbackContext.executionContext(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.CommandLineArgsCallbackContext) -> Aspire.Hosting/Aspire.Hosting.DistributedApplicationExecutionContext +Aspire.Hosting.ApplicationModel/CommandLineArgsCallbackContext.logger(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.CommandLineArgsCallbackContext) -> Microsoft.Extensions.Logging.Abstractions/Microsoft.Extensions.Logging.ILogger +Aspire.Hosting.ApplicationModel/CommandLineArgsCallbackContext.resource(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.CommandLineArgsCallbackContext) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource Aspire.Hosting.ApplicationModel/CommandLineArgsCallbackContext.setExecutionContext(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.CommandLineArgsCallbackContext, value: Aspire.Hosting/Aspire.Hosting.DistributedApplicationExecutionContext) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.CommandLineArgsCallbackContext +Aspire.Hosting.ApplicationModel/CommandLineArgsCallbackContext.setLogger(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.CommandLineArgsCallbackContext, value: Microsoft.Extensions.Logging.Abstractions/Microsoft.Extensions.Logging.ILogger) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.CommandLineArgsCallbackContext +Aspire.Hosting.ApplicationModel/ConnectionStringAvailableEvent.resource(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ConnectionStringAvailableEvent) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource +Aspire.Hosting.ApplicationModel/ConnectionStringAvailableEvent.services(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ConnectionStringAvailableEvent) -> System.ComponentModel/System.IServiceProvider Aspire.Hosting.ApplicationModel/EndpointReference.endpointName(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference) -> string Aspire.Hosting.ApplicationModel/EndpointReference.errorMessage(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference) -> string +Aspire.Hosting.ApplicationModel/EndpointReference.excludeReferenceEndpoint(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference) -> boolean Aspire.Hosting.ApplicationModel/EndpointReference.exists(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference) -> boolean Aspire.Hosting.ApplicationModel/EndpointReference.getTlsValue(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference, enabledValue: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpression, disabledValue: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpression) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpression Aspire.Hosting.ApplicationModel/EndpointReference.host(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference) -> string @@ -123,6 +148,7 @@ Aspire.Hosting.ApplicationModel/EndpointReference.isAllocated(context: Aspire.Ho Aspire.Hosting.ApplicationModel/EndpointReference.isHttp(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference) -> boolean Aspire.Hosting.ApplicationModel/EndpointReference.isHttps(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference) -> boolean Aspire.Hosting.ApplicationModel/EndpointReference.port(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference) -> number +Aspire.Hosting.ApplicationModel/EndpointReference.resource(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEndpoints Aspire.Hosting.ApplicationModel/EndpointReference.scheme(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference) -> string Aspire.Hosting.ApplicationModel/EndpointReference.setErrorMessage(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference, value: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference Aspire.Hosting.ApplicationModel/EndpointReference.targetPort(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference) -> number @@ -134,14 +160,34 @@ Aspire.Hosting.ApplicationModel/EndpointReferenceExpression.valueExpression(cont Aspire.Hosting.ApplicationModel/EnvironmentCallbackContext.cancellationToken(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EnvironmentCallbackContext) -> cancellationToken Aspire.Hosting.ApplicationModel/EnvironmentCallbackContext.environmentVariables(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EnvironmentCallbackContext) -> Aspire.Hosting/Dict Aspire.Hosting.ApplicationModel/EnvironmentCallbackContext.executionContext(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EnvironmentCallbackContext) -> Aspire.Hosting/Aspire.Hosting.DistributedApplicationExecutionContext +Aspire.Hosting.ApplicationModel/EnvironmentCallbackContext.logger(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EnvironmentCallbackContext) -> Microsoft.Extensions.Logging.Abstractions/Microsoft.Extensions.Logging.ILogger +Aspire.Hosting.ApplicationModel/EnvironmentCallbackContext.resource(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EnvironmentCallbackContext) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource +Aspire.Hosting.ApplicationModel/EnvironmentCallbackContext.setLogger(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EnvironmentCallbackContext, value: Microsoft.Extensions.Logging.Abstractions/Microsoft.Extensions.Logging.ILogger) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.EnvironmentCallbackContext Aspire.Hosting.ApplicationModel/ExecuteCommandContext.cancellationToken(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext) -> cancellationToken Aspire.Hosting.ApplicationModel/ExecuteCommandContext.resourceName(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext) -> string +Aspire.Hosting.ApplicationModel/ExecuteCommandContext.serviceProvider(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext) -> System.ComponentModel/System.IServiceProvider Aspire.Hosting.ApplicationModel/ExecuteCommandContext.setCancellationToken(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext, value: cancellationToken) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext Aspire.Hosting.ApplicationModel/ExecuteCommandContext.setResourceName(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext, value: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext +Aspire.Hosting.ApplicationModel/ExecuteCommandContext.setServiceProvider(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext, value: System.ComponentModel/System.IServiceProvider) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext +Aspire.Hosting.ApplicationModel/getValue(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpression, cancellationToken: cancellationToken) -> string Aspire.Hosting.ApplicationModel/getValueAsync(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference, cancellationToken?: cancellationToken) -> string +Aspire.Hosting.ApplicationModel/InitializeResourceEvent.eventing(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.InitializeResourceEvent) -> Aspire.Hosting/Aspire.Hosting.Eventing.IDistributedApplicationEventing +Aspire.Hosting.ApplicationModel/InitializeResourceEvent.logger(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.InitializeResourceEvent) -> Microsoft.Extensions.Logging.Abstractions/Microsoft.Extensions.Logging.ILogger +Aspire.Hosting.ApplicationModel/InitializeResourceEvent.notifications(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.InitializeResourceEvent) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceNotificationService +Aspire.Hosting.ApplicationModel/InitializeResourceEvent.resource(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.InitializeResourceEvent) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource +Aspire.Hosting.ApplicationModel/InitializeResourceEvent.services(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.InitializeResourceEvent) -> System.ComponentModel/System.IServiceProvider Aspire.Hosting.ApplicationModel/ReferenceExpressionBuilder.isEmpty(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpressionBuilder) -> boolean +Aspire.Hosting.ApplicationModel/ResourceEndpointsAllocatedEvent.resource(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceEndpointsAllocatedEvent) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource +Aspire.Hosting.ApplicationModel/ResourceEndpointsAllocatedEvent.services(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceEndpointsAllocatedEvent) -> System.ComponentModel/System.IServiceProvider +Aspire.Hosting.ApplicationModel/ResourceReadyEvent.resource(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceReadyEvent) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource +Aspire.Hosting.ApplicationModel/ResourceReadyEvent.services(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceReadyEvent) -> System.ComponentModel/System.IServiceProvider +Aspire.Hosting.ApplicationModel/ResourceStoppedEvent.resource(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceStoppedEvent) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource +Aspire.Hosting.ApplicationModel/ResourceStoppedEvent.services(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceStoppedEvent) -> System.ComponentModel/System.IServiceProvider Aspire.Hosting.ApplicationModel/ResourceUrlsCallbackContext.cancellationToken(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceUrlsCallbackContext) -> cancellationToken Aspire.Hosting.ApplicationModel/ResourceUrlsCallbackContext.executionContext(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceUrlsCallbackContext) -> Aspire.Hosting/Aspire.Hosting.DistributedApplicationExecutionContext +Aspire.Hosting.ApplicationModel/ResourceUrlsCallbackContext.logger(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceUrlsCallbackContext) -> Microsoft.Extensions.Logging.Abstractions/Microsoft.Extensions.Logging.ILogger +Aspire.Hosting.ApplicationModel/ResourceUrlsCallbackContext.resource(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceUrlsCallbackContext) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource +Aspire.Hosting.ApplicationModel/ResourceUrlsCallbackContext.setLogger(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceUrlsCallbackContext, value: Microsoft.Extensions.Logging.Abstractions/Microsoft.Extensions.Logging.ILogger) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceUrlsCallbackContext Aspire.Hosting.ApplicationModel/ResourceUrlsCallbackContext.urls(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceUrlsCallbackContext) -> Aspire.Hosting/List Aspire.Hosting.ApplicationModel/SqlServerDatabaseResource.connectionStringExpression(context: Aspire.Hosting.SqlServer/Aspire.Hosting.ApplicationModel.SqlServerDatabaseResource) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpression Aspire.Hosting.ApplicationModel/SqlServerDatabaseResource.databaseName(context: Aspire.Hosting.SqlServer/Aspire.Hosting.ApplicationModel.SqlServerDatabaseResource) -> string @@ -155,30 +201,60 @@ Aspire.Hosting.ApplicationModel/SqlServerServerResource.entrypoint(context: Aspi Aspire.Hosting.ApplicationModel/SqlServerServerResource.host(context: Aspire.Hosting.SqlServer/Aspire.Hosting.ApplicationModel.SqlServerServerResource) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReferenceExpression Aspire.Hosting.ApplicationModel/SqlServerServerResource.jdbcConnectionString(context: Aspire.Hosting.SqlServer/Aspire.Hosting.ApplicationModel.SqlServerServerResource) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpression Aspire.Hosting.ApplicationModel/SqlServerServerResource.name(context: Aspire.Hosting.SqlServer/Aspire.Hosting.ApplicationModel.SqlServerServerResource) -> string +Aspire.Hosting.ApplicationModel/SqlServerServerResource.passwordParameter(context: Aspire.Hosting.SqlServer/Aspire.Hosting.ApplicationModel.SqlServerServerResource) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource Aspire.Hosting.ApplicationModel/SqlServerServerResource.port(context: Aspire.Hosting.SqlServer/Aspire.Hosting.ApplicationModel.SqlServerServerResource) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReferenceExpression Aspire.Hosting.ApplicationModel/SqlServerServerResource.primaryEndpoint(context: Aspire.Hosting.SqlServer/Aspire.Hosting.ApplicationModel.SqlServerServerResource) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference Aspire.Hosting.ApplicationModel/SqlServerServerResource.setEntrypoint(context: Aspire.Hosting.SqlServer/Aspire.Hosting.ApplicationModel.SqlServerServerResource, value: string) -> Aspire.Hosting.SqlServer/Aspire.Hosting.ApplicationModel.SqlServerServerResource +Aspire.Hosting.ApplicationModel/SqlServerServerResource.setPasswordParameter(context: Aspire.Hosting.SqlServer/Aspire.Hosting.ApplicationModel.SqlServerServerResource, value: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource) -> Aspire.Hosting.SqlServer/Aspire.Hosting.ApplicationModel.SqlServerServerResource Aspire.Hosting.ApplicationModel/SqlServerServerResource.setShellExecution(context: Aspire.Hosting.SqlServer/Aspire.Hosting.ApplicationModel.SqlServerServerResource, value: boolean) -> Aspire.Hosting.SqlServer/Aspire.Hosting.ApplicationModel.SqlServerServerResource Aspire.Hosting.ApplicationModel/SqlServerServerResource.shellExecution(context: Aspire.Hosting.SqlServer/Aspire.Hosting.ApplicationModel.SqlServerServerResource) -> boolean Aspire.Hosting.ApplicationModel/SqlServerServerResource.uriExpression(context: Aspire.Hosting.SqlServer/Aspire.Hosting.ApplicationModel.SqlServerServerResource) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpression Aspire.Hosting.ApplicationModel/SqlServerServerResource.userNameReference(context: Aspire.Hosting.SqlServer/Aspire.Hosting.ApplicationModel.SqlServerServerResource) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpression +Aspire.Hosting.ApplicationModel/UpdateCommandStateContext.serviceProvider(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.UpdateCommandStateContext) -> System.ComponentModel/System.IServiceProvider +Aspire.Hosting.ApplicationModel/UpdateCommandStateContext.setServiceProvider(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.UpdateCommandStateContext, value: System.ComponentModel/System.IServiceProvider) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.UpdateCommandStateContext Aspire.Hosting.Eventing/IDistributedApplicationEventing.unsubscribe(context: Aspire.Hosting/Aspire.Hosting.Eventing.IDistributedApplicationEventing, subscription: Aspire.Hosting/Aspire.Hosting.Eventing.DistributedApplicationEventSubscription) -> void Aspire.Hosting.Pipelines/dependsOn(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep, stepName: string) -> void Aspire.Hosting.Pipelines/getStepsByTag(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineConfigurationContext, tag: string) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep[] +Aspire.Hosting.Pipelines/PipelineConfigurationContext.model(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineConfigurationContext) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.DistributedApplicationModel +Aspire.Hosting.Pipelines/PipelineConfigurationContext.services(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineConfigurationContext) -> System.ComponentModel/System.IServiceProvider +Aspire.Hosting.Pipelines/PipelineConfigurationContext.setModel(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineConfigurationContext, value: Aspire.Hosting/Aspire.Hosting.ApplicationModel.DistributedApplicationModel) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineConfigurationContext +Aspire.Hosting.Pipelines/PipelineConfigurationContext.setServices(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineConfigurationContext, value: System.ComponentModel/System.IServiceProvider) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineConfigurationContext Aspire.Hosting.Pipelines/PipelineConfigurationContext.setSteps(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineConfigurationContext, value: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep[]) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineConfigurationContext Aspire.Hosting.Pipelines/PipelineConfigurationContext.steps(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineConfigurationContext) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep[] +Aspire.Hosting.Pipelines/PipelineContext.cancellationToken(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineContext) -> cancellationToken +Aspire.Hosting.Pipelines/PipelineContext.executionContext(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineContext) -> Aspire.Hosting/Aspire.Hosting.DistributedApplicationExecutionContext +Aspire.Hosting.Pipelines/PipelineContext.logger(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineContext) -> Microsoft.Extensions.Logging.Abstractions/Microsoft.Extensions.Logging.ILogger +Aspire.Hosting.Pipelines/PipelineContext.model(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineContext) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.DistributedApplicationModel +Aspire.Hosting.Pipelines/PipelineContext.services(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineContext) -> System.ComponentModel/System.IServiceProvider +Aspire.Hosting.Pipelines/PipelineContext.setCancellationToken(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineContext, value: cancellationToken) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineContext +Aspire.Hosting.Pipelines/PipelineContext.summary(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineContext) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineSummary Aspire.Hosting.Pipelines/PipelineStep.dependsOnSteps(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep) -> Aspire.Hosting/List Aspire.Hosting.Pipelines/PipelineStep.description(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep) -> string Aspire.Hosting.Pipelines/PipelineStep.name(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep) -> string Aspire.Hosting.Pipelines/PipelineStep.requiredBySteps(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep) -> Aspire.Hosting/List +Aspire.Hosting.Pipelines/PipelineStep.resource(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource Aspire.Hosting.Pipelines/PipelineStep.setDependsOnSteps(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep, value: Aspire.Hosting/List) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep Aspire.Hosting.Pipelines/PipelineStep.setDescription(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep, value: string) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep Aspire.Hosting.Pipelines/PipelineStep.setName(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep, value: string) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep Aspire.Hosting.Pipelines/PipelineStep.setRequiredBySteps(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep, value: Aspire.Hosting/List) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep +Aspire.Hosting.Pipelines/PipelineStep.setResource(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep, value: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep Aspire.Hosting.Pipelines/PipelineStep.setTags(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep, value: Aspire.Hosting/List) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep Aspire.Hosting.Pipelines/PipelineStep.tags(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep) -> Aspire.Hosting/List Aspire.Hosting.Pipelines/PipelineStepContext.cancellationToken(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext) -> cancellationToken Aspire.Hosting.Pipelines/PipelineStepContext.executionContext(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext) -> Aspire.Hosting/Aspire.Hosting.DistributedApplicationExecutionContext +Aspire.Hosting.Pipelines/PipelineStepContext.logger(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext) -> Microsoft.Extensions.Logging.Abstractions/Microsoft.Extensions.Logging.ILogger +Aspire.Hosting.Pipelines/PipelineStepContext.model(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.DistributedApplicationModel +Aspire.Hosting.Pipelines/PipelineStepContext.pipelineContext(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineContext +Aspire.Hosting.Pipelines/PipelineStepContext.reportingStep(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext) -> Aspire.Hosting/Aspire.Hosting.Pipelines.IReportingStep +Aspire.Hosting.Pipelines/PipelineStepContext.services(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext) -> System.ComponentModel/System.IServiceProvider +Aspire.Hosting.Pipelines/PipelineStepContext.setPipelineContext(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext, value: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineContext) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext +Aspire.Hosting.Pipelines/PipelineStepContext.setReportingStep(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext, value: Aspire.Hosting/Aspire.Hosting.Pipelines.IReportingStep) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext +Aspire.Hosting.Pipelines/PipelineStepContext.summary(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineSummary +Aspire.Hosting.Pipelines/PipelineStepFactoryContext.pipelineContext(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepFactoryContext) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineContext +Aspire.Hosting.Pipelines/PipelineStepFactoryContext.resource(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepFactoryContext) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource +Aspire.Hosting.Pipelines/PipelineStepFactoryContext.setPipelineContext(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepFactoryContext, value: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineContext) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepFactoryContext +Aspire.Hosting.Pipelines/PipelineStepFactoryContext.setResource(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepFactoryContext, value: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepFactoryContext +Aspire.Hosting.Pipelines/PipelineSummary.add(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineSummary, key: string, value: string) -> void Aspire.Hosting.Pipelines/requiredBy(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep, stepName: string) -> void Aspire.Hosting.SqlServer/addDatabase(name: string, databaseName?: string) -> Aspire.Hosting.SqlServer/Aspire.Hosting.ApplicationModel.SqlServerDatabaseResource Aspire.Hosting.SqlServer/addSqlServer(name: string, password?: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource, port?: number) -> Aspire.Hosting.SqlServer/Aspire.Hosting.ApplicationModel.SqlServerServerResource @@ -189,16 +265,22 @@ Aspire.Hosting.SqlServer/withHostPort(port: number) -> Aspire.Hosting.SqlServer/ Aspire.Hosting.SqlServer/withPassword(password: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource) -> Aspire.Hosting.SqlServer/Aspire.Hosting.ApplicationModel.SqlServerServerResource Aspire.Hosting/addConnectionString(name: string, environmentVariableName?: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithConnectionString Aspire.Hosting/addConnectionStringBuilder(name: string, connectionStringBuilder: callback) -> Aspire.Hosting/Aspire.Hosting.ConnectionStringResource +Aspire.Hosting/addConnectionStringExpression(name: string, connectionStringExpression: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpression) -> Aspire.Hosting/Aspire.Hosting.ConnectionStringResource Aspire.Hosting/addContainer(name: string, image: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerResource Aspire.Hosting/addContainerRegistry(name: string, endpoint: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource, repository?: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerRegistryResource +Aspire.Hosting/addContainerRegistryFromString(name: string, endpoint: string, repository?: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerRegistryResource Aspire.Hosting/addCSharpApp(name: string, path: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ProjectResource Aspire.Hosting/addCSharpAppWithOptions(name: string, path: string, configure: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.CSharpAppResource Aspire.Hosting/addDockerfile(name: string, contextPath: string, dockerfilePath?: string, stage?: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerResource Aspire.Hosting/addDotnetTool(name: string, packageId: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.DotnetToolResource Aspire.Hosting/addExecutable(name: string, command: string, workingDirectory: string, args: string[]) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecutableResource Aspire.Hosting/addExternalService(name: string, url: string) -> Aspire.Hosting/Aspire.Hosting.ExternalServiceResource +Aspire.Hosting/addExternalServiceParameter(name: string, urlParameter: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource) -> Aspire.Hosting/Aspire.Hosting.ExternalServiceResource +Aspire.Hosting/addExternalServiceUri(name: string, uri: uri) -> Aspire.Hosting/Aspire.Hosting.ExternalServiceResource +Aspire.Hosting/addMarkdown(key: string, markdownString: string) -> void Aspire.Hosting/addParameter(name: string, secret?: boolean) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource Aspire.Hosting/addParameterFromConfiguration(name: string, configurationKey: string, secret?: boolean) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource +Aspire.Hosting/addParameterWithValue(name: string, value: string, publishValueAsDefault?: boolean, secret?: boolean) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource Aspire.Hosting/addProject(name: string, projectPath: string, launchProfileName: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ProjectResource Aspire.Hosting/addProjectWithOptions(name: string, projectPath: string, configure: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ProjectResource Aspire.Hosting/asHttp2Service() -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEndpoints @@ -206,8 +288,15 @@ Aspire.Hosting/build(context: Aspire.Hosting/Aspire.Hosting.IDistributedApplicat Aspire.Hosting/clearContainerFilesSources() -> Aspire.Hosting/Aspire.Hosting.IResourceWithContainerFiles Aspire.Hosting/completeLog(resource: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource) -> void Aspire.Hosting/completeLogByName(resourceName: string) -> void +Aspire.Hosting/completeStep(completionText: string, completionState?: string, cancellationToken?: cancellationToken) -> void +Aspire.Hosting/completeStepMarkdown(markdownString: string, completionState?: string, cancellationToken?: cancellationToken) -> void +Aspire.Hosting/completeTask(completionMessage?: string, completionState?: string, cancellationToken?: cancellationToken) -> void +Aspire.Hosting/completeTaskMarkdown(markdownString: string, completionState?: string, cancellationToken?: cancellationToken) -> void Aspire.Hosting/createBuilder() -> Aspire.Hosting/Aspire.Hosting.IDistributedApplicationBuilder Aspire.Hosting/createBuilderWithOptions() -> Aspire.Hosting/Aspire.Hosting.IDistributedApplicationBuilder +Aspire.Hosting/createLogger(categoryName: string) -> Microsoft.Extensions.Logging.Abstractions/Microsoft.Extensions.Logging.ILogger +Aspire.Hosting/createMarkdownTask(markdownString: string, cancellationToken?: cancellationToken) -> Aspire.Hosting/Aspire.Hosting.Pipelines.IReportingTask +Aspire.Hosting/createTask(statusText: string, cancellationToken?: cancellationToken) -> Aspire.Hosting/Aspire.Hosting.Pipelines.IReportingTask Aspire.Hosting/Dict.clear() -> void Aspire.Hosting/Dict.count() -> number Aspire.Hosting/Dict.get(key: string) -> any @@ -222,20 +311,39 @@ Aspire.Hosting/DistributedApplicationExecutionContext.isPublishMode(context: Asp Aspire.Hosting/DistributedApplicationExecutionContext.isRunMode(context: Aspire.Hosting/Aspire.Hosting.DistributedApplicationExecutionContext) -> boolean Aspire.Hosting/DistributedApplicationExecutionContext.operation(context: Aspire.Hosting/Aspire.Hosting.DistributedApplicationExecutionContext) -> enum:Aspire.Hosting.DistributedApplicationOperation Aspire.Hosting/DistributedApplicationExecutionContext.publisherName(context: Aspire.Hosting/Aspire.Hosting.DistributedApplicationExecutionContext) -> string +Aspire.Hosting/DistributedApplicationExecutionContext.serviceProvider(context: Aspire.Hosting/Aspire.Hosting.DistributedApplicationExecutionContext) -> System.ComponentModel/System.IServiceProvider Aspire.Hosting/DistributedApplicationExecutionContext.setPublisherName(context: Aspire.Hosting/Aspire.Hosting.DistributedApplicationExecutionContext, value: string) -> Aspire.Hosting/Aspire.Hosting.DistributedApplicationExecutionContext Aspire.Hosting/excludeFromManifest() -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource Aspire.Hosting/excludeFromMcp() -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource +Aspire.Hosting/exists(key: string) -> boolean +Aspire.Hosting/findResourceByName(name: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource +Aspire.Hosting/getChildren() -> Microsoft.Extensions.Configuration.Abstractions/Microsoft.Extensions.Configuration.IConfigurationSection[] +Aspire.Hosting/getConfiguration() -> Microsoft.Extensions.Configuration.Abstractions/Microsoft.Extensions.Configuration.IConfiguration Aspire.Hosting/getConfigValue(key: string) -> string Aspire.Hosting/getConnectionString(name: string) -> string +Aspire.Hosting/getDistributedApplicationModel() -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.DistributedApplicationModel Aspire.Hosting/getEndpoint(name: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference -Aspire.Hosting/getEnvironmentName() -> string -Aspire.Hosting/getRequiredService(typeId: string) -> any +Aspire.Hosting/getEventing() -> Aspire.Hosting/Aspire.Hosting.Eventing.IDistributedApplicationEventing +Aspire.Hosting/getLoggerFactory() -> Microsoft.Extensions.Logging.Abstractions/Microsoft.Extensions.Logging.ILoggerFactory +Aspire.Hosting/getOrSetSecret(resourceBuilder: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource, name: string, value: string) -> void +Aspire.Hosting/getResourceLoggerService() -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceLoggerService Aspire.Hosting/getResourceName() -> string -Aspire.Hosting/getService(typeId: string) -> any +Aspire.Hosting/getResourceNotificationService() -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceNotificationService +Aspire.Hosting/getResources() -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource[] +Aspire.Hosting/getSection(key: string) -> Microsoft.Extensions.Configuration.Abstractions/Microsoft.Extensions.Configuration.IConfigurationSection +Aspire.Hosting/getUserSecretsManager() -> Aspire.Hosting/Aspire.Hosting.IUserSecretsManager Aspire.Hosting/IDistributedApplicationBuilder.appHostDirectory(context: Aspire.Hosting/Aspire.Hosting.IDistributedApplicationBuilder) -> string +Aspire.Hosting/IDistributedApplicationBuilder.environment(context: Aspire.Hosting/Aspire.Hosting.IDistributedApplicationBuilder) -> Microsoft.Extensions.Hosting.Abstractions/Microsoft.Extensions.Hosting.IHostEnvironment Aspire.Hosting/IDistributedApplicationBuilder.eventing(context: Aspire.Hosting/Aspire.Hosting.IDistributedApplicationBuilder) -> Aspire.Hosting/Aspire.Hosting.Eventing.IDistributedApplicationEventing Aspire.Hosting/IDistributedApplicationBuilder.executionContext(context: Aspire.Hosting/Aspire.Hosting.IDistributedApplicationBuilder) -> Aspire.Hosting/Aspire.Hosting.DistributedApplicationExecutionContext +Aspire.Hosting/IDistributedApplicationBuilder.userSecretsManager(context: Aspire.Hosting/Aspire.Hosting.IDistributedApplicationBuilder) -> Aspire.Hosting/Aspire.Hosting.IUserSecretsManager Aspire.Hosting/isDevelopment() -> boolean +Aspire.Hosting/isEnvironment(environmentName: string) -> boolean +Aspire.Hosting/isProduction() -> boolean +Aspire.Hosting/isStaging() -> boolean +Aspire.Hosting/IUserSecretsManager.filePath(context: Aspire.Hosting/Aspire.Hosting.IUserSecretsManager) -> string +Aspire.Hosting/IUserSecretsManager.isAvailable(context: Aspire.Hosting/Aspire.Hosting.IUserSecretsManager) -> boolean +Aspire.Hosting/IUserSecretsManager.trySetSecret(context: Aspire.Hosting/Aspire.Hosting.IUserSecretsManager, name: string, value: string) -> boolean Aspire.Hosting/List.add(item: any) -> void Aspire.Hosting/List.clear() -> void Aspire.Hosting/List.get(index: number) -> any @@ -249,7 +357,15 @@ Aspire.Hosting/log(level: string, message: string) -> void Aspire.Hosting/logDebug(message: string) -> void Aspire.Hosting/logError(message: string) -> void Aspire.Hosting/logInformation(message: string) -> void +Aspire.Hosting/logStep(level: string, message: string) -> void +Aspire.Hosting/logStepMarkdown(level: string, markdownString: string) -> void Aspire.Hosting/logWarning(message: string) -> void +Aspire.Hosting/onBeforeResourceStarted(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource +Aspire.Hosting/onConnectionStringAvailable(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithConnectionString +Aspire.Hosting/onInitializeResource(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource +Aspire.Hosting/onResourceEndpointsAllocated(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEndpoints +Aspire.Hosting/onResourceReady(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource +Aspire.Hosting/onResourceStopped(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource Aspire.Hosting/ProjectResourceOptions.excludeKestrelEndpoints(context: Aspire.Hosting/Aspire.Hosting.ProjectResourceOptions) -> boolean Aspire.Hosting/ProjectResourceOptions.excludeLaunchProfile(context: Aspire.Hosting/Aspire.Hosting.ProjectResourceOptions) -> boolean Aspire.Hosting/ProjectResourceOptions.launchProfileName(context: Aspire.Hosting/Aspire.Hosting.ProjectResourceOptions) -> string @@ -264,7 +380,12 @@ Aspire.Hosting/publishProjectAsDockerFileWithConfigure(configure?: callback) -> Aspire.Hosting/publishResourceUpdate(resource: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource, state?: string, stateStyle?: string) -> void Aspire.Hosting/publishWithContainerFiles(source: Aspire.Hosting/Aspire.Hosting.IResourceWithContainerFiles, destinationPath: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IContainerFilesDestinationResource Aspire.Hosting/run(context: Aspire.Hosting/Aspire.Hosting.DistributedApplication, cancellationToken?: cancellationToken) -> void +Aspire.Hosting/saveStateJson(json: string, cancellationToken?: cancellationToken) -> void +Aspire.Hosting/subscribeAfterResourcesCreated(callback: callback) -> Aspire.Hosting/Aspire.Hosting.Eventing.DistributedApplicationEventSubscription +Aspire.Hosting/subscribeBeforeStart(callback: callback) -> Aspire.Hosting/Aspire.Hosting.Eventing.DistributedApplicationEventSubscription Aspire.Hosting/tryGetResourceState(resourceName: string) -> Aspire.Hosting/Aspire.Hosting.Ats.ResourceEventDto +Aspire.Hosting/updateTask(statusText: string, cancellationToken?: cancellationToken) -> void +Aspire.Hosting/updateTaskMarkdown(markdownString: string, cancellationToken?: cancellationToken) -> void Aspire.Hosting/waitFor(dependency: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithWaitSupport Aspire.Hosting/waitForCompletion(dependency: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource, exitCode?: number) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithWaitSupport Aspire.Hosting/waitForDependencies(resource: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource) -> void @@ -276,7 +397,6 @@ Aspire.Hosting/waitForStartWithBehavior(dependency: Aspire.Hosting/Aspire.Hostin Aspire.Hosting/waitForWithBehavior(dependency: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource, waitBehavior: enum:Aspire.Hosting.ApplicationModel.WaitBehavior) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithWaitSupport Aspire.Hosting/withArgs(args: string[]) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithArgs Aspire.Hosting/withArgsCallback(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithArgs -Aspire.Hosting/withArgsCallbackAsync(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithArgs Aspire.Hosting/withBindMount(source: string, target: string, isReadOnly?: boolean) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerResource Aspire.Hosting/withBuildArg(name: string, value: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerResource Aspire.Hosting/withBuildSecret(name: string, value: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerResource @@ -297,13 +417,8 @@ Aspire.Hosting/withDockerfileBaseImage(buildImage?: string, runtimeImage?: strin Aspire.Hosting/withEndpoint(port?: number, targetPort?: number, scheme?: string, name?: string, env?: string, isProxied?: boolean, isExternal?: boolean, protocol?: enum:System.Net.Sockets.ProtocolType) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEndpoints Aspire.Hosting/withEndpointProxySupport(proxyEnabled: boolean) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerResource Aspire.Hosting/withEntrypoint(entrypoint: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerResource -Aspire.Hosting/withEnvironment(name: string, value: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment +Aspire.Hosting/withEnvironment(name: string, value: string|Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpression|Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference|Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource|Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithConnectionString|Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment Aspire.Hosting/withEnvironmentCallback(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment -Aspire.Hosting/withEnvironmentCallbackAsync(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment -Aspire.Hosting/withEnvironmentConnectionString(envVarName: string, resource: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithConnectionString) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment -Aspire.Hosting/withEnvironmentEndpoint(name: string, endpointReference: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment -Aspire.Hosting/withEnvironmentExpression(name: string, value: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpression) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment -Aspire.Hosting/withEnvironmentParameter(name: string, parameter: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment Aspire.Hosting/withExecutableCommand(command: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecutableResource Aspire.Hosting/withExplicitStart() -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource Aspire.Hosting/withExternalHttpEndpoints() -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEndpoints @@ -327,7 +442,6 @@ Aspire.Hosting/withOtlpExporterProtocol(protocol: enum:Aspire.Hosting.OtlpProtoc Aspire.Hosting/withoutHttpsCertificate() -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment Aspire.Hosting/withParentRelationship(parent: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource Aspire.Hosting/withPipelineConfiguration(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource -Aspire.Hosting/withPipelineConfigurationAsync(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource Aspire.Hosting/withPipelineStepFactory(stepName: string, callback: callback, dependsOn?: string[], requiredBy?: string[], tags?: string[], description?: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource Aspire.Hosting/withReference(source: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource, connectionName?: string, optional?: boolean, name?: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment Aspire.Hosting/withReferenceEndpoint(endpointReference: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment @@ -348,6 +462,5 @@ Aspire.Hosting/withUrlExpression(url: Aspire.Hosting/Aspire.Hosting.ApplicationM Aspire.Hosting/withUrlForEndpoint(endpointName: string, callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource Aspire.Hosting/withUrlForEndpointFactory(endpointName: string, callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEndpoints Aspire.Hosting/withUrlsCallback(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource -Aspire.Hosting/withUrlsCallbackAsync(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource Aspire.Hosting/withVolume(target: string, name?: string, isReadOnly?: boolean) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerResource Aspire.Hosting/withWorkingDirectory(workingDirectory: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecutableResource diff --git a/src/Aspire.Hosting/ApplicationModel/IManifestExpressionProvider.cs b/src/Aspire.Hosting/ApplicationModel/IManifestExpressionProvider.cs index 08905ea768a..e073471d3a8 100644 --- a/src/Aspire.Hosting/ApplicationModel/IManifestExpressionProvider.cs +++ b/src/Aspire.Hosting/ApplicationModel/IManifestExpressionProvider.cs @@ -6,6 +6,7 @@ namespace Aspire.Hosting.ApplicationModel; /// /// An interface that allows an object to express how it should be represented in a manifest. /// +[AspireExport] public interface IManifestExpressionProvider { /// diff --git a/src/Aspire.Hosting/ApplicationModel/IValueProvider.cs b/src/Aspire.Hosting/ApplicationModel/IValueProvider.cs index afc80841c28..232e4bc6bbe 100644 --- a/src/Aspire.Hosting/ApplicationModel/IValueProvider.cs +++ b/src/Aspire.Hosting/ApplicationModel/IValueProvider.cs @@ -27,6 +27,7 @@ public class ValueProviderContext /// /// An interface that allows the value to be provided for an environment variable. /// +[AspireExport] public interface IValueProvider { /// diff --git a/src/Aspire.Hosting/ResourceBuilderExtensions.cs b/src/Aspire.Hosting/ResourceBuilderExtensions.cs index 3b5f0410a4a..9348a331627 100644 --- a/src/Aspire.Hosting/ResourceBuilderExtensions.cs +++ b/src/Aspire.Hosting/ResourceBuilderExtensions.cs @@ -32,7 +32,7 @@ public static class ResourceBuilderExtensions /// The name of the environment variable. /// The value of the environment variable. /// The . - [AspireExport("withEnvironment", Description = "Sets an environment variable")] + [AspireExportIgnore(Reason = "Polyglot app hosts use the internal withEnvironment dispatcher export.")] public static IResourceBuilder WithEnvironment(this IResourceBuilder builder, string name, string? value) where T : IResourceWithEnvironment { ArgumentNullException.ThrowIfNull(builder); @@ -41,6 +41,35 @@ public static IResourceBuilder WithEnvironment(this IResourceBuilder bu return builder.WithAnnotation(new EnvironmentAnnotation(name, value ?? string.Empty)); } + [AspireExport("withEnvironment", Description = "Sets an environment variable")] + internal static IResourceBuilder WithEnvironment( + this IResourceBuilder builder, + string name, + [AspireUnion( + typeof(string), + typeof(ReferenceExpression), + typeof(EndpointReference), + typeof(IResourceBuilder), + typeof(IResourceBuilder), + typeof(IValueProvider))] + object value) + where T : IResourceWithEnvironment + { + ArgumentNullException.ThrowIfNull(builder); + ArgumentNullException.ThrowIfNull(name); + ArgumentNullException.ThrowIfNull(value); + + return value switch + { + string stringValue => builder.WithEnvironment(name, stringValue), + IResourceBuilder parameter => builder.WithEnvironment(name, parameter), + IResourceBuilder connectionStringResource => builder.WithEnvironment(name, connectionStringResource), + IValueProvider valueProvider when value is IManifestExpressionProvider manifestExpressionProvider => builder.WithEnvironmentValue(name, manifestExpressionProvider, valueProvider), + _ => throw new InvalidOperationException( + $"The value '{value.GetType().FullName}' can't be used with withEnvironment because it doesn't provide a supported environment value.") + }; + } + /// /// Adds an environment variable to the resource. /// @@ -81,7 +110,7 @@ public static IResourceBuilder WithEnvironment(this IResourceBuilder bu /// const redis = await builder.addRedis("cache"); /// const endpoint = await redis.getEndpoint("tcp"); /// const expr = refExpr`redis://${endpoint}:6379`; - /// await api.withEnvironmentExpression("REDIS_URL", expr); + /// await api.withEnvironment("REDIS_URL", expr); /// /// /// @@ -90,7 +119,7 @@ public static IResourceBuilder WithEnvironment(this IResourceBuilder bu /// The name of the environment variable. /// A ReferenceExpression that will be evaluated at runtime. /// The . - [AspireExport("withEnvironmentExpression", Description = "Adds an environment variable with a reference expression")] + [AspireExportIgnore(Reason = "Polyglot app hosts use the internal withEnvironment dispatcher export.")] public static IResourceBuilder WithEnvironment(this IResourceBuilder builder, string name, ReferenceExpression value) where T : IResourceWithEnvironment { @@ -164,7 +193,7 @@ public static IResourceBuilder WithEnvironment(this IResourceBuilder bu /// The name of the environment variable. /// The endpoint from which to extract the url. /// The . - [AspireExport("withEnvironmentEndpoint", Description = "Sets an environment variable from an endpoint reference")] + [AspireExportIgnore(Reason = "Polyglot app hosts use the internal withEnvironment dispatcher export.")] public static IResourceBuilder WithEnvironment(this IResourceBuilder builder, string name, EndpointReference endpointReference) where T : IResourceWithEnvironment { @@ -231,7 +260,7 @@ public static IResourceBuilder WithEnvironment(this IResourceBuilder bu /// Name of environment variable. /// Resource builder for the parameter resource. /// The . - [AspireExport("withEnvironmentParameter", Description = "Sets an environment variable from a parameter resource")] + [AspireExportIgnore(Reason = "Polyglot app hosts use the internal withEnvironment dispatcher export.")] public static IResourceBuilder WithEnvironment(this IResourceBuilder builder, string name, IResourceBuilder parameter) where T : IResourceWithEnvironment { ArgumentNullException.ThrowIfNull(builder); @@ -254,7 +283,7 @@ public static IResourceBuilder WithEnvironment(this IResourceBuilder bu /// The name of the environment variable under which the connection string will be set. /// The resource builder of the referenced service from which to pull the connection string. /// The . - [AspireExport("withEnvironmentConnectionString", Description = "Sets an environment variable from a connection string resource")] + [AspireExportIgnore(Reason = "Polyglot app hosts use the internal withEnvironment dispatcher export.")] public static IResourceBuilder WithEnvironment( this IResourceBuilder builder, string envVarName, @@ -273,6 +302,29 @@ public static IResourceBuilder WithEnvironment( }); } + private static IResourceBuilder WithEnvironmentValue( + this IResourceBuilder builder, + string name, + IManifestExpressionProvider manifestExpressionProvider, + IValueProvider valueProvider) + where T : IResourceWithEnvironment + { + ArgumentNullException.ThrowIfNull(builder); + ArgumentNullException.ThrowIfNull(name); + ArgumentNullException.ThrowIfNull(manifestExpressionProvider); + ArgumentNullException.ThrowIfNull(valueProvider); + + if (valueProvider is IValueWithReferences valueWithReferences) + { + WalkAndLinkResourceReferences(builder, valueWithReferences.References); + } + + return builder.WithEnvironment(context => + { + context.EnvironmentVariables[name] = valueProvider; + }); + } + /// /// Adds an environment variable to the resource with a value that implements both and . /// diff --git a/src/Aspire.Hosting/api/Aspire.Hosting.Capabilities.txt b/src/Aspire.Hosting/api/Aspire.Hosting.Capabilities.txt index b29e6b7e0d9..e3bf3d2bb9d 100644 --- a/src/Aspire.Hosting/api/Aspire.Hosting.Capabilities.txt +++ b/src/Aspire.Hosting/api/Aspire.Hosting.Capabilities.txt @@ -1,24 +1,24 @@ # Aspire Type System Capabilities # Generated by: aspire sdk dump --format ci -# Diagnostics -warning: Method 'addConnectionString' has collisions (Aspire.Hosting/addConnectionString, Aspire.Hosting/addConnectionStringExpression). 'Aspire.Hosting/addConnectionStringExpression' was removed. Use [AspireExport(MethodName = "uniqueName")] to set an explicit name. [Aspire.Hosting/addConnectionStringExpression] -warning: Method 'addContainerRegistry' has collisions (Aspire.Hosting/addContainerRegistry, Aspire.Hosting/addContainerRegistryFromString). 'Aspire.Hosting/addContainerRegistryFromString' was removed. Use [AspireExport(MethodName = "uniqueName")] to set an explicit name. [Aspire.Hosting/addContainerRegistryFromString] -warning: Method 'addExternalService' has collisions (Aspire.Hosting/addExternalService, Aspire.Hosting/addExternalServiceParameter, Aspire.Hosting/addExternalServiceUri). 'Aspire.Hosting/addExternalServiceParameter' was removed. Use [AspireExport(MethodName = "uniqueName")] to set an explicit name. [Aspire.Hosting/addExternalServiceParameter] -warning: Method 'addExternalService' has collisions (Aspire.Hosting/addExternalService, Aspire.Hosting/addExternalServiceParameter, Aspire.Hosting/addExternalServiceUri). 'Aspire.Hosting/addExternalServiceUri' was removed. Use [AspireExport(MethodName = "uniqueName")] to set an explicit name. [Aspire.Hosting/addExternalServiceUri] -warning: Method 'addParameter' has collisions (Aspire.Hosting/addParameter, Aspire.Hosting/addParameterWithValue). 'Aspire.Hosting/addParameterWithValue' was removed. Use [AspireExport(MethodName = "uniqueName")] to set an explicit name. [Aspire.Hosting/addParameterWithValue] - # Handle Types +Aspire.Hosting/Aspire.Hosting.ApplicationModel.AfterResourcesCreatedEvent [ExposeProperties] +Aspire.Hosting/Aspire.Hosting.ApplicationModel.BeforeResourceStartedEvent [ExposeProperties] +Aspire.Hosting/Aspire.Hosting.ApplicationModel.BeforeStartEvent [ExposeProperties] Aspire.Hosting/Aspire.Hosting.ApplicationModel.CommandLineArgsCallbackContext [ExposeProperties] +Aspire.Hosting/Aspire.Hosting.ApplicationModel.ConnectionStringAvailableEvent [ExposeProperties] Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerRegistryResource Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerResource Aspire.Hosting/Aspire.Hosting.ApplicationModel.CSharpAppResource +Aspire.Hosting/Aspire.Hosting.ApplicationModel.DistributedApplicationModel Aspire.Hosting/Aspire.Hosting.ApplicationModel.DotnetToolResource Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReferenceExpression [ExposeProperties] Aspire.Hosting/Aspire.Hosting.ApplicationModel.EnvironmentCallbackContext [ExposeProperties] Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecutableResource Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext [ExposeProperties] +Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider [interface] +Aspire.Hosting/Aspire.Hosting.ApplicationModel.InitializeResourceEvent [ExposeProperties] Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource [interface] Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithArgs [interface] Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithConnectionString [interface] @@ -26,12 +26,16 @@ Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEndpoints [interface Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment [interface] Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithParent [interface] Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithWaitSupport [interface] +Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider [interface] Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource Aspire.Hosting/Aspire.Hosting.ApplicationModel.ProjectResource Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpression Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpressionBuilder [ExposeProperties] +Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceEndpointsAllocatedEvent [ExposeProperties] Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceLoggerService Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceNotificationService +Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceReadyEvent [ExposeProperties] +Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceStoppedEvent [ExposeProperties] Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceUrlsCallbackContext [ExposeProperties] Aspire.Hosting/Aspire.Hosting.ApplicationModel.UpdateCommandStateContext [ExposeProperties] Aspire.Hosting/Aspire.Hosting.ConnectionStringResource @@ -46,12 +50,21 @@ Aspire.Hosting/Aspire.Hosting.Eventing.IDistributedApplicationResourceEvent [int Aspire.Hosting/Aspire.Hosting.ExternalServiceResource Aspire.Hosting/Aspire.Hosting.IDistributedApplicationBuilder [interface] Aspire.Hosting/Aspire.Hosting.IResourceWithContainerFiles [interface] +Aspire.Hosting/Aspire.Hosting.IUserSecretsManager [interface, ExposeProperties, ExposeMethods] +Aspire.Hosting/Aspire.Hosting.Pipelines.IReportingStep [interface] +Aspire.Hosting/Aspire.Hosting.Pipelines.IReportingTask [interface] Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineConfigurationContext [ExposeProperties] +Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineContext [ExposeProperties] Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep [ExposeProperties] Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext [ExposeProperties] +Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepFactoryContext [ExposeProperties] +Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineSummary [ExposeMethods] Aspire.Hosting/Aspire.Hosting.ProjectResourceOptions [ExposeProperties] Microsoft.Extensions.Configuration.Abstractions/Microsoft.Extensions.Configuration.IConfiguration [interface] -Microsoft.Extensions.Hosting.Abstractions/Microsoft.Extensions.Hosting.IHostEnvironment [interface] +Microsoft.Extensions.Configuration.Abstractions/Microsoft.Extensions.Configuration.IConfigurationSection [interface, ExposeProperties] +Microsoft.Extensions.Hosting.Abstractions/Microsoft.Extensions.Hosting.IHostEnvironment [interface, ExposeProperties] +Microsoft.Extensions.Logging.Abstractions/Microsoft.Extensions.Logging.ILogger [interface] +Microsoft.Extensions.Logging.Abstractions/Microsoft.Extensions.Logging.ILoggerFactory [interface] System.ComponentModel/System.IServiceProvider [interface] System.Private.CoreLib/System.Threading.CancellationToken @@ -104,16 +117,28 @@ enum:Aspire.Hosting.OtlpProtocol = Grpc | HttpProtobuf | HttpJson enum:System.Net.Sockets.ProtocolType = IP | IPv6HopByHopOptions | Unspecified | Icmp | Igmp | Ggp | IPv4 | Tcp | Pup | Udp | Idp | IPv6 | IPv6RoutingHeader | IPv6FragmentHeader | IPSecEncapsulatingSecurityPayload | IPSecAuthenticationHeader | IcmpV6 | IPv6NoNextHeader | IPv6DestinationOptions | ND | Raw | Ipx | Spx | SpxII | Unknown # Capabilities +Aspire.Hosting.ApplicationModel/AfterResourcesCreatedEvent.model(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.AfterResourcesCreatedEvent) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.DistributedApplicationModel +Aspire.Hosting.ApplicationModel/AfterResourcesCreatedEvent.services(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.AfterResourcesCreatedEvent) -> System.ComponentModel/System.IServiceProvider Aspire.Hosting.ApplicationModel/appendFormatted(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpressionBuilder, value: string, format?: string) -> void Aspire.Hosting.ApplicationModel/appendLiteral(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpressionBuilder, value: string) -> void Aspire.Hosting.ApplicationModel/appendValueProvider(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpressionBuilder, valueProvider: any, format?: string) -> void +Aspire.Hosting.ApplicationModel/BeforeResourceStartedEvent.resource(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.BeforeResourceStartedEvent) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource +Aspire.Hosting.ApplicationModel/BeforeResourceStartedEvent.services(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.BeforeResourceStartedEvent) -> System.ComponentModel/System.IServiceProvider +Aspire.Hosting.ApplicationModel/BeforeStartEvent.model(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.BeforeStartEvent) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.DistributedApplicationModel +Aspire.Hosting.ApplicationModel/BeforeStartEvent.services(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.BeforeStartEvent) -> System.ComponentModel/System.IServiceProvider Aspire.Hosting.ApplicationModel/build(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpressionBuilder) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpression Aspire.Hosting.ApplicationModel/CommandLineArgsCallbackContext.args(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.CommandLineArgsCallbackContext) -> Aspire.Hosting/List Aspire.Hosting.ApplicationModel/CommandLineArgsCallbackContext.cancellationToken(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.CommandLineArgsCallbackContext) -> cancellationToken Aspire.Hosting.ApplicationModel/CommandLineArgsCallbackContext.executionContext(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.CommandLineArgsCallbackContext) -> Aspire.Hosting/Aspire.Hosting.DistributedApplicationExecutionContext +Aspire.Hosting.ApplicationModel/CommandLineArgsCallbackContext.logger(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.CommandLineArgsCallbackContext) -> Microsoft.Extensions.Logging.Abstractions/Microsoft.Extensions.Logging.ILogger +Aspire.Hosting.ApplicationModel/CommandLineArgsCallbackContext.resource(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.CommandLineArgsCallbackContext) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource Aspire.Hosting.ApplicationModel/CommandLineArgsCallbackContext.setExecutionContext(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.CommandLineArgsCallbackContext, value: Aspire.Hosting/Aspire.Hosting.DistributedApplicationExecutionContext) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.CommandLineArgsCallbackContext +Aspire.Hosting.ApplicationModel/CommandLineArgsCallbackContext.setLogger(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.CommandLineArgsCallbackContext, value: Microsoft.Extensions.Logging.Abstractions/Microsoft.Extensions.Logging.ILogger) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.CommandLineArgsCallbackContext +Aspire.Hosting.ApplicationModel/ConnectionStringAvailableEvent.resource(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ConnectionStringAvailableEvent) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource +Aspire.Hosting.ApplicationModel/ConnectionStringAvailableEvent.services(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ConnectionStringAvailableEvent) -> System.ComponentModel/System.IServiceProvider Aspire.Hosting.ApplicationModel/EndpointReference.endpointName(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference) -> string Aspire.Hosting.ApplicationModel/EndpointReference.errorMessage(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference) -> string +Aspire.Hosting.ApplicationModel/EndpointReference.excludeReferenceEndpoint(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference) -> boolean Aspire.Hosting.ApplicationModel/EndpointReference.exists(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference) -> boolean Aspire.Hosting.ApplicationModel/EndpointReference.getTlsValue(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference, enabledValue: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpression, disabledValue: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpression) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpression Aspire.Hosting.ApplicationModel/EndpointReference.host(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference) -> string @@ -121,6 +146,7 @@ Aspire.Hosting.ApplicationModel/EndpointReference.isAllocated(context: Aspire.Ho Aspire.Hosting.ApplicationModel/EndpointReference.isHttp(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference) -> boolean Aspire.Hosting.ApplicationModel/EndpointReference.isHttps(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference) -> boolean Aspire.Hosting.ApplicationModel/EndpointReference.port(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference) -> number +Aspire.Hosting.ApplicationModel/EndpointReference.resource(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEndpoints Aspire.Hosting.ApplicationModel/EndpointReference.scheme(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference) -> string Aspire.Hosting.ApplicationModel/EndpointReference.setErrorMessage(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference, value: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference Aspire.Hosting.ApplicationModel/EndpointReference.targetPort(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference) -> number @@ -132,45 +158,99 @@ Aspire.Hosting.ApplicationModel/EndpointReferenceExpression.valueExpression(cont Aspire.Hosting.ApplicationModel/EnvironmentCallbackContext.cancellationToken(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EnvironmentCallbackContext) -> cancellationToken Aspire.Hosting.ApplicationModel/EnvironmentCallbackContext.environmentVariables(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EnvironmentCallbackContext) -> Aspire.Hosting/Dict Aspire.Hosting.ApplicationModel/EnvironmentCallbackContext.executionContext(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EnvironmentCallbackContext) -> Aspire.Hosting/Aspire.Hosting.DistributedApplicationExecutionContext +Aspire.Hosting.ApplicationModel/EnvironmentCallbackContext.logger(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EnvironmentCallbackContext) -> Microsoft.Extensions.Logging.Abstractions/Microsoft.Extensions.Logging.ILogger +Aspire.Hosting.ApplicationModel/EnvironmentCallbackContext.resource(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EnvironmentCallbackContext) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource +Aspire.Hosting.ApplicationModel/EnvironmentCallbackContext.setLogger(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EnvironmentCallbackContext, value: Microsoft.Extensions.Logging.Abstractions/Microsoft.Extensions.Logging.ILogger) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.EnvironmentCallbackContext Aspire.Hosting.ApplicationModel/ExecuteCommandContext.cancellationToken(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext) -> cancellationToken Aspire.Hosting.ApplicationModel/ExecuteCommandContext.resourceName(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext) -> string +Aspire.Hosting.ApplicationModel/ExecuteCommandContext.serviceProvider(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext) -> System.ComponentModel/System.IServiceProvider Aspire.Hosting.ApplicationModel/ExecuteCommandContext.setCancellationToken(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext, value: cancellationToken) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext Aspire.Hosting.ApplicationModel/ExecuteCommandContext.setResourceName(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext, value: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext +Aspire.Hosting.ApplicationModel/ExecuteCommandContext.setServiceProvider(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext, value: System.ComponentModel/System.IServiceProvider) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext +Aspire.Hosting.ApplicationModel/getValue(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpression, cancellationToken: cancellationToken) -> string Aspire.Hosting.ApplicationModel/getValueAsync(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference, cancellationToken?: cancellationToken) -> string +Aspire.Hosting.ApplicationModel/InitializeResourceEvent.eventing(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.InitializeResourceEvent) -> Aspire.Hosting/Aspire.Hosting.Eventing.IDistributedApplicationEventing +Aspire.Hosting.ApplicationModel/InitializeResourceEvent.logger(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.InitializeResourceEvent) -> Microsoft.Extensions.Logging.Abstractions/Microsoft.Extensions.Logging.ILogger +Aspire.Hosting.ApplicationModel/InitializeResourceEvent.notifications(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.InitializeResourceEvent) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceNotificationService +Aspire.Hosting.ApplicationModel/InitializeResourceEvent.resource(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.InitializeResourceEvent) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource +Aspire.Hosting.ApplicationModel/InitializeResourceEvent.services(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.InitializeResourceEvent) -> System.ComponentModel/System.IServiceProvider Aspire.Hosting.ApplicationModel/ReferenceExpressionBuilder.isEmpty(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpressionBuilder) -> boolean +Aspire.Hosting.ApplicationModel/ResourceEndpointsAllocatedEvent.resource(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceEndpointsAllocatedEvent) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource +Aspire.Hosting.ApplicationModel/ResourceEndpointsAllocatedEvent.services(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceEndpointsAllocatedEvent) -> System.ComponentModel/System.IServiceProvider +Aspire.Hosting.ApplicationModel/ResourceReadyEvent.resource(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceReadyEvent) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource +Aspire.Hosting.ApplicationModel/ResourceReadyEvent.services(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceReadyEvent) -> System.ComponentModel/System.IServiceProvider +Aspire.Hosting.ApplicationModel/ResourceStoppedEvent.resource(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceStoppedEvent) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource +Aspire.Hosting.ApplicationModel/ResourceStoppedEvent.services(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceStoppedEvent) -> System.ComponentModel/System.IServiceProvider Aspire.Hosting.ApplicationModel/ResourceUrlsCallbackContext.cancellationToken(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceUrlsCallbackContext) -> cancellationToken Aspire.Hosting.ApplicationModel/ResourceUrlsCallbackContext.executionContext(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceUrlsCallbackContext) -> Aspire.Hosting/Aspire.Hosting.DistributedApplicationExecutionContext +Aspire.Hosting.ApplicationModel/ResourceUrlsCallbackContext.logger(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceUrlsCallbackContext) -> Microsoft.Extensions.Logging.Abstractions/Microsoft.Extensions.Logging.ILogger +Aspire.Hosting.ApplicationModel/ResourceUrlsCallbackContext.resource(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceUrlsCallbackContext) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource +Aspire.Hosting.ApplicationModel/ResourceUrlsCallbackContext.setLogger(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceUrlsCallbackContext, value: Microsoft.Extensions.Logging.Abstractions/Microsoft.Extensions.Logging.ILogger) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceUrlsCallbackContext Aspire.Hosting.ApplicationModel/ResourceUrlsCallbackContext.urls(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceUrlsCallbackContext) -> Aspire.Hosting/List +Aspire.Hosting.ApplicationModel/UpdateCommandStateContext.serviceProvider(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.UpdateCommandStateContext) -> System.ComponentModel/System.IServiceProvider +Aspire.Hosting.ApplicationModel/UpdateCommandStateContext.setServiceProvider(context: Aspire.Hosting/Aspire.Hosting.ApplicationModel.UpdateCommandStateContext, value: System.ComponentModel/System.IServiceProvider) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.UpdateCommandStateContext Aspire.Hosting.Eventing/IDistributedApplicationEventing.unsubscribe(context: Aspire.Hosting/Aspire.Hosting.Eventing.IDistributedApplicationEventing, subscription: Aspire.Hosting/Aspire.Hosting.Eventing.DistributedApplicationEventSubscription) -> void Aspire.Hosting.Pipelines/dependsOn(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep, stepName: string) -> void Aspire.Hosting.Pipelines/getStepsByTag(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineConfigurationContext, tag: string) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep[] +Aspire.Hosting.Pipelines/PipelineConfigurationContext.model(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineConfigurationContext) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.DistributedApplicationModel +Aspire.Hosting.Pipelines/PipelineConfigurationContext.services(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineConfigurationContext) -> System.ComponentModel/System.IServiceProvider +Aspire.Hosting.Pipelines/PipelineConfigurationContext.setModel(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineConfigurationContext, value: Aspire.Hosting/Aspire.Hosting.ApplicationModel.DistributedApplicationModel) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineConfigurationContext +Aspire.Hosting.Pipelines/PipelineConfigurationContext.setServices(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineConfigurationContext, value: System.ComponentModel/System.IServiceProvider) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineConfigurationContext Aspire.Hosting.Pipelines/PipelineConfigurationContext.setSteps(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineConfigurationContext, value: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep[]) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineConfigurationContext Aspire.Hosting.Pipelines/PipelineConfigurationContext.steps(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineConfigurationContext) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep[] +Aspire.Hosting.Pipelines/PipelineContext.cancellationToken(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineContext) -> cancellationToken +Aspire.Hosting.Pipelines/PipelineContext.executionContext(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineContext) -> Aspire.Hosting/Aspire.Hosting.DistributedApplicationExecutionContext +Aspire.Hosting.Pipelines/PipelineContext.logger(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineContext) -> Microsoft.Extensions.Logging.Abstractions/Microsoft.Extensions.Logging.ILogger +Aspire.Hosting.Pipelines/PipelineContext.model(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineContext) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.DistributedApplicationModel +Aspire.Hosting.Pipelines/PipelineContext.services(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineContext) -> System.ComponentModel/System.IServiceProvider +Aspire.Hosting.Pipelines/PipelineContext.setCancellationToken(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineContext, value: cancellationToken) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineContext +Aspire.Hosting.Pipelines/PipelineContext.summary(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineContext) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineSummary Aspire.Hosting.Pipelines/PipelineStep.dependsOnSteps(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep) -> Aspire.Hosting/List Aspire.Hosting.Pipelines/PipelineStep.description(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep) -> string Aspire.Hosting.Pipelines/PipelineStep.name(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep) -> string Aspire.Hosting.Pipelines/PipelineStep.requiredBySteps(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep) -> Aspire.Hosting/List +Aspire.Hosting.Pipelines/PipelineStep.resource(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource Aspire.Hosting.Pipelines/PipelineStep.setDependsOnSteps(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep, value: Aspire.Hosting/List) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep Aspire.Hosting.Pipelines/PipelineStep.setDescription(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep, value: string) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep Aspire.Hosting.Pipelines/PipelineStep.setName(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep, value: string) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep Aspire.Hosting.Pipelines/PipelineStep.setRequiredBySteps(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep, value: Aspire.Hosting/List) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep +Aspire.Hosting.Pipelines/PipelineStep.setResource(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep, value: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep Aspire.Hosting.Pipelines/PipelineStep.setTags(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep, value: Aspire.Hosting/List) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep Aspire.Hosting.Pipelines/PipelineStep.tags(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep) -> Aspire.Hosting/List Aspire.Hosting.Pipelines/PipelineStepContext.cancellationToken(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext) -> cancellationToken Aspire.Hosting.Pipelines/PipelineStepContext.executionContext(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext) -> Aspire.Hosting/Aspire.Hosting.DistributedApplicationExecutionContext +Aspire.Hosting.Pipelines/PipelineStepContext.logger(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext) -> Microsoft.Extensions.Logging.Abstractions/Microsoft.Extensions.Logging.ILogger +Aspire.Hosting.Pipelines/PipelineStepContext.model(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.DistributedApplicationModel +Aspire.Hosting.Pipelines/PipelineStepContext.pipelineContext(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineContext +Aspire.Hosting.Pipelines/PipelineStepContext.reportingStep(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext) -> Aspire.Hosting/Aspire.Hosting.Pipelines.IReportingStep +Aspire.Hosting.Pipelines/PipelineStepContext.services(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext) -> System.ComponentModel/System.IServiceProvider +Aspire.Hosting.Pipelines/PipelineStepContext.setPipelineContext(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext, value: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineContext) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext +Aspire.Hosting.Pipelines/PipelineStepContext.setReportingStep(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext, value: Aspire.Hosting/Aspire.Hosting.Pipelines.IReportingStep) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext +Aspire.Hosting.Pipelines/PipelineStepContext.summary(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepContext) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineSummary +Aspire.Hosting.Pipelines/PipelineStepFactoryContext.pipelineContext(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepFactoryContext) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineContext +Aspire.Hosting.Pipelines/PipelineStepFactoryContext.resource(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepFactoryContext) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource +Aspire.Hosting.Pipelines/PipelineStepFactoryContext.setPipelineContext(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepFactoryContext, value: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineContext) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepFactoryContext +Aspire.Hosting.Pipelines/PipelineStepFactoryContext.setResource(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepFactoryContext, value: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource) -> Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStepFactoryContext +Aspire.Hosting.Pipelines/PipelineSummary.add(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineSummary, key: string, value: string) -> void Aspire.Hosting.Pipelines/requiredBy(context: Aspire.Hosting/Aspire.Hosting.Pipelines.PipelineStep, stepName: string) -> void Aspire.Hosting/addConnectionString(name: string, environmentVariableName?: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithConnectionString Aspire.Hosting/addConnectionStringBuilder(name: string, connectionStringBuilder: callback) -> Aspire.Hosting/Aspire.Hosting.ConnectionStringResource +Aspire.Hosting/addConnectionStringExpression(name: string, connectionStringExpression: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpression) -> Aspire.Hosting/Aspire.Hosting.ConnectionStringResource Aspire.Hosting/addContainer(name: string, image: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerResource Aspire.Hosting/addContainerRegistry(name: string, endpoint: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource, repository?: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerRegistryResource +Aspire.Hosting/addContainerRegistryFromString(name: string, endpoint: string, repository?: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerRegistryResource Aspire.Hosting/addCSharpApp(name: string, path: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ProjectResource Aspire.Hosting/addCSharpAppWithOptions(name: string, path: string, configure: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.CSharpAppResource Aspire.Hosting/addDockerfile(name: string, contextPath: string, dockerfilePath?: string, stage?: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerResource Aspire.Hosting/addDotnetTool(name: string, packageId: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.DotnetToolResource Aspire.Hosting/addExecutable(name: string, command: string, workingDirectory: string, args: string[]) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecutableResource Aspire.Hosting/addExternalService(name: string, url: string) -> Aspire.Hosting/Aspire.Hosting.ExternalServiceResource +Aspire.Hosting/addExternalServiceParameter(name: string, urlParameter: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource) -> Aspire.Hosting/Aspire.Hosting.ExternalServiceResource +Aspire.Hosting/addExternalServiceUri(name: string, uri: uri) -> Aspire.Hosting/Aspire.Hosting.ExternalServiceResource +Aspire.Hosting/addMarkdown(key: string, markdownString: string) -> void Aspire.Hosting/addParameter(name: string, secret?: boolean) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource Aspire.Hosting/addParameterFromConfiguration(name: string, configurationKey: string, secret?: boolean) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource +Aspire.Hosting/addParameterWithValue(name: string, value: string, publishValueAsDefault?: boolean, secret?: boolean) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource Aspire.Hosting/addProject(name: string, projectPath: string, launchProfileName: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ProjectResource Aspire.Hosting/addProjectWithOptions(name: string, projectPath: string, configure: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ProjectResource Aspire.Hosting/asHttp2Service() -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEndpoints @@ -178,8 +258,15 @@ Aspire.Hosting/build(context: Aspire.Hosting/Aspire.Hosting.IDistributedApplicat Aspire.Hosting/clearContainerFilesSources() -> Aspire.Hosting/Aspire.Hosting.IResourceWithContainerFiles Aspire.Hosting/completeLog(resource: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource) -> void Aspire.Hosting/completeLogByName(resourceName: string) -> void +Aspire.Hosting/completeStep(completionText: string, completionState?: string, cancellationToken?: cancellationToken) -> void +Aspire.Hosting/completeStepMarkdown(markdownString: string, completionState?: string, cancellationToken?: cancellationToken) -> void +Aspire.Hosting/completeTask(completionMessage?: string, completionState?: string, cancellationToken?: cancellationToken) -> void +Aspire.Hosting/completeTaskMarkdown(markdownString: string, completionState?: string, cancellationToken?: cancellationToken) -> void Aspire.Hosting/createBuilder() -> Aspire.Hosting/Aspire.Hosting.IDistributedApplicationBuilder Aspire.Hosting/createBuilderWithOptions() -> Aspire.Hosting/Aspire.Hosting.IDistributedApplicationBuilder +Aspire.Hosting/createLogger(categoryName: string) -> Microsoft.Extensions.Logging.Abstractions/Microsoft.Extensions.Logging.ILogger +Aspire.Hosting/createMarkdownTask(markdownString: string, cancellationToken?: cancellationToken) -> Aspire.Hosting/Aspire.Hosting.Pipelines.IReportingTask +Aspire.Hosting/createTask(statusText: string, cancellationToken?: cancellationToken) -> Aspire.Hosting/Aspire.Hosting.Pipelines.IReportingTask Aspire.Hosting/Dict.clear() -> void Aspire.Hosting/Dict.count() -> number Aspire.Hosting/Dict.get(key: string) -> any @@ -194,20 +281,39 @@ Aspire.Hosting/DistributedApplicationExecutionContext.isPublishMode(context: Asp Aspire.Hosting/DistributedApplicationExecutionContext.isRunMode(context: Aspire.Hosting/Aspire.Hosting.DistributedApplicationExecutionContext) -> boolean Aspire.Hosting/DistributedApplicationExecutionContext.operation(context: Aspire.Hosting/Aspire.Hosting.DistributedApplicationExecutionContext) -> enum:Aspire.Hosting.DistributedApplicationOperation Aspire.Hosting/DistributedApplicationExecutionContext.publisherName(context: Aspire.Hosting/Aspire.Hosting.DistributedApplicationExecutionContext) -> string +Aspire.Hosting/DistributedApplicationExecutionContext.serviceProvider(context: Aspire.Hosting/Aspire.Hosting.DistributedApplicationExecutionContext) -> System.ComponentModel/System.IServiceProvider Aspire.Hosting/DistributedApplicationExecutionContext.setPublisherName(context: Aspire.Hosting/Aspire.Hosting.DistributedApplicationExecutionContext, value: string) -> Aspire.Hosting/Aspire.Hosting.DistributedApplicationExecutionContext Aspire.Hosting/excludeFromManifest() -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource Aspire.Hosting/excludeFromMcp() -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource +Aspire.Hosting/exists(key: string) -> boolean +Aspire.Hosting/findResourceByName(name: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource +Aspire.Hosting/getChildren() -> Microsoft.Extensions.Configuration.Abstractions/Microsoft.Extensions.Configuration.IConfigurationSection[] +Aspire.Hosting/getConfiguration() -> Microsoft.Extensions.Configuration.Abstractions/Microsoft.Extensions.Configuration.IConfiguration Aspire.Hosting/getConfigValue(key: string) -> string Aspire.Hosting/getConnectionString(name: string) -> string +Aspire.Hosting/getDistributedApplicationModel() -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.DistributedApplicationModel Aspire.Hosting/getEndpoint(name: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference -Aspire.Hosting/getEnvironmentName() -> string -Aspire.Hosting/getRequiredService(typeId: string) -> any +Aspire.Hosting/getEventing() -> Aspire.Hosting/Aspire.Hosting.Eventing.IDistributedApplicationEventing +Aspire.Hosting/getLoggerFactory() -> Microsoft.Extensions.Logging.Abstractions/Microsoft.Extensions.Logging.ILoggerFactory +Aspire.Hosting/getOrSetSecret(resourceBuilder: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource, name: string, value: string) -> void +Aspire.Hosting/getResourceLoggerService() -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceLoggerService Aspire.Hosting/getResourceName() -> string -Aspire.Hosting/getService(typeId: string) -> any +Aspire.Hosting/getResourceNotificationService() -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ResourceNotificationService +Aspire.Hosting/getResources() -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource[] +Aspire.Hosting/getSection(key: string) -> Microsoft.Extensions.Configuration.Abstractions/Microsoft.Extensions.Configuration.IConfigurationSection +Aspire.Hosting/getUserSecretsManager() -> Aspire.Hosting/Aspire.Hosting.IUserSecretsManager Aspire.Hosting/IDistributedApplicationBuilder.appHostDirectory(context: Aspire.Hosting/Aspire.Hosting.IDistributedApplicationBuilder) -> string +Aspire.Hosting/IDistributedApplicationBuilder.environment(context: Aspire.Hosting/Aspire.Hosting.IDistributedApplicationBuilder) -> Microsoft.Extensions.Hosting.Abstractions/Microsoft.Extensions.Hosting.IHostEnvironment Aspire.Hosting/IDistributedApplicationBuilder.eventing(context: Aspire.Hosting/Aspire.Hosting.IDistributedApplicationBuilder) -> Aspire.Hosting/Aspire.Hosting.Eventing.IDistributedApplicationEventing Aspire.Hosting/IDistributedApplicationBuilder.executionContext(context: Aspire.Hosting/Aspire.Hosting.IDistributedApplicationBuilder) -> Aspire.Hosting/Aspire.Hosting.DistributedApplicationExecutionContext +Aspire.Hosting/IDistributedApplicationBuilder.userSecretsManager(context: Aspire.Hosting/Aspire.Hosting.IDistributedApplicationBuilder) -> Aspire.Hosting/Aspire.Hosting.IUserSecretsManager Aspire.Hosting/isDevelopment() -> boolean +Aspire.Hosting/isEnvironment(environmentName: string) -> boolean +Aspire.Hosting/isProduction() -> boolean +Aspire.Hosting/isStaging() -> boolean +Aspire.Hosting/IUserSecretsManager.filePath(context: Aspire.Hosting/Aspire.Hosting.IUserSecretsManager) -> string +Aspire.Hosting/IUserSecretsManager.isAvailable(context: Aspire.Hosting/Aspire.Hosting.IUserSecretsManager) -> boolean +Aspire.Hosting/IUserSecretsManager.trySetSecret(context: Aspire.Hosting/Aspire.Hosting.IUserSecretsManager, name: string, value: string) -> boolean Aspire.Hosting/List.add(item: any) -> void Aspire.Hosting/List.clear() -> void Aspire.Hosting/List.get(index: number) -> any @@ -221,7 +327,15 @@ Aspire.Hosting/log(level: string, message: string) -> void Aspire.Hosting/logDebug(message: string) -> void Aspire.Hosting/logError(message: string) -> void Aspire.Hosting/logInformation(message: string) -> void +Aspire.Hosting/logStep(level: string, message: string) -> void +Aspire.Hosting/logStepMarkdown(level: string, markdownString: string) -> void Aspire.Hosting/logWarning(message: string) -> void +Aspire.Hosting/onBeforeResourceStarted(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource +Aspire.Hosting/onConnectionStringAvailable(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithConnectionString +Aspire.Hosting/onInitializeResource(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource +Aspire.Hosting/onResourceEndpointsAllocated(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEndpoints +Aspire.Hosting/onResourceReady(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource +Aspire.Hosting/onResourceStopped(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource Aspire.Hosting/ProjectResourceOptions.excludeKestrelEndpoints(context: Aspire.Hosting/Aspire.Hosting.ProjectResourceOptions) -> boolean Aspire.Hosting/ProjectResourceOptions.excludeLaunchProfile(context: Aspire.Hosting/Aspire.Hosting.ProjectResourceOptions) -> boolean Aspire.Hosting/ProjectResourceOptions.launchProfileName(context: Aspire.Hosting/Aspire.Hosting.ProjectResourceOptions) -> string @@ -236,7 +350,12 @@ Aspire.Hosting/publishProjectAsDockerFileWithConfigure(configure?: callback) -> Aspire.Hosting/publishResourceUpdate(resource: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource, state?: string, stateStyle?: string) -> void Aspire.Hosting/publishWithContainerFiles(source: Aspire.Hosting/Aspire.Hosting.IResourceWithContainerFiles, destinationPath: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IContainerFilesDestinationResource Aspire.Hosting/run(context: Aspire.Hosting/Aspire.Hosting.DistributedApplication, cancellationToken?: cancellationToken) -> void +Aspire.Hosting/saveStateJson(json: string, cancellationToken?: cancellationToken) -> void +Aspire.Hosting/subscribeAfterResourcesCreated(callback: callback) -> Aspire.Hosting/Aspire.Hosting.Eventing.DistributedApplicationEventSubscription +Aspire.Hosting/subscribeBeforeStart(callback: callback) -> Aspire.Hosting/Aspire.Hosting.Eventing.DistributedApplicationEventSubscription Aspire.Hosting/tryGetResourceState(resourceName: string) -> Aspire.Hosting/Aspire.Hosting.Ats.ResourceEventDto +Aspire.Hosting/updateTask(statusText: string, cancellationToken?: cancellationToken) -> void +Aspire.Hosting/updateTaskMarkdown(markdownString: string, cancellationToken?: cancellationToken) -> void Aspire.Hosting/waitFor(dependency: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithWaitSupport Aspire.Hosting/waitForCompletion(dependency: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource, exitCode?: number) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithWaitSupport Aspire.Hosting/waitForDependencies(resource: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource) -> void @@ -248,7 +367,6 @@ Aspire.Hosting/waitForStartWithBehavior(dependency: Aspire.Hosting/Aspire.Hostin Aspire.Hosting/waitForWithBehavior(dependency: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource, waitBehavior: enum:Aspire.Hosting.ApplicationModel.WaitBehavior) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithWaitSupport Aspire.Hosting/withArgs(args: string[]) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithArgs Aspire.Hosting/withArgsCallback(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithArgs -Aspire.Hosting/withArgsCallbackAsync(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithArgs Aspire.Hosting/withBindMount(source: string, target: string, isReadOnly?: boolean) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerResource Aspire.Hosting/withBuildArg(name: string, value: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerResource Aspire.Hosting/withBuildSecret(name: string, value: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerResource @@ -269,13 +387,8 @@ Aspire.Hosting/withDockerfileBaseImage(buildImage?: string, runtimeImage?: strin Aspire.Hosting/withEndpoint(port?: number, targetPort?: number, scheme?: string, name?: string, env?: string, isProxied?: boolean, isExternal?: boolean, protocol?: enum:System.Net.Sockets.ProtocolType) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEndpoints Aspire.Hosting/withEndpointProxySupport(proxyEnabled: boolean) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerResource Aspire.Hosting/withEntrypoint(entrypoint: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerResource -Aspire.Hosting/withEnvironment(name: string, value: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment +Aspire.Hosting/withEnvironment(name: string, value: string|Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpression|Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference|Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource|Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithConnectionString|Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment Aspire.Hosting/withEnvironmentCallback(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment -Aspire.Hosting/withEnvironmentCallbackAsync(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment -Aspire.Hosting/withEnvironmentConnectionString(envVarName: string, resource: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithConnectionString) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment -Aspire.Hosting/withEnvironmentEndpoint(name: string, endpointReference: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment -Aspire.Hosting/withEnvironmentExpression(name: string, value: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpression) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment -Aspire.Hosting/withEnvironmentParameter(name: string, parameter: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment Aspire.Hosting/withExecutableCommand(command: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecutableResource Aspire.Hosting/withExplicitStart() -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource Aspire.Hosting/withExternalHttpEndpoints() -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEndpoints @@ -299,7 +412,6 @@ Aspire.Hosting/withOtlpExporterProtocol(protocol: enum:Aspire.Hosting.OtlpProtoc Aspire.Hosting/withoutHttpsCertificate() -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment Aspire.Hosting/withParentRelationship(parent: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource Aspire.Hosting/withPipelineConfiguration(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource -Aspire.Hosting/withPipelineConfigurationAsync(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource Aspire.Hosting/withPipelineStepFactory(stepName: string, callback: callback, dependsOn?: string[], requiredBy?: string[], tags?: string[], description?: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource Aspire.Hosting/withReference(source: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource, connectionName?: string, optional?: boolean, name?: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment Aspire.Hosting/withReferenceEndpoint(endpointReference: Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment @@ -320,6 +432,5 @@ Aspire.Hosting/withUrlExpression(url: Aspire.Hosting/Aspire.Hosting.ApplicationM Aspire.Hosting/withUrlForEndpoint(endpointName: string, callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource Aspire.Hosting/withUrlForEndpointFactory(endpointName: string, callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEndpoints Aspire.Hosting/withUrlsCallback(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource -Aspire.Hosting/withUrlsCallbackAsync(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource Aspire.Hosting/withVolume(target: string, name?: string, isReadOnly?: boolean) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerResource Aspire.Hosting/withWorkingDirectory(workingDirectory: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecutableResource diff --git a/tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/HostingContainerResourceCapabilities.verified.txt b/tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/HostingContainerResourceCapabilities.verified.txt index 6ec567962be..5dddbb78871 100644 --- a/tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/HostingContainerResourceCapabilities.verified.txt +++ b/tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/HostingContainerResourceCapabilities.verified.txt @@ -517,62 +517,6 @@ } ] }, - { - CapabilityId: Aspire.Hosting/withEnvironmentConnectionString, - MethodName: withEnvironmentConnectionString, - TargetType: { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment, - IsInterface: true - }, - ExpandedTargetTypes: [ - { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerResource, - IsInterface: false - } - ] - }, - { - CapabilityId: Aspire.Hosting/withEnvironmentEndpoint, - MethodName: withEnvironmentEndpoint, - TargetType: { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment, - IsInterface: true - }, - ExpandedTargetTypes: [ - { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerResource, - IsInterface: false - } - ] - }, - { - CapabilityId: Aspire.Hosting/withEnvironmentExpression, - MethodName: withEnvironmentExpression, - TargetType: { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment, - IsInterface: true - }, - ExpandedTargetTypes: [ - { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerResource, - IsInterface: false - } - ] - }, - { - CapabilityId: Aspire.Hosting/withEnvironmentParameter, - MethodName: withEnvironmentParameter, - TargetType: { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment, - IsInterface: true - }, - ExpandedTargetTypes: [ - { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerResource, - IsInterface: false - } - ] - }, { CapabilityId: Aspire.Hosting/withExplicitStart, MethodName: withExplicitStart, diff --git a/tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.ts b/tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.ts index 174077be454..7c7ab434ce9 100644 --- a/tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.ts +++ b/tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.ts @@ -7085,7 +7085,7 @@ export class ContainerResource extends ResourceBuilderBase { + private async _withEnvironmentInternal(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase): Promise { const rpcArgs: Record = { builder: this._handle, name, value }; const result = await this._client.invokeCapability( 'Aspire.Hosting/withEnvironment', @@ -7095,25 +7095,10 @@ export class ContainerResource extends ResourceBuilderBase { - const rpcArgs: Record = { builder: this._handle, name, value }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentExpression', - rpcArgs - ); - return new ContainerResource(result, this._client); - } - - /** Adds an environment variable with a reference expression */ - withEnvironmentExpression(name: string, value: ReferenceExpression): ContainerResourcePromise { - return new ContainerResourcePromise(this._withEnvironmentExpressionInternal(name, value)); - } - /** @internal */ private async _withEnvironmentCallbackInternal(callback: (obj: EnvironmentCallbackContext) => Promise): Promise { const callbackId = registerCallback(async (objData: unknown) => { @@ -7134,51 +7119,6 @@ export class ContainerResource extends ResourceBuilderBase { - const rpcArgs: Record = { builder: this._handle, name, endpointReference }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentEndpoint', - rpcArgs - ); - return new ContainerResource(result, this._client); - } - - /** Sets an environment variable from an endpoint reference */ - withEnvironmentEndpoint(name: string, endpointReference: EndpointReference): ContainerResourcePromise { - return new ContainerResourcePromise(this._withEnvironmentEndpointInternal(name, endpointReference)); - } - - /** @internal */ - private async _withEnvironmentParameterInternal(name: string, parameter: ParameterResource): Promise { - const rpcArgs: Record = { builder: this._handle, name, parameter }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentParameter', - rpcArgs - ); - return new ContainerResource(result, this._client); - } - - /** Sets an environment variable from a parameter resource */ - withEnvironmentParameter(name: string, parameter: ParameterResource): ContainerResourcePromise { - return new ContainerResourcePromise(this._withEnvironmentParameterInternal(name, parameter)); - } - - /** @internal */ - private async _withEnvironmentConnectionStringInternal(envVarName: string, resource: ResourceBuilderBase): Promise { - const rpcArgs: Record = { builder: this._handle, envVarName, resource }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentConnectionString', - rpcArgs - ); - return new ContainerResource(result, this._client); - } - - /** Sets an environment variable from a connection string resource */ - withEnvironmentConnectionString(envVarName: string, resource: ResourceBuilderBase): ContainerResourcePromise { - return new ContainerResourcePromise(this._withEnvironmentConnectionStringInternal(envVarName, resource)); - } - /** @internal */ private async _withArgsInternal(args: string[]): Promise { const rpcArgs: Record = { builder: this._handle, args }; @@ -8528,35 +8468,15 @@ export class ContainerResourcePromise implements PromiseLike } /** Sets an environment variable */ - withEnvironment(name: string, value: string): ContainerResourcePromise { + withEnvironment(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase): ContainerResourcePromise { return new ContainerResourcePromise(this._promise.then(obj => obj.withEnvironment(name, value))); } - /** Adds an environment variable with a reference expression */ - withEnvironmentExpression(name: string, value: ReferenceExpression): ContainerResourcePromise { - return new ContainerResourcePromise(this._promise.then(obj => obj.withEnvironmentExpression(name, value))); - } - /** Sets environment variables via callback */ withEnvironmentCallback(callback: (obj: EnvironmentCallbackContext) => Promise): ContainerResourcePromise { return new ContainerResourcePromise(this._promise.then(obj => obj.withEnvironmentCallback(callback))); } - /** Sets an environment variable from an endpoint reference */ - withEnvironmentEndpoint(name: string, endpointReference: EndpointReference): ContainerResourcePromise { - return new ContainerResourcePromise(this._promise.then(obj => obj.withEnvironmentEndpoint(name, endpointReference))); - } - - /** Sets an environment variable from a parameter resource */ - withEnvironmentParameter(name: string, parameter: ParameterResource): ContainerResourcePromise { - return new ContainerResourcePromise(this._promise.then(obj => obj.withEnvironmentParameter(name, parameter))); - } - - /** Sets an environment variable from a connection string resource */ - withEnvironmentConnectionString(envVarName: string, resource: ResourceBuilderBase): ContainerResourcePromise { - return new ContainerResourcePromise(this._promise.then(obj => obj.withEnvironmentConnectionString(envVarName, resource))); - } - /** Adds arguments */ withArgs(args: string[]): ContainerResourcePromise { return new ContainerResourcePromise(this._promise.then(obj => obj.withArgs(args))); @@ -9071,7 +8991,7 @@ export class CSharpAppResource extends ResourceBuilderBase { + private async _withEnvironmentInternal(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase): Promise { const rpcArgs: Record = { builder: this._handle, name, value }; const result = await this._client.invokeCapability( 'Aspire.Hosting/withEnvironment', @@ -9081,25 +9001,10 @@ export class CSharpAppResource extends ResourceBuilderBase { - const rpcArgs: Record = { builder: this._handle, name, value }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentExpression', - rpcArgs - ); - return new CSharpAppResource(result, this._client); - } - - /** Adds an environment variable with a reference expression */ - withEnvironmentExpression(name: string, value: ReferenceExpression): CSharpAppResourcePromise { - return new CSharpAppResourcePromise(this._withEnvironmentExpressionInternal(name, value)); - } - /** @internal */ private async _withEnvironmentCallbackInternal(callback: (obj: EnvironmentCallbackContext) => Promise): Promise { const callbackId = registerCallback(async (objData: unknown) => { @@ -9120,51 +9025,6 @@ export class CSharpAppResource extends ResourceBuilderBase { - const rpcArgs: Record = { builder: this._handle, name, endpointReference }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentEndpoint', - rpcArgs - ); - return new CSharpAppResource(result, this._client); - } - - /** Sets an environment variable from an endpoint reference */ - withEnvironmentEndpoint(name: string, endpointReference: EndpointReference): CSharpAppResourcePromise { - return new CSharpAppResourcePromise(this._withEnvironmentEndpointInternal(name, endpointReference)); - } - - /** @internal */ - private async _withEnvironmentParameterInternal(name: string, parameter: ParameterResource): Promise { - const rpcArgs: Record = { builder: this._handle, name, parameter }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentParameter', - rpcArgs - ); - return new CSharpAppResource(result, this._client); - } - - /** Sets an environment variable from a parameter resource */ - withEnvironmentParameter(name: string, parameter: ParameterResource): CSharpAppResourcePromise { - return new CSharpAppResourcePromise(this._withEnvironmentParameterInternal(name, parameter)); - } - - /** @internal */ - private async _withEnvironmentConnectionStringInternal(envVarName: string, resource: ResourceBuilderBase): Promise { - const rpcArgs: Record = { builder: this._handle, envVarName, resource }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentConnectionString', - rpcArgs - ); - return new CSharpAppResource(result, this._client); - } - - /** Sets an environment variable from a connection string resource */ - withEnvironmentConnectionString(envVarName: string, resource: ResourceBuilderBase): CSharpAppResourcePromise { - return new CSharpAppResourcePromise(this._withEnvironmentConnectionStringInternal(envVarName, resource)); - } - /** @internal */ private async _withArgsInternal(args: string[]): Promise { const rpcArgs: Record = { builder: this._handle, args }; @@ -10440,35 +10300,15 @@ export class CSharpAppResourcePromise implements PromiseLike } /** Sets an environment variable */ - withEnvironment(name: string, value: string): CSharpAppResourcePromise { + withEnvironment(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase): CSharpAppResourcePromise { return new CSharpAppResourcePromise(this._promise.then(obj => obj.withEnvironment(name, value))); } - /** Adds an environment variable with a reference expression */ - withEnvironmentExpression(name: string, value: ReferenceExpression): CSharpAppResourcePromise { - return new CSharpAppResourcePromise(this._promise.then(obj => obj.withEnvironmentExpression(name, value))); - } - /** Sets environment variables via callback */ withEnvironmentCallback(callback: (obj: EnvironmentCallbackContext) => Promise): CSharpAppResourcePromise { return new CSharpAppResourcePromise(this._promise.then(obj => obj.withEnvironmentCallback(callback))); } - /** Sets an environment variable from an endpoint reference */ - withEnvironmentEndpoint(name: string, endpointReference: EndpointReference): CSharpAppResourcePromise { - return new CSharpAppResourcePromise(this._promise.then(obj => obj.withEnvironmentEndpoint(name, endpointReference))); - } - - /** Sets an environment variable from a parameter resource */ - withEnvironmentParameter(name: string, parameter: ParameterResource): CSharpAppResourcePromise { - return new CSharpAppResourcePromise(this._promise.then(obj => obj.withEnvironmentParameter(name, parameter))); - } - - /** Sets an environment variable from a connection string resource */ - withEnvironmentConnectionString(envVarName: string, resource: ResourceBuilderBase): CSharpAppResourcePromise { - return new CSharpAppResourcePromise(this._promise.then(obj => obj.withEnvironmentConnectionString(envVarName, resource))); - } - /** Adds arguments */ withArgs(args: string[]): CSharpAppResourcePromise { return new CSharpAppResourcePromise(this._promise.then(obj => obj.withArgs(args))); @@ -11086,7 +10926,7 @@ export class DotnetToolResource extends ResourceBuilderBase { + private async _withEnvironmentInternal(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase): Promise { const rpcArgs: Record = { builder: this._handle, name, value }; const result = await this._client.invokeCapability( 'Aspire.Hosting/withEnvironment', @@ -11096,25 +10936,10 @@ export class DotnetToolResource extends ResourceBuilderBase { - const rpcArgs: Record = { builder: this._handle, name, value }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentExpression', - rpcArgs - ); - return new DotnetToolResource(result, this._client); - } - - /** Adds an environment variable with a reference expression */ - withEnvironmentExpression(name: string, value: ReferenceExpression): DotnetToolResourcePromise { - return new DotnetToolResourcePromise(this._withEnvironmentExpressionInternal(name, value)); - } - /** @internal */ private async _withEnvironmentCallbackInternal(callback: (obj: EnvironmentCallbackContext) => Promise): Promise { const callbackId = registerCallback(async (objData: unknown) => { @@ -11135,51 +10960,6 @@ export class DotnetToolResource extends ResourceBuilderBase { - const rpcArgs: Record = { builder: this._handle, name, endpointReference }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentEndpoint', - rpcArgs - ); - return new DotnetToolResource(result, this._client); - } - - /** Sets an environment variable from an endpoint reference */ - withEnvironmentEndpoint(name: string, endpointReference: EndpointReference): DotnetToolResourcePromise { - return new DotnetToolResourcePromise(this._withEnvironmentEndpointInternal(name, endpointReference)); - } - - /** @internal */ - private async _withEnvironmentParameterInternal(name: string, parameter: ParameterResource): Promise { - const rpcArgs: Record = { builder: this._handle, name, parameter }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentParameter', - rpcArgs - ); - return new DotnetToolResource(result, this._client); - } - - /** Sets an environment variable from a parameter resource */ - withEnvironmentParameter(name: string, parameter: ParameterResource): DotnetToolResourcePromise { - return new DotnetToolResourcePromise(this._withEnvironmentParameterInternal(name, parameter)); - } - - /** @internal */ - private async _withEnvironmentConnectionStringInternal(envVarName: string, resource: ResourceBuilderBase): Promise { - const rpcArgs: Record = { builder: this._handle, envVarName, resource }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentConnectionString', - rpcArgs - ); - return new DotnetToolResource(result, this._client); - } - - /** Sets an environment variable from a connection string resource */ - withEnvironmentConnectionString(envVarName: string, resource: ResourceBuilderBase): DotnetToolResourcePromise { - return new DotnetToolResourcePromise(this._withEnvironmentConnectionStringInternal(envVarName, resource)); - } - /** @internal */ private async _withArgsInternal(args: string[]): Promise { const rpcArgs: Record = { builder: this._handle, args }; @@ -12475,35 +12255,15 @@ export class DotnetToolResourcePromise implements PromiseLike obj.withEnvironment(name, value))); } - /** Adds an environment variable with a reference expression */ - withEnvironmentExpression(name: string, value: ReferenceExpression): DotnetToolResourcePromise { - return new DotnetToolResourcePromise(this._promise.then(obj => obj.withEnvironmentExpression(name, value))); - } - /** Sets environment variables via callback */ withEnvironmentCallback(callback: (obj: EnvironmentCallbackContext) => Promise): DotnetToolResourcePromise { return new DotnetToolResourcePromise(this._promise.then(obj => obj.withEnvironmentCallback(callback))); } - /** Sets an environment variable from an endpoint reference */ - withEnvironmentEndpoint(name: string, endpointReference: EndpointReference): DotnetToolResourcePromise { - return new DotnetToolResourcePromise(this._promise.then(obj => obj.withEnvironmentEndpoint(name, endpointReference))); - } - - /** Sets an environment variable from a parameter resource */ - withEnvironmentParameter(name: string, parameter: ParameterResource): DotnetToolResourcePromise { - return new DotnetToolResourcePromise(this._promise.then(obj => obj.withEnvironmentParameter(name, parameter))); - } - - /** Sets an environment variable from a connection string resource */ - withEnvironmentConnectionString(envVarName: string, resource: ResourceBuilderBase): DotnetToolResourcePromise { - return new DotnetToolResourcePromise(this._promise.then(obj => obj.withEnvironmentConnectionString(envVarName, resource))); - } - /** Adds arguments */ withArgs(args: string[]): DotnetToolResourcePromise { return new DotnetToolResourcePromise(this._promise.then(obj => obj.withArgs(args))); @@ -13026,7 +12786,7 @@ export class ExecutableResource extends ResourceBuilderBase { + private async _withEnvironmentInternal(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase): Promise { const rpcArgs: Record = { builder: this._handle, name, value }; const result = await this._client.invokeCapability( 'Aspire.Hosting/withEnvironment', @@ -13036,25 +12796,10 @@ export class ExecutableResource extends ResourceBuilderBase { - const rpcArgs: Record = { builder: this._handle, name, value }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentExpression', - rpcArgs - ); - return new ExecutableResource(result, this._client); - } - - /** Adds an environment variable with a reference expression */ - withEnvironmentExpression(name: string, value: ReferenceExpression): ExecutableResourcePromise { - return new ExecutableResourcePromise(this._withEnvironmentExpressionInternal(name, value)); - } - /** @internal */ private async _withEnvironmentCallbackInternal(callback: (obj: EnvironmentCallbackContext) => Promise): Promise { const callbackId = registerCallback(async (objData: unknown) => { @@ -13075,51 +12820,6 @@ export class ExecutableResource extends ResourceBuilderBase { - const rpcArgs: Record = { builder: this._handle, name, endpointReference }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentEndpoint', - rpcArgs - ); - return new ExecutableResource(result, this._client); - } - - /** Sets an environment variable from an endpoint reference */ - withEnvironmentEndpoint(name: string, endpointReference: EndpointReference): ExecutableResourcePromise { - return new ExecutableResourcePromise(this._withEnvironmentEndpointInternal(name, endpointReference)); - } - - /** @internal */ - private async _withEnvironmentParameterInternal(name: string, parameter: ParameterResource): Promise { - const rpcArgs: Record = { builder: this._handle, name, parameter }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentParameter', - rpcArgs - ); - return new ExecutableResource(result, this._client); - } - - /** Sets an environment variable from a parameter resource */ - withEnvironmentParameter(name: string, parameter: ParameterResource): ExecutableResourcePromise { - return new ExecutableResourcePromise(this._withEnvironmentParameterInternal(name, parameter)); - } - - /** @internal */ - private async _withEnvironmentConnectionStringInternal(envVarName: string, resource: ResourceBuilderBase): Promise { - const rpcArgs: Record = { builder: this._handle, envVarName, resource }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentConnectionString', - rpcArgs - ); - return new ExecutableResource(result, this._client); - } - - /** Sets an environment variable from a connection string resource */ - withEnvironmentConnectionString(envVarName: string, resource: ResourceBuilderBase): ExecutableResourcePromise { - return new ExecutableResourcePromise(this._withEnvironmentConnectionStringInternal(envVarName, resource)); - } - /** @internal */ private async _withArgsInternal(args: string[]): Promise { const rpcArgs: Record = { builder: this._handle, args }; @@ -14385,35 +14085,15 @@ export class ExecutableResourcePromise implements PromiseLike obj.withEnvironment(name, value))); } - /** Adds an environment variable with a reference expression */ - withEnvironmentExpression(name: string, value: ReferenceExpression): ExecutableResourcePromise { - return new ExecutableResourcePromise(this._promise.then(obj => obj.withEnvironmentExpression(name, value))); - } - /** Sets environment variables via callback */ withEnvironmentCallback(callback: (obj: EnvironmentCallbackContext) => Promise): ExecutableResourcePromise { return new ExecutableResourcePromise(this._promise.then(obj => obj.withEnvironmentCallback(callback))); } - /** Sets an environment variable from an endpoint reference */ - withEnvironmentEndpoint(name: string, endpointReference: EndpointReference): ExecutableResourcePromise { - return new ExecutableResourcePromise(this._promise.then(obj => obj.withEnvironmentEndpoint(name, endpointReference))); - } - - /** Sets an environment variable from a parameter resource */ - withEnvironmentParameter(name: string, parameter: ParameterResource): ExecutableResourcePromise { - return new ExecutableResourcePromise(this._promise.then(obj => obj.withEnvironmentParameter(name, parameter))); - } - - /** Sets an environment variable from a connection string resource */ - withEnvironmentConnectionString(envVarName: string, resource: ResourceBuilderBase): ExecutableResourcePromise { - return new ExecutableResourcePromise(this._promise.then(obj => obj.withEnvironmentConnectionString(envVarName, resource))); - } - /** Adds arguments */ withArgs(args: string[]): ExecutableResourcePromise { return new ExecutableResourcePromise(this._promise.then(obj => obj.withArgs(args))); @@ -16921,7 +16601,7 @@ export class ProjectResource extends ResourceBuilderBase } /** @internal */ - private async _withEnvironmentInternal(name: string, value: string): Promise { + private async _withEnvironmentInternal(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase): Promise { const rpcArgs: Record = { builder: this._handle, name, value }; const result = await this._client.invokeCapability( 'Aspire.Hosting/withEnvironment', @@ -16931,25 +16611,10 @@ export class ProjectResource extends ResourceBuilderBase } /** Sets an environment variable */ - withEnvironment(name: string, value: string): ProjectResourcePromise { + withEnvironment(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase): ProjectResourcePromise { return new ProjectResourcePromise(this._withEnvironmentInternal(name, value)); } - /** @internal */ - private async _withEnvironmentExpressionInternal(name: string, value: ReferenceExpression): Promise { - const rpcArgs: Record = { builder: this._handle, name, value }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentExpression', - rpcArgs - ); - return new ProjectResource(result, this._client); - } - - /** Adds an environment variable with a reference expression */ - withEnvironmentExpression(name: string, value: ReferenceExpression): ProjectResourcePromise { - return new ProjectResourcePromise(this._withEnvironmentExpressionInternal(name, value)); - } - /** @internal */ private async _withEnvironmentCallbackInternal(callback: (obj: EnvironmentCallbackContext) => Promise): Promise { const callbackId = registerCallback(async (objData: unknown) => { @@ -16970,51 +16635,6 @@ export class ProjectResource extends ResourceBuilderBase return new ProjectResourcePromise(this._withEnvironmentCallbackInternal(callback)); } - /** @internal */ - private async _withEnvironmentEndpointInternal(name: string, endpointReference: EndpointReference): Promise { - const rpcArgs: Record = { builder: this._handle, name, endpointReference }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentEndpoint', - rpcArgs - ); - return new ProjectResource(result, this._client); - } - - /** Sets an environment variable from an endpoint reference */ - withEnvironmentEndpoint(name: string, endpointReference: EndpointReference): ProjectResourcePromise { - return new ProjectResourcePromise(this._withEnvironmentEndpointInternal(name, endpointReference)); - } - - /** @internal */ - private async _withEnvironmentParameterInternal(name: string, parameter: ParameterResource): Promise { - const rpcArgs: Record = { builder: this._handle, name, parameter }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentParameter', - rpcArgs - ); - return new ProjectResource(result, this._client); - } - - /** Sets an environment variable from a parameter resource */ - withEnvironmentParameter(name: string, parameter: ParameterResource): ProjectResourcePromise { - return new ProjectResourcePromise(this._withEnvironmentParameterInternal(name, parameter)); - } - - /** @internal */ - private async _withEnvironmentConnectionStringInternal(envVarName: string, resource: ResourceBuilderBase): Promise { - const rpcArgs: Record = { builder: this._handle, envVarName, resource }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentConnectionString', - rpcArgs - ); - return new ProjectResource(result, this._client); - } - - /** Sets an environment variable from a connection string resource */ - withEnvironmentConnectionString(envVarName: string, resource: ResourceBuilderBase): ProjectResourcePromise { - return new ProjectResourcePromise(this._withEnvironmentConnectionStringInternal(envVarName, resource)); - } - /** @internal */ private async _withArgsInternal(args: string[]): Promise { const rpcArgs: Record = { builder: this._handle, args }; @@ -18290,35 +17910,15 @@ export class ProjectResourcePromise implements PromiseLike { } /** Sets an environment variable */ - withEnvironment(name: string, value: string): ProjectResourcePromise { + withEnvironment(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase): ProjectResourcePromise { return new ProjectResourcePromise(this._promise.then(obj => obj.withEnvironment(name, value))); } - /** Adds an environment variable with a reference expression */ - withEnvironmentExpression(name: string, value: ReferenceExpression): ProjectResourcePromise { - return new ProjectResourcePromise(this._promise.then(obj => obj.withEnvironmentExpression(name, value))); - } - /** Sets environment variables via callback */ withEnvironmentCallback(callback: (obj: EnvironmentCallbackContext) => Promise): ProjectResourcePromise { return new ProjectResourcePromise(this._promise.then(obj => obj.withEnvironmentCallback(callback))); } - /** Sets an environment variable from an endpoint reference */ - withEnvironmentEndpoint(name: string, endpointReference: EndpointReference): ProjectResourcePromise { - return new ProjectResourcePromise(this._promise.then(obj => obj.withEnvironmentEndpoint(name, endpointReference))); - } - - /** Sets an environment variable from a parameter resource */ - withEnvironmentParameter(name: string, parameter: ParameterResource): ProjectResourcePromise { - return new ProjectResourcePromise(this._promise.then(obj => obj.withEnvironmentParameter(name, parameter))); - } - - /** Sets an environment variable from a connection string resource */ - withEnvironmentConnectionString(envVarName: string, resource: ResourceBuilderBase): ProjectResourcePromise { - return new ProjectResourcePromise(this._promise.then(obj => obj.withEnvironmentConnectionString(envVarName, resource))); - } - /** Adds arguments */ withArgs(args: string[]): ProjectResourcePromise { return new ProjectResourcePromise(this._promise.then(obj => obj.withArgs(args))); @@ -19044,7 +18644,7 @@ export class TestDatabaseResource extends ResourceBuilderBase { + private async _withEnvironmentInternal(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase): Promise { const rpcArgs: Record = { builder: this._handle, name, value }; const result = await this._client.invokeCapability( 'Aspire.Hosting/withEnvironment', @@ -19054,25 +18654,10 @@ export class TestDatabaseResource extends ResourceBuilderBase { - const rpcArgs: Record = { builder: this._handle, name, value }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentExpression', - rpcArgs - ); - return new TestDatabaseResource(result, this._client); - } - - /** Adds an environment variable with a reference expression */ - withEnvironmentExpression(name: string, value: ReferenceExpression): TestDatabaseResourcePromise { - return new TestDatabaseResourcePromise(this._withEnvironmentExpressionInternal(name, value)); - } - /** @internal */ private async _withEnvironmentCallbackInternal(callback: (obj: EnvironmentCallbackContext) => Promise): Promise { const callbackId = registerCallback(async (objData: unknown) => { @@ -19093,51 +18678,6 @@ export class TestDatabaseResource extends ResourceBuilderBase { - const rpcArgs: Record = { builder: this._handle, name, endpointReference }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentEndpoint', - rpcArgs - ); - return new TestDatabaseResource(result, this._client); - } - - /** Sets an environment variable from an endpoint reference */ - withEnvironmentEndpoint(name: string, endpointReference: EndpointReference): TestDatabaseResourcePromise { - return new TestDatabaseResourcePromise(this._withEnvironmentEndpointInternal(name, endpointReference)); - } - - /** @internal */ - private async _withEnvironmentParameterInternal(name: string, parameter: ParameterResource): Promise { - const rpcArgs: Record = { builder: this._handle, name, parameter }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentParameter', - rpcArgs - ); - return new TestDatabaseResource(result, this._client); - } - - /** Sets an environment variable from a parameter resource */ - withEnvironmentParameter(name: string, parameter: ParameterResource): TestDatabaseResourcePromise { - return new TestDatabaseResourcePromise(this._withEnvironmentParameterInternal(name, parameter)); - } - - /** @internal */ - private async _withEnvironmentConnectionStringInternal(envVarName: string, resource: ResourceBuilderBase): Promise { - const rpcArgs: Record = { builder: this._handle, envVarName, resource }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentConnectionString', - rpcArgs - ); - return new TestDatabaseResource(result, this._client); - } - - /** Sets an environment variable from a connection string resource */ - withEnvironmentConnectionString(envVarName: string, resource: ResourceBuilderBase): TestDatabaseResourcePromise { - return new TestDatabaseResourcePromise(this._withEnvironmentConnectionStringInternal(envVarName, resource)); - } - /** @internal */ private async _withArgsInternal(args: string[]): Promise { const rpcArgs: Record = { builder: this._handle, args }; @@ -20487,35 +20027,15 @@ export class TestDatabaseResourcePromise implements PromiseLike obj.withEnvironment(name, value))); } - /** Adds an environment variable with a reference expression */ - withEnvironmentExpression(name: string, value: ReferenceExpression): TestDatabaseResourcePromise { - return new TestDatabaseResourcePromise(this._promise.then(obj => obj.withEnvironmentExpression(name, value))); - } - /** Sets environment variables via callback */ withEnvironmentCallback(callback: (obj: EnvironmentCallbackContext) => Promise): TestDatabaseResourcePromise { return new TestDatabaseResourcePromise(this._promise.then(obj => obj.withEnvironmentCallback(callback))); } - /** Sets an environment variable from an endpoint reference */ - withEnvironmentEndpoint(name: string, endpointReference: EndpointReference): TestDatabaseResourcePromise { - return new TestDatabaseResourcePromise(this._promise.then(obj => obj.withEnvironmentEndpoint(name, endpointReference))); - } - - /** Sets an environment variable from a parameter resource */ - withEnvironmentParameter(name: string, parameter: ParameterResource): TestDatabaseResourcePromise { - return new TestDatabaseResourcePromise(this._promise.then(obj => obj.withEnvironmentParameter(name, parameter))); - } - - /** Sets an environment variable from a connection string resource */ - withEnvironmentConnectionString(envVarName: string, resource: ResourceBuilderBase): TestDatabaseResourcePromise { - return new TestDatabaseResourcePromise(this._promise.then(obj => obj.withEnvironmentConnectionString(envVarName, resource))); - } - /** Adds arguments */ withArgs(args: string[]): TestDatabaseResourcePromise { return new TestDatabaseResourcePromise(this._promise.then(obj => obj.withArgs(args))); @@ -21241,7 +20761,7 @@ export class TestRedisResource extends ResourceBuilderBase { + private async _withEnvironmentInternal(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase): Promise { const rpcArgs: Record = { builder: this._handle, name, value }; const result = await this._client.invokeCapability( 'Aspire.Hosting/withEnvironment', @@ -21251,25 +20771,10 @@ export class TestRedisResource extends ResourceBuilderBase { - const rpcArgs: Record = { builder: this._handle, name, value }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentExpression', - rpcArgs - ); - return new TestRedisResource(result, this._client); - } - - /** Adds an environment variable with a reference expression */ - withEnvironmentExpression(name: string, value: ReferenceExpression): TestRedisResourcePromise { - return new TestRedisResourcePromise(this._withEnvironmentExpressionInternal(name, value)); - } - /** @internal */ private async _withEnvironmentCallbackInternal(callback: (obj: EnvironmentCallbackContext) => Promise): Promise { const callbackId = registerCallback(async (objData: unknown) => { @@ -21290,51 +20795,6 @@ export class TestRedisResource extends ResourceBuilderBase { - const rpcArgs: Record = { builder: this._handle, name, endpointReference }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentEndpoint', - rpcArgs - ); - return new TestRedisResource(result, this._client); - } - - /** Sets an environment variable from an endpoint reference */ - withEnvironmentEndpoint(name: string, endpointReference: EndpointReference): TestRedisResourcePromise { - return new TestRedisResourcePromise(this._withEnvironmentEndpointInternal(name, endpointReference)); - } - - /** @internal */ - private async _withEnvironmentParameterInternal(name: string, parameter: ParameterResource): Promise { - const rpcArgs: Record = { builder: this._handle, name, parameter }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentParameter', - rpcArgs - ); - return new TestRedisResource(result, this._client); - } - - /** Sets an environment variable from a parameter resource */ - withEnvironmentParameter(name: string, parameter: ParameterResource): TestRedisResourcePromise { - return new TestRedisResourcePromise(this._withEnvironmentParameterInternal(name, parameter)); - } - - /** @internal */ - private async _withEnvironmentConnectionStringInternal(envVarName: string, resource: ResourceBuilderBase): Promise { - const rpcArgs: Record = { builder: this._handle, envVarName, resource }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentConnectionString', - rpcArgs - ); - return new TestRedisResource(result, this._client); - } - - /** Sets an environment variable from a connection string resource */ - withEnvironmentConnectionString(envVarName: string, resource: ResourceBuilderBase): TestRedisResourcePromise { - return new TestRedisResourcePromise(this._withEnvironmentConnectionStringInternal(envVarName, resource)); - } - /** @internal */ private async _withConnectionPropertyInternal(name: string, value: ReferenceExpression): Promise { const rpcArgs: Record = { builder: this._handle, name, value }; @@ -22903,35 +22363,15 @@ export class TestRedisResourcePromise implements PromiseLike } /** Sets an environment variable */ - withEnvironment(name: string, value: string): TestRedisResourcePromise { + withEnvironment(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase): TestRedisResourcePromise { return new TestRedisResourcePromise(this._promise.then(obj => obj.withEnvironment(name, value))); } - /** Adds an environment variable with a reference expression */ - withEnvironmentExpression(name: string, value: ReferenceExpression): TestRedisResourcePromise { - return new TestRedisResourcePromise(this._promise.then(obj => obj.withEnvironmentExpression(name, value))); - } - /** Sets environment variables via callback */ withEnvironmentCallback(callback: (obj: EnvironmentCallbackContext) => Promise): TestRedisResourcePromise { return new TestRedisResourcePromise(this._promise.then(obj => obj.withEnvironmentCallback(callback))); } - /** Sets an environment variable from an endpoint reference */ - withEnvironmentEndpoint(name: string, endpointReference: EndpointReference): TestRedisResourcePromise { - return new TestRedisResourcePromise(this._promise.then(obj => obj.withEnvironmentEndpoint(name, endpointReference))); - } - - /** Sets an environment variable from a parameter resource */ - withEnvironmentParameter(name: string, parameter: ParameterResource): TestRedisResourcePromise { - return new TestRedisResourcePromise(this._promise.then(obj => obj.withEnvironmentParameter(name, parameter))); - } - - /** Sets an environment variable from a connection string resource */ - withEnvironmentConnectionString(envVarName: string, resource: ResourceBuilderBase): TestRedisResourcePromise { - return new TestRedisResourcePromise(this._promise.then(obj => obj.withEnvironmentConnectionString(envVarName, resource))); - } - /** Adds a connection property with a reference expression */ withConnectionProperty(name: string, value: ReferenceExpression): TestRedisResourcePromise { return new TestRedisResourcePromise(this._promise.then(obj => obj.withConnectionProperty(name, value))); @@ -23732,7 +23172,7 @@ export class TestVaultResource extends ResourceBuilderBase { + private async _withEnvironmentInternal(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase): Promise { const rpcArgs: Record = { builder: this._handle, name, value }; const result = await this._client.invokeCapability( 'Aspire.Hosting/withEnvironment', @@ -23742,25 +23182,10 @@ export class TestVaultResource extends ResourceBuilderBase { - const rpcArgs: Record = { builder: this._handle, name, value }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentExpression', - rpcArgs - ); - return new TestVaultResource(result, this._client); - } - - /** Adds an environment variable with a reference expression */ - withEnvironmentExpression(name: string, value: ReferenceExpression): TestVaultResourcePromise { - return new TestVaultResourcePromise(this._withEnvironmentExpressionInternal(name, value)); - } - /** @internal */ private async _withEnvironmentCallbackInternal(callback: (obj: EnvironmentCallbackContext) => Promise): Promise { const callbackId = registerCallback(async (objData: unknown) => { @@ -23781,51 +23206,6 @@ export class TestVaultResource extends ResourceBuilderBase { - const rpcArgs: Record = { builder: this._handle, name, endpointReference }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentEndpoint', - rpcArgs - ); - return new TestVaultResource(result, this._client); - } - - /** Sets an environment variable from an endpoint reference */ - withEnvironmentEndpoint(name: string, endpointReference: EndpointReference): TestVaultResourcePromise { - return new TestVaultResourcePromise(this._withEnvironmentEndpointInternal(name, endpointReference)); - } - - /** @internal */ - private async _withEnvironmentParameterInternal(name: string, parameter: ParameterResource): Promise { - const rpcArgs: Record = { builder: this._handle, name, parameter }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentParameter', - rpcArgs - ); - return new TestVaultResource(result, this._client); - } - - /** Sets an environment variable from a parameter resource */ - withEnvironmentParameter(name: string, parameter: ParameterResource): TestVaultResourcePromise { - return new TestVaultResourcePromise(this._withEnvironmentParameterInternal(name, parameter)); - } - - /** @internal */ - private async _withEnvironmentConnectionStringInternal(envVarName: string, resource: ResourceBuilderBase): Promise { - const rpcArgs: Record = { builder: this._handle, envVarName, resource }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentConnectionString', - rpcArgs - ); - return new TestVaultResource(result, this._client); - } - - /** Sets an environment variable from a connection string resource */ - withEnvironmentConnectionString(envVarName: string, resource: ResourceBuilderBase): TestVaultResourcePromise { - return new TestVaultResourcePromise(this._withEnvironmentConnectionStringInternal(envVarName, resource)); - } - /** @internal */ private async _withArgsInternal(args: string[]): Promise { const rpcArgs: Record = { builder: this._handle, args }; @@ -25190,35 +24570,15 @@ export class TestVaultResourcePromise implements PromiseLike } /** Sets an environment variable */ - withEnvironment(name: string, value: string): TestVaultResourcePromise { + withEnvironment(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase): TestVaultResourcePromise { return new TestVaultResourcePromise(this._promise.then(obj => obj.withEnvironment(name, value))); } - /** Adds an environment variable with a reference expression */ - withEnvironmentExpression(name: string, value: ReferenceExpression): TestVaultResourcePromise { - return new TestVaultResourcePromise(this._promise.then(obj => obj.withEnvironmentExpression(name, value))); - } - /** Sets environment variables via callback */ withEnvironmentCallback(callback: (obj: EnvironmentCallbackContext) => Promise): TestVaultResourcePromise { return new TestVaultResourcePromise(this._promise.then(obj => obj.withEnvironmentCallback(callback))); } - /** Sets an environment variable from an endpoint reference */ - withEnvironmentEndpoint(name: string, endpointReference: EndpointReference): TestVaultResourcePromise { - return new TestVaultResourcePromise(this._promise.then(obj => obj.withEnvironmentEndpoint(name, endpointReference))); - } - - /** Sets an environment variable from a parameter resource */ - withEnvironmentParameter(name: string, parameter: ParameterResource): TestVaultResourcePromise { - return new TestVaultResourcePromise(this._promise.then(obj => obj.withEnvironmentParameter(name, parameter))); - } - - /** Sets an environment variable from a connection string resource */ - withEnvironmentConnectionString(envVarName: string, resource: ResourceBuilderBase): TestVaultResourcePromise { - return new TestVaultResourcePromise(this._promise.then(obj => obj.withEnvironmentConnectionString(envVarName, resource))); - } - /** Adds arguments */ withArgs(args: string[]): TestVaultResourcePromise { return new TestVaultResourcePromise(this._promise.then(obj => obj.withArgs(args))); @@ -27294,7 +26654,7 @@ export class ResourceWithEnvironment extends ResourceBuilderBase { + private async _withEnvironmentInternal(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase): Promise { const rpcArgs: Record = { builder: this._handle, name, value }; const result = await this._client.invokeCapability( 'Aspire.Hosting/withEnvironment', @@ -27304,25 +26664,10 @@ export class ResourceWithEnvironment extends ResourceBuilderBase { - const rpcArgs: Record = { builder: this._handle, name, value }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentExpression', - rpcArgs - ); - return new ResourceWithEnvironment(result, this._client); - } - - /** Adds an environment variable with a reference expression */ - withEnvironmentExpression(name: string, value: ReferenceExpression): ResourceWithEnvironmentPromise { - return new ResourceWithEnvironmentPromise(this._withEnvironmentExpressionInternal(name, value)); - } - /** @internal */ private async _withEnvironmentCallbackInternal(callback: (obj: EnvironmentCallbackContext) => Promise): Promise { const callbackId = registerCallback(async (objData: unknown) => { @@ -27343,51 +26688,6 @@ export class ResourceWithEnvironment extends ResourceBuilderBase { - const rpcArgs: Record = { builder: this._handle, name, endpointReference }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentEndpoint', - rpcArgs - ); - return new ResourceWithEnvironment(result, this._client); - } - - /** Sets an environment variable from an endpoint reference */ - withEnvironmentEndpoint(name: string, endpointReference: EndpointReference): ResourceWithEnvironmentPromise { - return new ResourceWithEnvironmentPromise(this._withEnvironmentEndpointInternal(name, endpointReference)); - } - - /** @internal */ - private async _withEnvironmentParameterInternal(name: string, parameter: ParameterResource): Promise { - const rpcArgs: Record = { builder: this._handle, name, parameter }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentParameter', - rpcArgs - ); - return new ResourceWithEnvironment(result, this._client); - } - - /** Sets an environment variable from a parameter resource */ - withEnvironmentParameter(name: string, parameter: ParameterResource): ResourceWithEnvironmentPromise { - return new ResourceWithEnvironmentPromise(this._withEnvironmentParameterInternal(name, parameter)); - } - - /** @internal */ - private async _withEnvironmentConnectionStringInternal(envVarName: string, resource: ResourceBuilderBase): Promise { - const rpcArgs: Record = { builder: this._handle, envVarName, resource }; - const result = await this._client.invokeCapability( - 'Aspire.Hosting/withEnvironmentConnectionString', - rpcArgs - ); - return new ResourceWithEnvironment(result, this._client); - } - - /** Sets an environment variable from a connection string resource */ - withEnvironmentConnectionString(envVarName: string, resource: ResourceBuilderBase): ResourceWithEnvironmentPromise { - return new ResourceWithEnvironmentPromise(this._withEnvironmentConnectionStringInternal(envVarName, resource)); - } - /** @internal */ private async _withReferenceInternal(source: ResourceBuilderBase, connectionName?: string, optional?: boolean, name?: string): Promise { const rpcArgs: Record = { builder: this._handle, source }; @@ -27579,35 +26879,15 @@ export class ResourceWithEnvironmentPromise implements PromiseLike obj.withEnvironment(name, value))); } - /** Adds an environment variable with a reference expression */ - withEnvironmentExpression(name: string, value: ReferenceExpression): ResourceWithEnvironmentPromise { - return new ResourceWithEnvironmentPromise(this._promise.then(obj => obj.withEnvironmentExpression(name, value))); - } - /** Sets environment variables via callback */ withEnvironmentCallback(callback: (obj: EnvironmentCallbackContext) => Promise): ResourceWithEnvironmentPromise { return new ResourceWithEnvironmentPromise(this._promise.then(obj => obj.withEnvironmentCallback(callback))); } - /** Sets an environment variable from an endpoint reference */ - withEnvironmentEndpoint(name: string, endpointReference: EndpointReference): ResourceWithEnvironmentPromise { - return new ResourceWithEnvironmentPromise(this._promise.then(obj => obj.withEnvironmentEndpoint(name, endpointReference))); - } - - /** Sets an environment variable from a parameter resource */ - withEnvironmentParameter(name: string, parameter: ParameterResource): ResourceWithEnvironmentPromise { - return new ResourceWithEnvironmentPromise(this._promise.then(obj => obj.withEnvironmentParameter(name, parameter))); - } - - /** Sets an environment variable from a connection string resource */ - withEnvironmentConnectionString(envVarName: string, resource: ResourceBuilderBase): ResourceWithEnvironmentPromise { - return new ResourceWithEnvironmentPromise(this._promise.then(obj => obj.withEnvironmentConnectionString(envVarName, resource))); - } - /** Adds a reference to another resource */ withReference(source: ResourceBuilderBase, options?: WithReferenceOptions): ResourceWithEnvironmentPromise { return new ResourceWithEnvironmentPromise(this._promise.then(obj => obj.withReference(source, options))); From 0d5d8ab6a476658b721e88454ca3605a5a77c0ce Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Fri, 27 Mar 2026 11:49:27 -0700 Subject: [PATCH 2/5] Add custom ATS withEnvironment hook Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../ValidationAppHost/apphost.py | 8 +- .../ValidationAppHost/apphost.py | 12 +- .../AzureKeyVaultSecretReference.cs | 10 +- .../AzureKeyVaultSecretResource.cs | 10 +- .../AzureBicepResource.cs | 10 +- .../AzureBicepResourceExtensions.cs | 12 +- .../IValueWithCustomWithEnvironment.cs | 35 ++ .../ResourceBuilderExtensions.cs | 40 +++ ...TwoPassScanningGeneratedAspire.verified.py | 306 ++---------------- 9 files changed, 133 insertions(+), 310 deletions(-) create mode 100644 src/Aspire.Hosting/ApplicationModel/IValueWithCustomWithEnvironment.cs diff --git a/playground/polyglot/Python/Aspire.Hosting.Azure/ValidationAppHost/apphost.py b/playground/polyglot/Python/Aspire.Hosting.Azure/ValidationAppHost/apphost.py index bfe6767024d..7691545aa0b 100644 --- a/playground/polyglot/Python/Aspire.Hosting.Azure/ValidationAppHost/apphost.py +++ b/playground/polyglot/Python/Aspire.Hosting.Azure/ValidationAppHost/apphost.py @@ -72,10 +72,10 @@ identity.publish_as_existing() identity.publish_as_existing_from_parameters() identity.as_existing() - container.with_environment_from_output() - container.with_environment_from_key_vault_secret() + container.with_environment("INFRA_URL", infrastructure_output) + container.with_environment("SECRET_FROM_IDENTITY", identity) container.with_azure_user_assigned_identity() - executable.with_environment_from_output() - executable.with_environment_from_key_vault_secret() + executable.with_environment("INFRA_URL", infrastructure_output) + executable.with_environment("SECRET_FROM_IDENTITY", identity) executable.with_azure_user_assigned_identity() builder.run() diff --git a/playground/polyglot/Python/Aspire.Hosting/ValidationAppHost/apphost.py b/playground/polyglot/Python/Aspire.Hosting/ValidationAppHost/apphost.py index 4abc3bc31b2..865878f2499 100644 --- a/playground/polyglot/Python/Aspire.Hosting/ValidationAppHost/apphost.py +++ b/playground/polyglot/Python/Aspire.Hosting/ValidationAppHost/apphost.py @@ -33,12 +33,12 @@ built_connection_string = builder.add_connection_string_builder("connection-string", lambda *_args, **_kwargs: None) built_connection_string.with_connection_property("Key", "Value") built_connection_string.with_connection_property_value("Key", "Value") - # withEnvironmentEndpoint - container.with_environment_endpoint("KEY", None) - # withEnvironmentParameter - container.with_environment_parameter("KEY", None) - # withEnvironmentConnectionString - container.with_environment_connection_string("KEY", None) + # withEnvironment - EndpointReference + container.with_environment("KEY", endpoint) + # withEnvironment - ParameterResource + container.with_environment("KEY", builder.add_parameter("param")) + # withEnvironment - connection string resource + container.with_environment("KEY", built_connection_string) # withConnectionProperty — with ReferenceExpression built_connection_string.with_connection_property("Key", "Value") # withConnectionPropertyValue — with string diff --git a/src/Aspire.Hosting.Azure.KeyVault/AzureKeyVaultSecretReference.cs b/src/Aspire.Hosting.Azure.KeyVault/AzureKeyVaultSecretReference.cs index 6654505d28c..c8779664861 100644 --- a/src/Aspire.Hosting.Azure.KeyVault/AzureKeyVaultSecretReference.cs +++ b/src/Aspire.Hosting.Azure.KeyVault/AzureKeyVaultSecretReference.cs @@ -10,7 +10,7 @@ namespace Aspire.Hosting.Azure; /// /// The name of the secret. /// The Azure Key Vault resource. -internal sealed class AzureKeyVaultSecretReference(string secretName, AzureKeyVaultResource azureKeyVaultResource) : IAzureKeyVaultSecretReference, IValueProvider, IManifestExpressionProvider +internal sealed class AzureKeyVaultSecretReference(string secretName, AzureKeyVaultResource azureKeyVaultResource) : IAzureKeyVaultSecretReference, IValueProvider, IManifestExpressionProvider, IValueWithCustomWithEnvironment { /// /// Gets the name of the secret. @@ -38,4 +38,12 @@ internal sealed class AzureKeyVaultSecretReference(string secretName, AzureKeyVa throw new InvalidOperationException($"Secret '{secretName}' not found in Key Vault '{azureKeyVaultResource.Name}'."); } + + static IResourceBuilder? IValueWithCustomWithEnvironment.TryWithEnvironment( + IResourceBuilder builder, + string name, + AzureKeyVaultSecretReference value) + { + return ResourceBuilderExtensions.WithEnvironment(builder, name, value); + } } diff --git a/src/Aspire.Hosting.Azure.KeyVault/AzureKeyVaultSecretResource.cs b/src/Aspire.Hosting.Azure.KeyVault/AzureKeyVaultSecretResource.cs index 526d47dbe3a..2827061b037 100644 --- a/src/Aspire.Hosting.Azure.KeyVault/AzureKeyVaultSecretResource.cs +++ b/src/Aspire.Hosting.Azure.KeyVault/AzureKeyVaultSecretResource.cs @@ -15,7 +15,7 @@ namespace Aspire.Hosting.Azure; /// [DebuggerDisplay("Type = {GetType().Name,nq}, Name = {Name}, Secret = {SecretName}")] public class AzureKeyVaultSecretResource(string name, string secretName, AzureKeyVaultResource parent, object value) - : Resource(name), IResourceWithParent, IAzureKeyVaultSecretReference + : Resource(name), IResourceWithParent, IAzureKeyVaultSecretReference, IValueWithCustomWithEnvironment { private readonly IAzureKeyVaultSecretReference _secret = parent.GetSecret(secretName); @@ -53,4 +53,12 @@ public class AzureKeyVaultSecretResource(string name, string secretName, AzureKe /// The secret value. ValueTask IValueProvider.GetValueAsync(CancellationToken cancellationToken) => _secret.GetValueAsync(cancellationToken); + + static IResourceBuilder? IValueWithCustomWithEnvironment.TryWithEnvironment( + IResourceBuilder builder, + string name, + AzureKeyVaultSecretResource value) + { + return ResourceBuilderExtensions.WithEnvironment(builder, name, value); + } } diff --git a/src/Aspire.Hosting.Azure/AzureBicepResource.cs b/src/Aspire.Hosting.Azure/AzureBicepResource.cs index b944b8711db..0fa311eb82f 100644 --- a/src/Aspire.Hosting.Azure/AzureBicepResource.cs +++ b/src/Aspire.Hosting.Azure/AzureBicepResource.cs @@ -628,7 +628,7 @@ public string? Value /// The name of the output /// The . [AspireExport(ExposeProperties = true)] -public sealed class BicepOutputReference(string name, AzureBicepResource resource) : IManifestExpressionProvider, IValueProvider, IValueWithReferences, IEquatable +public sealed class BicepOutputReference(string name, AzureBicepResource resource) : IManifestExpressionProvider, IValueProvider, IValueWithReferences, IValueWithCustomWithEnvironment, IEquatable { /// /// Name of the output. @@ -686,4 +686,12 @@ other is not null && /// public override int GetHashCode() => HashCode.Combine(Resource, Name); + + static IResourceBuilder? IValueWithCustomWithEnvironment.TryWithEnvironment( + IResourceBuilder builder, + string name, + BicepOutputReference value) + { + return ResourceBuilderExtensions.WithEnvironment(builder, name, value); + } } diff --git a/src/Aspire.Hosting.Azure/AzureBicepResourceExtensions.cs b/src/Aspire.Hosting.Azure/AzureBicepResourceExtensions.cs index 099bebb6c7d..61422ae126f 100644 --- a/src/Aspire.Hosting.Azure/AzureBicepResourceExtensions.cs +++ b/src/Aspire.Hosting.Azure/AzureBicepResourceExtensions.cs @@ -82,12 +82,7 @@ public static BicepSecretOutputReference GetSecretOutput(this IResourceBuilder WithEnvironment(this IResourceBuilder builder, string name, BicepOutputReference bicepOutputReference) where T : IResourceWithEnvironment { - builder.WithReferenceRelationship(bicepOutputReference.Resource); - - return builder.WithEnvironment(ctx => - { - ctx.EnvironmentVariables[name] = bicepOutputReference; - }); + return ResourceBuilderExtensions.WithEnvironment(builder, name, bicepOutputReference); } /// @@ -120,10 +115,7 @@ public static IResourceBuilder WithEnvironment(this IResourceBuilder bu public static IResourceBuilder WithEnvironment(this IResourceBuilder builder, string name, IAzureKeyVaultSecretReference secretReference) where T : IResourceWithEnvironment { - return builder.WithEnvironment(ctx => - { - ctx.EnvironmentVariables[name] = secretReference; - }); + return ResourceBuilderExtensions.WithEnvironment(builder, name, secretReference); } /// diff --git a/src/Aspire.Hosting/ApplicationModel/IValueWithCustomWithEnvironment.cs b/src/Aspire.Hosting/ApplicationModel/IValueWithCustomWithEnvironment.cs new file mode 100644 index 00000000000..c7089259622 --- /dev/null +++ b/src/Aspire.Hosting/ApplicationModel/IValueWithCustomWithEnvironment.cs @@ -0,0 +1,35 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Diagnostics.CodeAnalysis; + +namespace Aspire.Hosting.ApplicationModel; + +/// +/// Defines custom WithEnvironment dispatch behavior for an environment value type. +/// +/// The concrete value type that provides the custom dispatch behavior. +/// +/// This contract is used by the internal ATS-visible withEnvironment dispatcher +/// to route environment values to type-specific logic at runtime. Implementations may +/// customize dispatch when a value needs behavior that differs from the default +/// and handling. +/// +[Experimental("ASPIREATS001")] +public interface IValueWithCustomWithEnvironment : IValueProvider, IManifestExpressionProvider + where TSelf : IValueProvider, IManifestExpressionProvider, IValueWithCustomWithEnvironment +{ + /// + /// Applies an environment value to using value-specific behavior. + /// + /// The destination resource builder. + /// The environment variable name. + /// The environment value. + /// The destination resource type. + /// The destination when handled; otherwise, . + static abstract IResourceBuilder? TryWithEnvironment( + IResourceBuilder builder, + string name, + TSelf value) + where TDestination : IResourceWithEnvironment; +} diff --git a/src/Aspire.Hosting/ResourceBuilderExtensions.cs b/src/Aspire.Hosting/ResourceBuilderExtensions.cs index 9348a331627..f8551ab01eb 100644 --- a/src/Aspire.Hosting/ResourceBuilderExtensions.cs +++ b/src/Aspire.Hosting/ResourceBuilderExtensions.cs @@ -22,6 +22,7 @@ namespace Aspire.Hosting; public static class ResourceBuilderExtensions { private const string ConnectionStringEnvironmentName = "ConnectionStrings__"; + private static readonly MethodInfo s_dispatchCustomWithEnvironmentMethod = typeof(ResourceBuilderExtensions).GetMethod(nameof(DispatchCustomWithEnvironment), BindingFlags.NonPublic | BindingFlags.Static)!; private static readonly MethodInfo s_dispatchCustomWithReferenceMethod = typeof(ResourceBuilderExtensions).GetMethod(nameof(DispatchCustomWithReference), BindingFlags.NonPublic | BindingFlags.Static)!; /// @@ -59,6 +60,11 @@ internal static IResourceBuilder WithEnvironment( ArgumentNullException.ThrowIfNull(name); ArgumentNullException.ThrowIfNull(value); + if (TryDispatchCustomWithEnvironment(builder, name, value, out var dispatchedBuilder)) + { + return dispatchedBuilder; + } + return value switch { string stringValue => builder.WithEnvironment(name, stringValue), @@ -356,6 +362,40 @@ public static IResourceBuilder WithEnvironment(this IResourceBuild }); } + private static bool TryDispatchCustomWithEnvironment( + IResourceBuilder builder, + string name, + object value, + [NotNullWhen(true)] out IResourceBuilder? dispatchedBuilder) + where TDestination : IResourceWithEnvironment + { + var customType = value.GetType(); + var customWithEnvironmentInterface = customType.GetInterfaces() + .FirstOrDefault(i => i.IsGenericType + && i.GetGenericTypeDefinition() == typeof(IValueWithCustomWithEnvironment<>) + && i.GetGenericArguments()[0] == customType); + + if (customWithEnvironmentInterface is null) + { + dispatchedBuilder = null; + return false; + } + + var dispatchMethod = s_dispatchCustomWithEnvironmentMethod.MakeGenericMethod(typeof(TDestination), customType); + dispatchedBuilder = (IResourceBuilder?)dispatchMethod.Invoke(null, [builder, name, value]); + return dispatchedBuilder is not null; + } + + private static IResourceBuilder? DispatchCustomWithEnvironment( + IResourceBuilder builder, + string name, + TCustom value) + where TDestination : IResourceWithEnvironment + where TCustom : IValueProvider, IManifestExpressionProvider, IValueWithCustomWithEnvironment + { + return TCustom.TryWithEnvironment(builder, name, value); + } + /// /// Adds a connection property annotation to the resource being built. Any resource referencing this resource will /// get this connection property included in its environment variables. diff --git a/tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.py b/tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.py index ab4ea516e51..08a9209abb9 100644 --- a/tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.py +++ b/tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.py @@ -4845,29 +4845,13 @@ def with_otlp_exporter(self, *, protocol: OtlpProtocol | None = None) -> typing. """Configures OTLP telemetry export""" @abc.abstractmethod - def with_env(self, name: str, value: str) -> typing.Self: + def with_env(self, name: str, value: str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider) -> typing.Self: """Sets an environment variable""" - @abc.abstractmethod - def with_env_expression(self, name: str, value: ReferenceExpression) -> typing.Self: - """Adds an environment variable with a reference expression""" - @abc.abstractmethod def with_env_callback(self, callback: typing.Callable[[EnvironmentCallbackContext], None]) -> typing.Self: """Sets environment variables via callback""" - @abc.abstractmethod - def with_env_endpoint(self, name: str, endpoint_reference: EndpointReference) -> typing.Self: - """Sets an environment variable from an endpoint reference""" - - @abc.abstractmethod - def with_env_parameter(self, name: str, parameter: ParameterResource) -> typing.Self: - """Sets an environment variable from a parameter resource""" - - @abc.abstractmethod - def with_env_connection_string(self, env_var_name: str, resource: AbstractResourceWithConnectionString) -> typing.Self: - """Sets an environment variable from a connection string resource""" - @abc.abstractmethod def with_reference(self, source: AbstractResource, *, connection_name: str | None = None, optional: bool = False, name: str | None = None) -> typing.Self: """Adds a reference to another resource""" @@ -6049,12 +6033,8 @@ class ContainerResourceKwargs(_BaseResourceKwargs, total=False): mcp_server: McpServerParameters | typing.Literal[True] otlp_exporter: OtlpProtocol | typing.Literal[True] publish_as_connection_string: typing.Literal[True] - env: tuple[str, str] - env_expression: tuple[str, ReferenceExpression] + env: tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider] env_callback: typing.Callable[[EnvironmentCallbackContext], None] - env_endpoint: tuple[str, EndpointReference] - env_parameter: tuple[str, ParameterResource] - env_connection_string: tuple[str, AbstractResourceWithConnectionString] args: typing.Iterable[str] args_callback: typing.Callable[[CommandLineArgsCallbackContext], None] reference: AbstractResource | ReferenceParameters @@ -6312,7 +6292,7 @@ def publish_as_connection_string(self) -> typing.Self: self._handle = self._wrap_builder(result) return self - def with_env(self, name: str, value: str) -> typing.Self: + def with_env(self, name: str, value: str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider) -> typing.Self: """Sets an environment variable""" rpc_args: dict[str, typing.Any] = {'builder': self._handle} rpc_args['name'] = name @@ -6324,18 +6304,6 @@ def with_env(self, name: str, value: str) -> typing.Self: self._handle = self._wrap_builder(result) return self - def with_env_expression(self, name: str, value: ReferenceExpression) -> typing.Self: - """Adds an environment variable with a reference expression""" - rpc_args: dict[str, typing.Any] = {'builder': self._handle} - rpc_args['name'] = name - rpc_args['value'] = value - result = self._client.invoke_capability( - 'Aspire.Hosting/withEnvironmentExpression', - rpc_args, - ) - self._handle = self._wrap_builder(result) - return self - def with_env_callback(self, callback: typing.Callable[[EnvironmentCallbackContext], None]) -> typing.Self: """Sets environment variables via callback""" rpc_args: dict[str, typing.Any] = {'builder': self._handle} @@ -6347,42 +6315,6 @@ def with_env_callback(self, callback: typing.Callable[[EnvironmentCallbackContex self._handle = self._wrap_builder(result) return self - def with_env_endpoint(self, name: str, endpoint_reference: EndpointReference) -> typing.Self: - """Sets an environment variable from an endpoint reference""" - rpc_args: dict[str, typing.Any] = {'builder': self._handle} - rpc_args['name'] = name - rpc_args['endpointReference'] = endpoint_reference - result = self._client.invoke_capability( - 'Aspire.Hosting/withEnvironmentEndpoint', - rpc_args, - ) - self._handle = self._wrap_builder(result) - return self - - def with_env_parameter(self, name: str, parameter: ParameterResource) -> typing.Self: - """Sets an environment variable from a parameter resource""" - rpc_args: dict[str, typing.Any] = {'builder': self._handle} - rpc_args['name'] = name - rpc_args['parameter'] = parameter - result = self._client.invoke_capability( - 'Aspire.Hosting/withEnvironmentParameter', - rpc_args, - ) - self._handle = self._wrap_builder(result) - return self - - def with_env_connection_string(self, env_var_name: str, resource: AbstractResourceWithConnectionString) -> typing.Self: - """Sets an environment variable from a connection string resource""" - rpc_args: dict[str, typing.Any] = {'builder': self._handle} - rpc_args['envVarName'] = env_var_name - rpc_args['resource'] = resource - result = self._client.invoke_capability( - 'Aspire.Hosting/withEnvironmentConnectionString', - rpc_args, - ) - self._handle = self._wrap_builder(result) - return self - def with_args(self, args: typing.Iterable[str]) -> typing.Self: """Adds arguments""" rpc_args: dict[str, typing.Any] = {'builder': self._handle} @@ -6920,21 +6852,13 @@ def __init__(self, handle: Handle, client: AspireClient, **kwargs: typing.Unpack else: raise TypeError("Invalid type for option 'publish_as_connection_string'. Expected: Literal[True]") if _env := kwargs.pop("env", None): - if _validate_tuple_types(_env, (str, str)): + if _validate_tuple_types(_env, (str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider)): rpc_args: dict[str, typing.Any] = {"builder": handle} - rpc_args["name"] = typing.cast(tuple[str, str], _env)[0] - rpc_args["value"] = typing.cast(tuple[str, str], _env)[1] + rpc_args["name"] = typing.cast(tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider], _env)[0] + rpc_args["value"] = typing.cast(tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider], _env)[1] handle = self._wrap_builder(client.invoke_capability('Aspire.Hosting/withEnvironment', rpc_args)) else: - raise TypeError("Invalid type for option 'env'. Expected: (str, str)") - if _env_expression := kwargs.pop("env_expression", None): - if _validate_tuple_types(_env_expression, (str, ReferenceExpression)): - rpc_args: dict[str, typing.Any] = {"builder": handle} - rpc_args["name"] = typing.cast(tuple[str, ReferenceExpression], _env_expression)[0] - rpc_args["value"] = typing.cast(tuple[str, ReferenceExpression], _env_expression)[1] - handle = self._wrap_builder(client.invoke_capability('Aspire.Hosting/withEnvironmentExpression', rpc_args)) - else: - raise TypeError("Invalid type for option 'env_expression'. Expected: (str, ReferenceExpression)") + raise TypeError("Invalid type for option 'env'. Expected: (str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider)") if _env_callback := kwargs.pop("env_callback", None): if _validate_type(_env_callback, typing.Callable[[EnvironmentCallbackContext], None]): rpc_args: dict[str, typing.Any] = {"builder": handle} @@ -6942,30 +6866,6 @@ def __init__(self, handle: Handle, client: AspireClient, **kwargs: typing.Unpack handle = self._wrap_builder(client.invoke_capability('Aspire.Hosting/withEnvironmentCallback', rpc_args)) else: raise TypeError("Invalid type for option 'env_callback'. Expected: Callable[[EnvironmentCallbackContext], None]") - if _env_endpoint := kwargs.pop("env_endpoint", None): - if _validate_tuple_types(_env_endpoint, (str, EndpointReference)): - rpc_args: dict[str, typing.Any] = {"builder": handle} - rpc_args["name"] = typing.cast(tuple[str, EndpointReference], _env_endpoint)[0] - rpc_args["endpointReference"] = typing.cast(tuple[str, EndpointReference], _env_endpoint)[1] - handle = self._wrap_builder(client.invoke_capability('Aspire.Hosting/withEnvironmentEndpoint', rpc_args)) - else: - raise TypeError("Invalid type for option 'env_endpoint'. Expected: (str, EndpointReference)") - if _env_parameter := kwargs.pop("env_parameter", None): - if _validate_tuple_types(_env_parameter, (str, ParameterResource)): - rpc_args: dict[str, typing.Any] = {"builder": handle} - rpc_args["name"] = typing.cast(tuple[str, ParameterResource], _env_parameter)[0] - rpc_args["parameter"] = typing.cast(tuple[str, ParameterResource], _env_parameter)[1] - handle = self._wrap_builder(client.invoke_capability('Aspire.Hosting/withEnvironmentParameter', rpc_args)) - else: - raise TypeError("Invalid type for option 'env_parameter'. Expected: (str, ParameterResource)") - if _env_connection_string := kwargs.pop("env_connection_string", None): - if _validate_tuple_types(_env_connection_string, (str, AbstractResourceWithConnectionString)): - rpc_args: dict[str, typing.Any] = {"builder": handle} - rpc_args["envVarName"] = typing.cast(tuple[str, AbstractResourceWithConnectionString], _env_connection_string)[0] - rpc_args["resource"] = typing.cast(tuple[str, AbstractResourceWithConnectionString], _env_connection_string)[1] - handle = self._wrap_builder(client.invoke_capability('Aspire.Hosting/withEnvironmentConnectionString', rpc_args)) - else: - raise TypeError("Invalid type for option 'env_connection_string'. Expected: (str, AbstractResourceWithConnectionString)") if _args := kwargs.pop("args", None): if _validate_type(_args, typing.Iterable[str]): rpc_args: dict[str, typing.Any] = {"builder": handle} @@ -7236,12 +7136,8 @@ class ProjectResourceKwargs(_BaseResourceKwargs, total=False): replicas: int disable_forwarded_headers: typing.Literal[True] publish_as_docker_file: typing.Callable[[ContainerResource], None] | typing.Literal[True] - env: tuple[str, str] - env_expression: tuple[str, ReferenceExpression] + env: tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider] env_callback: typing.Callable[[EnvironmentCallbackContext], None] - env_endpoint: tuple[str, EndpointReference] - env_parameter: tuple[str, ParameterResource] - env_connection_string: tuple[str, AbstractResourceWithConnectionString] args: typing.Iterable[str] args_callback: typing.Callable[[CommandLineArgsCallbackContext], None] reference: AbstractResource | ReferenceParameters @@ -7336,7 +7232,7 @@ def publish_as_docker_file(self, *, configure: typing.Callable[[ContainerResourc self._handle = self._wrap_builder(result) return self - def with_env(self, name: str, value: str) -> typing.Self: + def with_env(self, name: str, value: str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider) -> typing.Self: """Sets an environment variable""" rpc_args: dict[str, typing.Any] = {'builder': self._handle} rpc_args['name'] = name @@ -7348,18 +7244,6 @@ def with_env(self, name: str, value: str) -> typing.Self: self._handle = self._wrap_builder(result) return self - def with_env_expression(self, name: str, value: ReferenceExpression) -> typing.Self: - """Adds an environment variable with a reference expression""" - rpc_args: dict[str, typing.Any] = {'builder': self._handle} - rpc_args['name'] = name - rpc_args['value'] = value - result = self._client.invoke_capability( - 'Aspire.Hosting/withEnvironmentExpression', - rpc_args, - ) - self._handle = self._wrap_builder(result) - return self - def with_env_callback(self, callback: typing.Callable[[EnvironmentCallbackContext], None]) -> typing.Self: """Sets environment variables via callback""" rpc_args: dict[str, typing.Any] = {'builder': self._handle} @@ -7371,42 +7255,6 @@ def with_env_callback(self, callback: typing.Callable[[EnvironmentCallbackContex self._handle = self._wrap_builder(result) return self - def with_env_endpoint(self, name: str, endpoint_reference: EndpointReference) -> typing.Self: - """Sets an environment variable from an endpoint reference""" - rpc_args: dict[str, typing.Any] = {'builder': self._handle} - rpc_args['name'] = name - rpc_args['endpointReference'] = endpoint_reference - result = self._client.invoke_capability( - 'Aspire.Hosting/withEnvironmentEndpoint', - rpc_args, - ) - self._handle = self._wrap_builder(result) - return self - - def with_env_parameter(self, name: str, parameter: ParameterResource) -> typing.Self: - """Sets an environment variable from a parameter resource""" - rpc_args: dict[str, typing.Any] = {'builder': self._handle} - rpc_args['name'] = name - rpc_args['parameter'] = parameter - result = self._client.invoke_capability( - 'Aspire.Hosting/withEnvironmentParameter', - rpc_args, - ) - self._handle = self._wrap_builder(result) - return self - - def with_env_connection_string(self, env_var_name: str, resource: AbstractResourceWithConnectionString) -> typing.Self: - """Sets an environment variable from a connection string resource""" - rpc_args: dict[str, typing.Any] = {'builder': self._handle} - rpc_args['envVarName'] = env_var_name - rpc_args['resource'] = resource - result = self._client.invoke_capability( - 'Aspire.Hosting/withEnvironmentConnectionString', - rpc_args, - ) - self._handle = self._wrap_builder(result) - return self - def with_args(self, args: typing.Iterable[str]) -> typing.Self: """Adds arguments""" rpc_args: dict[str, typing.Any] = {'builder': self._handle} @@ -7827,21 +7675,13 @@ def __init__(self, handle: Handle, client: AspireClient, **kwargs: typing.Unpack else: raise TypeError("Invalid type for option 'publish_as_docker_file'. Expected: Callable[[ContainerResource], None] or Literal[True]") if _env := kwargs.pop("env", None): - if _validate_tuple_types(_env, (str, str)): + if _validate_tuple_types(_env, (str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider)): rpc_args: dict[str, typing.Any] = {"builder": handle} - rpc_args["name"] = typing.cast(tuple[str, str], _env)[0] - rpc_args["value"] = typing.cast(tuple[str, str], _env)[1] + rpc_args["name"] = typing.cast(tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider], _env)[0] + rpc_args["value"] = typing.cast(tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider], _env)[1] handle = self._wrap_builder(client.invoke_capability('Aspire.Hosting/withEnvironment', rpc_args)) else: - raise TypeError("Invalid type for option 'env'. Expected: (str, str)") - if _env_expression := kwargs.pop("env_expression", None): - if _validate_tuple_types(_env_expression, (str, ReferenceExpression)): - rpc_args: dict[str, typing.Any] = {"builder": handle} - rpc_args["name"] = typing.cast(tuple[str, ReferenceExpression], _env_expression)[0] - rpc_args["value"] = typing.cast(tuple[str, ReferenceExpression], _env_expression)[1] - handle = self._wrap_builder(client.invoke_capability('Aspire.Hosting/withEnvironmentExpression', rpc_args)) - else: - raise TypeError("Invalid type for option 'env_expression'. Expected: (str, ReferenceExpression)") + raise TypeError("Invalid type for option 'env'. Expected: (str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider)") if _env_callback := kwargs.pop("env_callback", None): if _validate_type(_env_callback, typing.Callable[[EnvironmentCallbackContext], None]): rpc_args: dict[str, typing.Any] = {"builder": handle} @@ -7849,30 +7689,6 @@ def __init__(self, handle: Handle, client: AspireClient, **kwargs: typing.Unpack handle = self._wrap_builder(client.invoke_capability('Aspire.Hosting/withEnvironmentCallback', rpc_args)) else: raise TypeError("Invalid type for option 'env_callback'. Expected: Callable[[EnvironmentCallbackContext], None]") - if _env_endpoint := kwargs.pop("env_endpoint", None): - if _validate_tuple_types(_env_endpoint, (str, EndpointReference)): - rpc_args: dict[str, typing.Any] = {"builder": handle} - rpc_args["name"] = typing.cast(tuple[str, EndpointReference], _env_endpoint)[0] - rpc_args["endpointReference"] = typing.cast(tuple[str, EndpointReference], _env_endpoint)[1] - handle = self._wrap_builder(client.invoke_capability('Aspire.Hosting/withEnvironmentEndpoint', rpc_args)) - else: - raise TypeError("Invalid type for option 'env_endpoint'. Expected: (str, EndpointReference)") - if _env_parameter := kwargs.pop("env_parameter", None): - if _validate_tuple_types(_env_parameter, (str, ParameterResource)): - rpc_args: dict[str, typing.Any] = {"builder": handle} - rpc_args["name"] = typing.cast(tuple[str, ParameterResource], _env_parameter)[0] - rpc_args["parameter"] = typing.cast(tuple[str, ParameterResource], _env_parameter)[1] - handle = self._wrap_builder(client.invoke_capability('Aspire.Hosting/withEnvironmentParameter', rpc_args)) - else: - raise TypeError("Invalid type for option 'env_parameter'. Expected: (str, ParameterResource)") - if _env_connection_string := kwargs.pop("env_connection_string", None): - if _validate_tuple_types(_env_connection_string, (str, AbstractResourceWithConnectionString)): - rpc_args: dict[str, typing.Any] = {"builder": handle} - rpc_args["envVarName"] = typing.cast(tuple[str, AbstractResourceWithConnectionString], _env_connection_string)[0] - rpc_args["resource"] = typing.cast(tuple[str, AbstractResourceWithConnectionString], _env_connection_string)[1] - handle = self._wrap_builder(client.invoke_capability('Aspire.Hosting/withEnvironmentConnectionString', rpc_args)) - else: - raise TypeError("Invalid type for option 'env_connection_string'. Expected: (str, AbstractResourceWithConnectionString)") if _args := kwargs.pop("args", None): if _validate_type(_args, typing.Iterable[str]): rpc_args: dict[str, typing.Any] = {"builder": handle} @@ -8152,12 +7968,8 @@ class ExecutableResourceKwargs(_BaseResourceKwargs, total=False): working_dir: str mcp_server: McpServerParameters | typing.Literal[True] otlp_exporter: OtlpProtocol | typing.Literal[True] - env: tuple[str, str] - env_expression: tuple[str, ReferenceExpression] + env: tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider] env_callback: typing.Callable[[EnvironmentCallbackContext], None] - env_endpoint: tuple[str, EndpointReference] - env_parameter: tuple[str, ParameterResource] - env_connection_string: tuple[str, AbstractResourceWithConnectionString] args: typing.Iterable[str] args_callback: typing.Callable[[CommandLineArgsCallbackContext], None] reference: AbstractResource | ReferenceParameters @@ -8253,7 +8065,7 @@ def with_otlp_exporter(self, *, protocol: OtlpProtocol | None = None) -> typing. self._handle = self._wrap_builder(result) return self - def with_env(self, name: str, value: str) -> typing.Self: + def with_env(self, name: str, value: str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider) -> typing.Self: """Sets an environment variable""" rpc_args: dict[str, typing.Any] = {'builder': self._handle} rpc_args['name'] = name @@ -8265,18 +8077,6 @@ def with_env(self, name: str, value: str) -> typing.Self: self._handle = self._wrap_builder(result) return self - def with_env_expression(self, name: str, value: ReferenceExpression) -> typing.Self: - """Adds an environment variable with a reference expression""" - rpc_args: dict[str, typing.Any] = {'builder': self._handle} - rpc_args['name'] = name - rpc_args['value'] = value - result = self._client.invoke_capability( - 'Aspire.Hosting/withEnvironmentExpression', - rpc_args, - ) - self._handle = self._wrap_builder(result) - return self - def with_env_callback(self, callback: typing.Callable[[EnvironmentCallbackContext], None]) -> typing.Self: """Sets environment variables via callback""" rpc_args: dict[str, typing.Any] = {'builder': self._handle} @@ -8288,42 +8088,6 @@ def with_env_callback(self, callback: typing.Callable[[EnvironmentCallbackContex self._handle = self._wrap_builder(result) return self - def with_env_endpoint(self, name: str, endpoint_reference: EndpointReference) -> typing.Self: - """Sets an environment variable from an endpoint reference""" - rpc_args: dict[str, typing.Any] = {'builder': self._handle} - rpc_args['name'] = name - rpc_args['endpointReference'] = endpoint_reference - result = self._client.invoke_capability( - 'Aspire.Hosting/withEnvironmentEndpoint', - rpc_args, - ) - self._handle = self._wrap_builder(result) - return self - - def with_env_parameter(self, name: str, parameter: ParameterResource) -> typing.Self: - """Sets an environment variable from a parameter resource""" - rpc_args: dict[str, typing.Any] = {'builder': self._handle} - rpc_args['name'] = name - rpc_args['parameter'] = parameter - result = self._client.invoke_capability( - 'Aspire.Hosting/withEnvironmentParameter', - rpc_args, - ) - self._handle = self._wrap_builder(result) - return self - - def with_env_connection_string(self, env_var_name: str, resource: AbstractResourceWithConnectionString) -> typing.Self: - """Sets an environment variable from a connection string resource""" - rpc_args: dict[str, typing.Any] = {'builder': self._handle} - rpc_args['envVarName'] = env_var_name - rpc_args['resource'] = resource - result = self._client.invoke_capability( - 'Aspire.Hosting/withEnvironmentConnectionString', - rpc_args, - ) - self._handle = self._wrap_builder(result) - return self - def with_args(self, args: typing.Iterable[str]) -> typing.Self: """Adds arguments""" rpc_args: dict[str, typing.Any] = {'builder': self._handle} @@ -8733,21 +8497,13 @@ def __init__(self, handle: Handle, client: AspireClient, **kwargs: typing.Unpack else: raise TypeError("Invalid type for option 'otlp_exporter'. Expected: OtlpProtocol or Literal[True]") if _env := kwargs.pop("env", None): - if _validate_tuple_types(_env, (str, str)): + if _validate_tuple_types(_env, (str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider)): rpc_args: dict[str, typing.Any] = {"builder": handle} - rpc_args["name"] = typing.cast(tuple[str, str], _env)[0] - rpc_args["value"] = typing.cast(tuple[str, str], _env)[1] + rpc_args["name"] = typing.cast(tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider], _env)[0] + rpc_args["value"] = typing.cast(tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider], _env)[1] handle = self._wrap_builder(client.invoke_capability('Aspire.Hosting/withEnvironment', rpc_args)) else: - raise TypeError("Invalid type for option 'env'. Expected: (str, str)") - if _env_expression := kwargs.pop("env_expression", None): - if _validate_tuple_types(_env_expression, (str, ReferenceExpression)): - rpc_args: dict[str, typing.Any] = {"builder": handle} - rpc_args["name"] = typing.cast(tuple[str, ReferenceExpression], _env_expression)[0] - rpc_args["value"] = typing.cast(tuple[str, ReferenceExpression], _env_expression)[1] - handle = self._wrap_builder(client.invoke_capability('Aspire.Hosting/withEnvironmentExpression', rpc_args)) - else: - raise TypeError("Invalid type for option 'env_expression'. Expected: (str, ReferenceExpression)") + raise TypeError("Invalid type for option 'env'. Expected: (str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider)") if _env_callback := kwargs.pop("env_callback", None): if _validate_type(_env_callback, typing.Callable[[EnvironmentCallbackContext], None]): rpc_args: dict[str, typing.Any] = {"builder": handle} @@ -8755,30 +8511,6 @@ def __init__(self, handle: Handle, client: AspireClient, **kwargs: typing.Unpack handle = self._wrap_builder(client.invoke_capability('Aspire.Hosting/withEnvironmentCallback', rpc_args)) else: raise TypeError("Invalid type for option 'env_callback'. Expected: Callable[[EnvironmentCallbackContext], None]") - if _env_endpoint := kwargs.pop("env_endpoint", None): - if _validate_tuple_types(_env_endpoint, (str, EndpointReference)): - rpc_args: dict[str, typing.Any] = {"builder": handle} - rpc_args["name"] = typing.cast(tuple[str, EndpointReference], _env_endpoint)[0] - rpc_args["endpointReference"] = typing.cast(tuple[str, EndpointReference], _env_endpoint)[1] - handle = self._wrap_builder(client.invoke_capability('Aspire.Hosting/withEnvironmentEndpoint', rpc_args)) - else: - raise TypeError("Invalid type for option 'env_endpoint'. Expected: (str, EndpointReference)") - if _env_parameter := kwargs.pop("env_parameter", None): - if _validate_tuple_types(_env_parameter, (str, ParameterResource)): - rpc_args: dict[str, typing.Any] = {"builder": handle} - rpc_args["name"] = typing.cast(tuple[str, ParameterResource], _env_parameter)[0] - rpc_args["parameter"] = typing.cast(tuple[str, ParameterResource], _env_parameter)[1] - handle = self._wrap_builder(client.invoke_capability('Aspire.Hosting/withEnvironmentParameter', rpc_args)) - else: - raise TypeError("Invalid type for option 'env_parameter'. Expected: (str, ParameterResource)") - if _env_connection_string := kwargs.pop("env_connection_string", None): - if _validate_tuple_types(_env_connection_string, (str, AbstractResourceWithConnectionString)): - rpc_args: dict[str, typing.Any] = {"builder": handle} - rpc_args["envVarName"] = typing.cast(tuple[str, AbstractResourceWithConnectionString], _env_connection_string)[0] - rpc_args["resource"] = typing.cast(tuple[str, AbstractResourceWithConnectionString], _env_connection_string)[1] - handle = self._wrap_builder(client.invoke_capability('Aspire.Hosting/withEnvironmentConnectionString', rpc_args)) - else: - raise TypeError("Invalid type for option 'env_connection_string'. Expected: (str, AbstractResourceWithConnectionString)") if _args := kwargs.pop("args", None): if _validate_type(_args, typing.Iterable[str]): rpc_args: dict[str, typing.Any] = {"builder": handle} From 5acf422bc7386a0fe243ca10be1f560a88f4d5c6 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Fri, 27 Mar 2026 12:50:26 -0700 Subject: [PATCH 3/5] Tighten ATS withEnvironment contract Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../IAzureKeyVaultSecretReference.cs | 2 +- .../api/Aspire.Hosting.SqlServer.ats.txt | 5 +-- .../ApplicationModel/IEnvironmentValue.cs | 16 ++++++++ .../IManifestExpressionProvider.cs | 1 - .../ApplicationModel/IValueProvider.cs | 1 - .../IValueWithCustomWithEnvironment.cs | 6 +-- .../ResourceBuilderExtensions.cs | 39 +++++++++++------- .../api/Aspire.Hosting.Capabilities.txt | 5 +-- ...TwoPassScanningGeneratedAspire.verified.py | 41 ++++++++++--------- 9 files changed, 70 insertions(+), 46 deletions(-) create mode 100644 src/Aspire.Hosting/ApplicationModel/IEnvironmentValue.cs diff --git a/src/Aspire.Hosting.Azure/IAzureKeyVaultSecretReference.cs b/src/Aspire.Hosting.Azure/IAzureKeyVaultSecretReference.cs index d3ab69e325f..89d98fcb8a9 100644 --- a/src/Aspire.Hosting.Azure/IAzureKeyVaultSecretReference.cs +++ b/src/Aspire.Hosting.Azure/IAzureKeyVaultSecretReference.cs @@ -9,7 +9,7 @@ namespace Aspire.Hosting.Azure; /// Represents a reference to a secret in an Azure Key Vault resource. /// [AspireExport] -public interface IAzureKeyVaultSecretReference : IValueProvider, IManifestExpressionProvider, IValueWithReferences +public interface IAzureKeyVaultSecretReference : IEnvironmentValue, IValueWithReferences { /// /// Gets the name of the secret. diff --git a/src/Aspire.Hosting.SqlServer/api/Aspire.Hosting.SqlServer.ats.txt b/src/Aspire.Hosting.SqlServer/api/Aspire.Hosting.SqlServer.ats.txt index acb99dc241e..9460a0b2f2b 100644 --- a/src/Aspire.Hosting.SqlServer/api/Aspire.Hosting.SqlServer.ats.txt +++ b/src/Aspire.Hosting.SqlServer/api/Aspire.Hosting.SqlServer.ats.txt @@ -19,7 +19,7 @@ Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReferenceExpression [Expo Aspire.Hosting/Aspire.Hosting.ApplicationModel.EnvironmentCallbackContext [ExposeProperties] Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecutableResource Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext [ExposeProperties] -Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider [interface] +Aspire.Hosting/Aspire.Hosting.ApplicationModel.IEnvironmentValue [interface] Aspire.Hosting/Aspire.Hosting.ApplicationModel.InitializeResourceEvent [ExposeProperties] Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource [interface] Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithArgs [interface] @@ -28,7 +28,6 @@ Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEndpoints [interface Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment [interface] Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithParent [interface] Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithWaitSupport [interface] -Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider [interface] Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource Aspire.Hosting/Aspire.Hosting.ApplicationModel.ProjectResource Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpression @@ -417,7 +416,7 @@ Aspire.Hosting/withDockerfileBaseImage(buildImage?: string, runtimeImage?: strin Aspire.Hosting/withEndpoint(port?: number, targetPort?: number, scheme?: string, name?: string, env?: string, isProxied?: boolean, isExternal?: boolean, protocol?: enum:System.Net.Sockets.ProtocolType) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEndpoints Aspire.Hosting/withEndpointProxySupport(proxyEnabled: boolean) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerResource Aspire.Hosting/withEntrypoint(entrypoint: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerResource -Aspire.Hosting/withEnvironment(name: string, value: string|Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpression|Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference|Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource|Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithConnectionString|Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment +Aspire.Hosting/withEnvironment(name: string, value: string|Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpression|Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference|Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource|Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithConnectionString|Aspire.Hosting/Aspire.Hosting.ApplicationModel.IEnvironmentValue) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment Aspire.Hosting/withEnvironmentCallback(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment Aspire.Hosting/withExecutableCommand(command: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecutableResource Aspire.Hosting/withExplicitStart() -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource diff --git a/src/Aspire.Hosting/ApplicationModel/IEnvironmentValue.cs b/src/Aspire.Hosting/ApplicationModel/IEnvironmentValue.cs new file mode 100644 index 00000000000..60bee96a945 --- /dev/null +++ b/src/Aspire.Hosting/ApplicationModel/IEnvironmentValue.cs @@ -0,0 +1,16 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +namespace Aspire.Hosting.ApplicationModel; + +/// +/// Represents a value that can be used with WithEnvironment. +/// +/// +/// Environment values provide both the runtime value used during local execution and +/// the manifest expression used during publish operations. +/// +[AspireExport] +public interface IEnvironmentValue : IValueProvider, IManifestExpressionProvider +{ +} diff --git a/src/Aspire.Hosting/ApplicationModel/IManifestExpressionProvider.cs b/src/Aspire.Hosting/ApplicationModel/IManifestExpressionProvider.cs index e073471d3a8..08905ea768a 100644 --- a/src/Aspire.Hosting/ApplicationModel/IManifestExpressionProvider.cs +++ b/src/Aspire.Hosting/ApplicationModel/IManifestExpressionProvider.cs @@ -6,7 +6,6 @@ namespace Aspire.Hosting.ApplicationModel; /// /// An interface that allows an object to express how it should be represented in a manifest. /// -[AspireExport] public interface IManifestExpressionProvider { /// diff --git a/src/Aspire.Hosting/ApplicationModel/IValueProvider.cs b/src/Aspire.Hosting/ApplicationModel/IValueProvider.cs index 232e4bc6bbe..afc80841c28 100644 --- a/src/Aspire.Hosting/ApplicationModel/IValueProvider.cs +++ b/src/Aspire.Hosting/ApplicationModel/IValueProvider.cs @@ -27,7 +27,6 @@ public class ValueProviderContext /// /// An interface that allows the value to be provided for an environment variable. /// -[AspireExport] public interface IValueProvider { /// diff --git a/src/Aspire.Hosting/ApplicationModel/IValueWithCustomWithEnvironment.cs b/src/Aspire.Hosting/ApplicationModel/IValueWithCustomWithEnvironment.cs index c7089259622..f2fe074b5a3 100644 --- a/src/Aspire.Hosting/ApplicationModel/IValueWithCustomWithEnvironment.cs +++ b/src/Aspire.Hosting/ApplicationModel/IValueWithCustomWithEnvironment.cs @@ -13,11 +13,11 @@ namespace Aspire.Hosting.ApplicationModel; /// This contract is used by the internal ATS-visible withEnvironment dispatcher /// to route environment values to type-specific logic at runtime. Implementations may /// customize dispatch when a value needs behavior that differs from the default -/// and handling. +/// handling. /// [Experimental("ASPIREATS001")] -public interface IValueWithCustomWithEnvironment : IValueProvider, IManifestExpressionProvider - where TSelf : IValueProvider, IManifestExpressionProvider, IValueWithCustomWithEnvironment +public interface IValueWithCustomWithEnvironment : IEnvironmentValue + where TSelf : IEnvironmentValue, IValueWithCustomWithEnvironment { /// /// Applies an environment value to using value-specific behavior. diff --git a/src/Aspire.Hosting/ResourceBuilderExtensions.cs b/src/Aspire.Hosting/ResourceBuilderExtensions.cs index f8551ab01eb..82cf9712540 100644 --- a/src/Aspire.Hosting/ResourceBuilderExtensions.cs +++ b/src/Aspire.Hosting/ResourceBuilderExtensions.cs @@ -6,6 +6,7 @@ using System.Reflection; using System.Runtime.CompilerServices; using System.Security.Cryptography.X509Certificates; +using System.Collections.Concurrent; using Aspire.Dashboard.Model; using Aspire.Hosting.ApplicationModel; using Aspire.Hosting.Publishing; @@ -22,6 +23,7 @@ namespace Aspire.Hosting; public static class ResourceBuilderExtensions { private const string ConnectionStringEnvironmentName = "ConnectionStrings__"; + private static readonly ConcurrentDictionary<(Type DestinationType, Type CustomType), MethodInfo?> s_customWithEnvironmentDispatchMethods = new(); private static readonly MethodInfo s_dispatchCustomWithEnvironmentMethod = typeof(ResourceBuilderExtensions).GetMethod(nameof(DispatchCustomWithEnvironment), BindingFlags.NonPublic | BindingFlags.Static)!; private static readonly MethodInfo s_dispatchCustomWithReferenceMethod = typeof(ResourceBuilderExtensions).GetMethod(nameof(DispatchCustomWithReference), BindingFlags.NonPublic | BindingFlags.Static)!; @@ -52,7 +54,7 @@ internal static IResourceBuilder WithEnvironment( typeof(EndpointReference), typeof(IResourceBuilder), typeof(IResourceBuilder), - typeof(IValueProvider))] + typeof(IEnvironmentValue))] object value) where T : IResourceWithEnvironment { @@ -68,9 +70,11 @@ internal static IResourceBuilder WithEnvironment( return value switch { string stringValue => builder.WithEnvironment(name, stringValue), + ReferenceExpression expression => builder.WithEnvironment(name, expression), + EndpointReference endpointReference => builder.WithEnvironment(name, endpointReference), IResourceBuilder parameter => builder.WithEnvironment(name, parameter), IResourceBuilder connectionStringResource => builder.WithEnvironment(name, connectionStringResource), - IValueProvider valueProvider when value is IManifestExpressionProvider manifestExpressionProvider => builder.WithEnvironmentValue(name, manifestExpressionProvider, valueProvider), + IEnvironmentValue environmentValue => builder.WithEnvironmentValue(name, environmentValue), _ => throw new InvalidOperationException( $"The value '{value.GetType().FullName}' can't be used with withEnvironment because it doesn't provide a supported environment value.") }; @@ -311,23 +315,21 @@ public static IResourceBuilder WithEnvironment( private static IResourceBuilder WithEnvironmentValue( this IResourceBuilder builder, string name, - IManifestExpressionProvider manifestExpressionProvider, - IValueProvider valueProvider) + IEnvironmentValue value) where T : IResourceWithEnvironment { ArgumentNullException.ThrowIfNull(builder); ArgumentNullException.ThrowIfNull(name); - ArgumentNullException.ThrowIfNull(manifestExpressionProvider); - ArgumentNullException.ThrowIfNull(valueProvider); + ArgumentNullException.ThrowIfNull(value); - if (valueProvider is IValueWithReferences valueWithReferences) + if (value is IValueWithReferences valueWithReferences) { WalkAndLinkResourceReferences(builder, valueWithReferences.References); } return builder.WithEnvironment(context => { - context.EnvironmentVariables[name] = valueProvider; + context.EnvironmentVariables[name] = value; }); } @@ -370,18 +372,25 @@ private static bool TryDispatchCustomWithEnvironment( where TDestination : IResourceWithEnvironment { var customType = value.GetType(); - var customWithEnvironmentInterface = customType.GetInterfaces() - .FirstOrDefault(i => i.IsGenericType - && i.GetGenericTypeDefinition() == typeof(IValueWithCustomWithEnvironment<>) - && i.GetGenericArguments()[0] == customType); + var destinationType = typeof(TDestination); + var dispatchMethod = s_customWithEnvironmentDispatchMethods.GetOrAdd((destinationType, customType), key => + { + var customWithEnvironmentInterface = key.CustomType.GetInterfaces() + .FirstOrDefault(i => i.IsGenericType + && i.GetGenericTypeDefinition() == typeof(IValueWithCustomWithEnvironment<>) + && i.GetGenericArguments()[0] == key.CustomType); + + return customWithEnvironmentInterface is null + ? null + : s_dispatchCustomWithEnvironmentMethod.MakeGenericMethod(key.DestinationType, key.CustomType); + }); - if (customWithEnvironmentInterface is null) + if (dispatchMethod is null) { dispatchedBuilder = null; return false; } - var dispatchMethod = s_dispatchCustomWithEnvironmentMethod.MakeGenericMethod(typeof(TDestination), customType); dispatchedBuilder = (IResourceBuilder?)dispatchMethod.Invoke(null, [builder, name, value]); return dispatchedBuilder is not null; } @@ -391,7 +400,7 @@ private static bool TryDispatchCustomWithEnvironment( string name, TCustom value) where TDestination : IResourceWithEnvironment - where TCustom : IValueProvider, IManifestExpressionProvider, IValueWithCustomWithEnvironment + where TCustom : IEnvironmentValue, IValueWithCustomWithEnvironment { return TCustom.TryWithEnvironment(builder, name, value); } diff --git a/src/Aspire.Hosting/api/Aspire.Hosting.Capabilities.txt b/src/Aspire.Hosting/api/Aspire.Hosting.Capabilities.txt index e3bf3d2bb9d..d30e52f742a 100644 --- a/src/Aspire.Hosting/api/Aspire.Hosting.Capabilities.txt +++ b/src/Aspire.Hosting/api/Aspire.Hosting.Capabilities.txt @@ -17,7 +17,7 @@ Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReferenceExpression [Expo Aspire.Hosting/Aspire.Hosting.ApplicationModel.EnvironmentCallbackContext [ExposeProperties] Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecutableResource Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecuteCommandContext [ExposeProperties] -Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider [interface] +Aspire.Hosting/Aspire.Hosting.ApplicationModel.IEnvironmentValue [interface] Aspire.Hosting/Aspire.Hosting.ApplicationModel.InitializeResourceEvent [ExposeProperties] Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource [interface] Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithArgs [interface] @@ -26,7 +26,6 @@ Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEndpoints [interface Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment [interface] Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithParent [interface] Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithWaitSupport [interface] -Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider [interface] Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource Aspire.Hosting/Aspire.Hosting.ApplicationModel.ProjectResource Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpression @@ -387,7 +386,7 @@ Aspire.Hosting/withDockerfileBaseImage(buildImage?: string, runtimeImage?: strin Aspire.Hosting/withEndpoint(port?: number, targetPort?: number, scheme?: string, name?: string, env?: string, isProxied?: boolean, isExternal?: boolean, protocol?: enum:System.Net.Sockets.ProtocolType) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEndpoints Aspire.Hosting/withEndpointProxySupport(proxyEnabled: boolean) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerResource Aspire.Hosting/withEntrypoint(entrypoint: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ContainerResource -Aspire.Hosting/withEnvironment(name: string, value: string|Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpression|Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference|Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource|Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithConnectionString|Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment +Aspire.Hosting/withEnvironment(name: string, value: string|Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpression|Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReference|Aspire.Hosting/Aspire.Hosting.ApplicationModel.ParameterResource|Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithConnectionString|Aspire.Hosting/Aspire.Hosting.ApplicationModel.IEnvironmentValue) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment Aspire.Hosting/withEnvironmentCallback(callback: callback) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment Aspire.Hosting/withExecutableCommand(command: string) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.ExecutableResource Aspire.Hosting/withExplicitStart() -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource diff --git a/tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.py b/tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.py index 08a9209abb9..8e9aebee1e3 100644 --- a/tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.py +++ b/tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.py @@ -2203,6 +2203,9 @@ def unsubscribe(self, subscription: DistributedApplicationEventSubscription) -> class AbstractDistributedApplicationResourceEvent(abc.ABC): """Abstract base class for AbstractDistributedApplicationResourceEvent.""" +class AbstractEnvironmentValue(abc.ABC): + """Abstract base class for AbstractEnvironmentValue.""" + class AbstractHostEnvironment: """Type class for AbstractHostEnvironment.""" @@ -4845,7 +4848,7 @@ def with_otlp_exporter(self, *, protocol: OtlpProtocol | None = None) -> typing. """Configures OTLP telemetry export""" @abc.abstractmethod - def with_env(self, name: str, value: str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider) -> typing.Self: + def with_env(self, name: str, value: str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractEnvironmentValue) -> typing.Self: """Sets an environment variable""" @abc.abstractmethod @@ -6033,7 +6036,7 @@ class ContainerResourceKwargs(_BaseResourceKwargs, total=False): mcp_server: McpServerParameters | typing.Literal[True] otlp_exporter: OtlpProtocol | typing.Literal[True] publish_as_connection_string: typing.Literal[True] - env: tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider] + env: tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractEnvironmentValue] env_callback: typing.Callable[[EnvironmentCallbackContext], None] args: typing.Iterable[str] args_callback: typing.Callable[[CommandLineArgsCallbackContext], None] @@ -6292,7 +6295,7 @@ def publish_as_connection_string(self) -> typing.Self: self._handle = self._wrap_builder(result) return self - def with_env(self, name: str, value: str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider) -> typing.Self: + def with_env(self, name: str, value: str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractEnvironmentValue) -> typing.Self: """Sets an environment variable""" rpc_args: dict[str, typing.Any] = {'builder': self._handle} rpc_args['name'] = name @@ -6852,13 +6855,13 @@ def __init__(self, handle: Handle, client: AspireClient, **kwargs: typing.Unpack else: raise TypeError("Invalid type for option 'publish_as_connection_string'. Expected: Literal[True]") if _env := kwargs.pop("env", None): - if _validate_tuple_types(_env, (str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider)): + if _validate_tuple_types(_env, (str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractEnvironmentValue)): rpc_args: dict[str, typing.Any] = {"builder": handle} - rpc_args["name"] = typing.cast(tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider], _env)[0] - rpc_args["value"] = typing.cast(tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider], _env)[1] + rpc_args["name"] = typing.cast(tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractEnvironmentValue], _env)[0] + rpc_args["value"] = typing.cast(tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractEnvironmentValue], _env)[1] handle = self._wrap_builder(client.invoke_capability('Aspire.Hosting/withEnvironment', rpc_args)) else: - raise TypeError("Invalid type for option 'env'. Expected: (str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider)") + raise TypeError("Invalid type for option 'env'. Expected: (str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractEnvironmentValue)") if _env_callback := kwargs.pop("env_callback", None): if _validate_type(_env_callback, typing.Callable[[EnvironmentCallbackContext], None]): rpc_args: dict[str, typing.Any] = {"builder": handle} @@ -7136,7 +7139,7 @@ class ProjectResourceKwargs(_BaseResourceKwargs, total=False): replicas: int disable_forwarded_headers: typing.Literal[True] publish_as_docker_file: typing.Callable[[ContainerResource], None] | typing.Literal[True] - env: tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider] + env: tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractEnvironmentValue] env_callback: typing.Callable[[EnvironmentCallbackContext], None] args: typing.Iterable[str] args_callback: typing.Callable[[CommandLineArgsCallbackContext], None] @@ -7232,7 +7235,7 @@ def publish_as_docker_file(self, *, configure: typing.Callable[[ContainerResourc self._handle = self._wrap_builder(result) return self - def with_env(self, name: str, value: str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider) -> typing.Self: + def with_env(self, name: str, value: str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractEnvironmentValue) -> typing.Self: """Sets an environment variable""" rpc_args: dict[str, typing.Any] = {'builder': self._handle} rpc_args['name'] = name @@ -7675,13 +7678,13 @@ def __init__(self, handle: Handle, client: AspireClient, **kwargs: typing.Unpack else: raise TypeError("Invalid type for option 'publish_as_docker_file'. Expected: Callable[[ContainerResource], None] or Literal[True]") if _env := kwargs.pop("env", None): - if _validate_tuple_types(_env, (str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider)): + if _validate_tuple_types(_env, (str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractEnvironmentValue)): rpc_args: dict[str, typing.Any] = {"builder": handle} - rpc_args["name"] = typing.cast(tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider], _env)[0] - rpc_args["value"] = typing.cast(tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider], _env)[1] + rpc_args["name"] = typing.cast(tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractEnvironmentValue], _env)[0] + rpc_args["value"] = typing.cast(tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractEnvironmentValue], _env)[1] handle = self._wrap_builder(client.invoke_capability('Aspire.Hosting/withEnvironment', rpc_args)) else: - raise TypeError("Invalid type for option 'env'. Expected: (str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider)") + raise TypeError("Invalid type for option 'env'. Expected: (str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractEnvironmentValue)") if _env_callback := kwargs.pop("env_callback", None): if _validate_type(_env_callback, typing.Callable[[EnvironmentCallbackContext], None]): rpc_args: dict[str, typing.Any] = {"builder": handle} @@ -7968,7 +7971,7 @@ class ExecutableResourceKwargs(_BaseResourceKwargs, total=False): working_dir: str mcp_server: McpServerParameters | typing.Literal[True] otlp_exporter: OtlpProtocol | typing.Literal[True] - env: tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider] + env: tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractEnvironmentValue] env_callback: typing.Callable[[EnvironmentCallbackContext], None] args: typing.Iterable[str] args_callback: typing.Callable[[CommandLineArgsCallbackContext], None] @@ -8065,7 +8068,7 @@ def with_otlp_exporter(self, *, protocol: OtlpProtocol | None = None) -> typing. self._handle = self._wrap_builder(result) return self - def with_env(self, name: str, value: str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider) -> typing.Self: + def with_env(self, name: str, value: str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractEnvironmentValue) -> typing.Self: """Sets an environment variable""" rpc_args: dict[str, typing.Any] = {'builder': self._handle} rpc_args['name'] = name @@ -8497,13 +8500,13 @@ def __init__(self, handle: Handle, client: AspireClient, **kwargs: typing.Unpack else: raise TypeError("Invalid type for option 'otlp_exporter'. Expected: OtlpProtocol or Literal[True]") if _env := kwargs.pop("env", None): - if _validate_tuple_types(_env, (str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider)): + if _validate_tuple_types(_env, (str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractEnvironmentValue)): rpc_args: dict[str, typing.Any] = {"builder": handle} - rpc_args["name"] = typing.cast(tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider], _env)[0] - rpc_args["value"] = typing.cast(tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider], _env)[1] + rpc_args["name"] = typing.cast(tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractEnvironmentValue], _env)[0] + rpc_args["value"] = typing.cast(tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractEnvironmentValue], _env)[1] handle = self._wrap_builder(client.invoke_capability('Aspire.Hosting/withEnvironment', rpc_args)) else: - raise TypeError("Invalid type for option 'env'. Expected: (str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractValueProvider)") + raise TypeError("Invalid type for option 'env'. Expected: (str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractEnvironmentValue)") if _env_callback := kwargs.pop("env_callback", None): if _validate_type(_env_callback, typing.Callable[[EnvironmentCallbackContext], None]): rpc_args: dict[str, typing.Any] = {"builder": handle} From 8f9ca966ee62bbedcfbabdb5fa20f223366a3ea1 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Fri, 27 Mar 2026 13:26:56 -0700 Subject: [PATCH 4/5] Fix polyglot withEnvironment generation Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../AtsTypeScriptCodeGenerator.cs | 71 +++ ...TwoPassScanningGeneratedAspire.verified.go | 479 +-------------- ...oPassScanningGeneratedAspire.verified.java | 562 +++++++----------- ...TwoPassScanningGeneratedAspire.verified.rs | 394 ++---------- 4 files changed, 338 insertions(+), 1168 deletions(-) diff --git a/src/Aspire.Hosting.CodeGeneration.TypeScript/AtsTypeScriptCodeGenerator.cs b/src/Aspire.Hosting.CodeGeneration.TypeScript/AtsTypeScriptCodeGenerator.cs index 27cea8722bb..2ec709d97d1 100644 --- a/src/Aspire.Hosting.CodeGeneration.TypeScript/AtsTypeScriptCodeGenerator.cs +++ b/src/Aspire.Hosting.CodeGeneration.TypeScript/AtsTypeScriptCodeGenerator.cs @@ -103,6 +103,7 @@ public sealed class AtsTypeScriptCodeGenerator : ICodeGenerator // Mapping of typeId -> wrapper class name for all generated wrapper types // Used to resolve parameter types to wrapper classes instead of handle types private readonly Dictionary _wrapperClassNames = new(StringComparer.Ordinal); + private readonly Dictionary _typeRefsById = new(StringComparer.Ordinal); // Set of type IDs that have Promise wrappers (types with chainable methods) // Used to determine return types for methods @@ -251,6 +252,11 @@ private string MapInputTypeToTypeScript(AtsTypeRef? typeRef) { if (IsInterfaceHandleType(typeRef)) { + if (TryMapInterfaceInputTypeToTypeScript(typeRef!) is { } interfaceInputType) + { + return interfaceInputType; + } + return "ResourceBuilderBase"; } @@ -282,6 +288,68 @@ private string MapParameterToTypeScript(AtsParameterInfo param) return MapInputTypeToTypeScript(param.Type); } + private string? TryMapInterfaceInputTypeToTypeScript(AtsTypeRef typeRef) + { + List? assignableWrapperTypes = null; + var includesResourceBuilder = false; + + foreach (var candidateTypeRef in _typeRefsById.Values) + { + if (!IsAssignableToInterface(candidateTypeRef, typeRef.TypeId) || + !_wrapperClassNames.TryGetValue(candidateTypeRef.TypeId, out var wrapperClassName)) + { + continue; + } + + if (candidateTypeRef.IsResourceBuilder) + { + includesResourceBuilder = true; + continue; + } + + assignableWrapperTypes ??= []; + assignableWrapperTypes.Add(wrapperClassName); + } + + if (!includesResourceBuilder && assignableWrapperTypes is not { Count: > 0 }) + { + return null; + } + + var typeNames = new List(); + if (includesResourceBuilder) + { + typeNames.Add("ResourceBuilderBase"); + } + + if (assignableWrapperTypes is { Count: > 0 }) + { + typeNames.AddRange(assignableWrapperTypes + .Distinct(StringComparer.Ordinal) + .OrderBy(static n => n, StringComparer.Ordinal)); + } + + return string.Join(" | ", typeNames); + } + + private static bool IsAssignableToInterface(AtsTypeRef candidateTypeRef, string interfaceTypeId) + { + if (string.Equals(candidateTypeRef.TypeId, interfaceTypeId, StringComparison.Ordinal)) + { + return true; + } + + foreach (var implementedInterface in candidateTypeRef.ImplementedInterfaces) + { + if (IsAssignableToInterface(implementedInterface, interfaceTypeId)) + { + return true; + } + } + + return candidateTypeRef.BaseType is not null && IsAssignableToInterface(candidateTypeRef.BaseType, interfaceTypeId); + } + /// /// Checks if a type reference is an interface handle type. /// Interface handles need union types to accept wrapper classes. @@ -493,6 +561,7 @@ private string GenerateAspireSdk(AtsContext context) // Build wrapper class name mapping for type resolution BEFORE generating options interfaces // This allows parameter types to use wrapper class names instead of handle types _wrapperClassNames.Clear(); + _typeRefsById.Clear(); _typesWithPromiseWrappers.Clear(); _generatedOptionsInterfaces.Clear(); _optionsInterfacesToGenerate.Clear(); @@ -501,12 +570,14 @@ private string GenerateAspireSdk(AtsContext context) foreach (var builder in resourceBuilders) { _wrapperClassNames[builder.TypeId] = builder.BuilderClassName; + _typeRefsById[builder.TypeId] = builder.TargetType!; // All resource builders get Promise wrappers _typesWithPromiseWrappers.Add(builder.TypeId); } foreach (var typeClass in typeClasses) { _wrapperClassNames[typeClass.TypeId] = DeriveClassName(typeClass.TypeId); + _typeRefsById[typeClass.TypeId] = typeClass.TargetType!; // Type classes with methods get Promise wrappers if (HasChainableMethods(typeClass)) { diff --git a/tests/Aspire.Hosting.CodeGeneration.Go.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.go b/tests/Aspire.Hosting.CodeGeneration.Go.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.go index 9c0cdfe2a7f..f6fece974db 100644 --- a/tests/Aspire.Hosting.CodeGeneration.Go.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.go +++ b/tests/Aspire.Hosting.CodeGeneration.Go.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.go @@ -569,7 +569,7 @@ func (s *CSharpAppResource) WithRequiredCommand(command string, helpLink *string } // WithEnvironment sets an environment variable -func (s *CSharpAppResource) WithEnvironment(name string, value string) (*IResourceWithEnvironment, error) { +func (s *CSharpAppResource) WithEnvironment(name string, value any) (*IResourceWithEnvironment, error) { reqArgs := map[string]any{ "builder": SerializeValue(s.Handle()), } @@ -582,20 +582,6 @@ func (s *CSharpAppResource) WithEnvironment(name string, value string) (*IResour return result.(*IResourceWithEnvironment), nil } -// WithEnvironmentExpression adds an environment variable with a reference expression -func (s *CSharpAppResource) WithEnvironmentExpression(name string, value *ReferenceExpression) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["name"] = SerializeValue(name) - reqArgs["value"] = SerializeValue(value) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentExpression", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - // WithEnvironmentCallback sets environment variables via callback func (s *CSharpAppResource) WithEnvironmentCallback(callback func(...any) any) (*IResourceWithEnvironment, error) { reqArgs := map[string]any{ @@ -611,48 +597,6 @@ func (s *CSharpAppResource) WithEnvironmentCallback(callback func(...any) any) ( return result.(*IResourceWithEnvironment), nil } -// WithEnvironmentEndpoint sets an environment variable from an endpoint reference -func (s *CSharpAppResource) WithEnvironmentEndpoint(name string, endpointReference *EndpointReference) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["name"] = SerializeValue(name) - reqArgs["endpointReference"] = SerializeValue(endpointReference) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentEndpoint", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - -// WithEnvironmentParameter sets an environment variable from a parameter resource -func (s *CSharpAppResource) WithEnvironmentParameter(name string, parameter *ParameterResource) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["name"] = SerializeValue(name) - reqArgs["parameter"] = SerializeValue(parameter) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentParameter", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - -// WithEnvironmentConnectionString sets an environment variable from a connection string resource -func (s *CSharpAppResource) WithEnvironmentConnectionString(envVarName string, resource *IResourceWithConnectionString) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["envVarName"] = SerializeValue(envVarName) - reqArgs["resource"] = SerializeValue(resource) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentConnectionString", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - // WithArgs adds arguments func (s *CSharpAppResource) WithArgs(args []string) (*IResourceWithArgs, error) { reqArgs := map[string]any{ @@ -3663,7 +3607,7 @@ func (s *ContainerResource) WithRequiredCommand(command string, helpLink *string } // WithEnvironment sets an environment variable -func (s *ContainerResource) WithEnvironment(name string, value string) (*IResourceWithEnvironment, error) { +func (s *ContainerResource) WithEnvironment(name string, value any) (*IResourceWithEnvironment, error) { reqArgs := map[string]any{ "builder": SerializeValue(s.Handle()), } @@ -3676,20 +3620,6 @@ func (s *ContainerResource) WithEnvironment(name string, value string) (*IResour return result.(*IResourceWithEnvironment), nil } -// WithEnvironmentExpression adds an environment variable with a reference expression -func (s *ContainerResource) WithEnvironmentExpression(name string, value *ReferenceExpression) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["name"] = SerializeValue(name) - reqArgs["value"] = SerializeValue(value) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentExpression", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - // WithEnvironmentCallback sets environment variables via callback func (s *ContainerResource) WithEnvironmentCallback(callback func(...any) any) (*IResourceWithEnvironment, error) { reqArgs := map[string]any{ @@ -3705,48 +3635,6 @@ func (s *ContainerResource) WithEnvironmentCallback(callback func(...any) any) ( return result.(*IResourceWithEnvironment), nil } -// WithEnvironmentEndpoint sets an environment variable from an endpoint reference -func (s *ContainerResource) WithEnvironmentEndpoint(name string, endpointReference *EndpointReference) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["name"] = SerializeValue(name) - reqArgs["endpointReference"] = SerializeValue(endpointReference) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentEndpoint", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - -// WithEnvironmentParameter sets an environment variable from a parameter resource -func (s *ContainerResource) WithEnvironmentParameter(name string, parameter *ParameterResource) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["name"] = SerializeValue(name) - reqArgs["parameter"] = SerializeValue(parameter) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentParameter", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - -// WithEnvironmentConnectionString sets an environment variable from a connection string resource -func (s *ContainerResource) WithEnvironmentConnectionString(envVarName string, resource *IResourceWithConnectionString) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["envVarName"] = SerializeValue(envVarName) - reqArgs["resource"] = SerializeValue(resource) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentConnectionString", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - // WithArgs adds arguments func (s *ContainerResource) WithArgs(args []string) (*IResourceWithArgs, error) { reqArgs := map[string]any{ @@ -5256,7 +5144,7 @@ func (s *DotnetToolResource) WithRequiredCommand(command string, helpLink *strin } // WithEnvironment sets an environment variable -func (s *DotnetToolResource) WithEnvironment(name string, value string) (*IResourceWithEnvironment, error) { +func (s *DotnetToolResource) WithEnvironment(name string, value any) (*IResourceWithEnvironment, error) { reqArgs := map[string]any{ "builder": SerializeValue(s.Handle()), } @@ -5269,20 +5157,6 @@ func (s *DotnetToolResource) WithEnvironment(name string, value string) (*IResou return result.(*IResourceWithEnvironment), nil } -// WithEnvironmentExpression adds an environment variable with a reference expression -func (s *DotnetToolResource) WithEnvironmentExpression(name string, value *ReferenceExpression) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["name"] = SerializeValue(name) - reqArgs["value"] = SerializeValue(value) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentExpression", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - // WithEnvironmentCallback sets environment variables via callback func (s *DotnetToolResource) WithEnvironmentCallback(callback func(...any) any) (*IResourceWithEnvironment, error) { reqArgs := map[string]any{ @@ -5298,48 +5172,6 @@ func (s *DotnetToolResource) WithEnvironmentCallback(callback func(...any) any) return result.(*IResourceWithEnvironment), nil } -// WithEnvironmentEndpoint sets an environment variable from an endpoint reference -func (s *DotnetToolResource) WithEnvironmentEndpoint(name string, endpointReference *EndpointReference) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["name"] = SerializeValue(name) - reqArgs["endpointReference"] = SerializeValue(endpointReference) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentEndpoint", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - -// WithEnvironmentParameter sets an environment variable from a parameter resource -func (s *DotnetToolResource) WithEnvironmentParameter(name string, parameter *ParameterResource) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["name"] = SerializeValue(name) - reqArgs["parameter"] = SerializeValue(parameter) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentParameter", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - -// WithEnvironmentConnectionString sets an environment variable from a connection string resource -func (s *DotnetToolResource) WithEnvironmentConnectionString(envVarName string, resource *IResourceWithConnectionString) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["envVarName"] = SerializeValue(envVarName) - reqArgs["resource"] = SerializeValue(resource) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentConnectionString", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - // WithArgs adds arguments func (s *DotnetToolResource) WithArgs(args []string) (*IResourceWithArgs, error) { reqArgs := map[string]any{ @@ -6925,7 +6757,7 @@ func (s *ExecutableResource) WithRequiredCommand(command string, helpLink *strin } // WithEnvironment sets an environment variable -func (s *ExecutableResource) WithEnvironment(name string, value string) (*IResourceWithEnvironment, error) { +func (s *ExecutableResource) WithEnvironment(name string, value any) (*IResourceWithEnvironment, error) { reqArgs := map[string]any{ "builder": SerializeValue(s.Handle()), } @@ -6938,20 +6770,6 @@ func (s *ExecutableResource) WithEnvironment(name string, value string) (*IResou return result.(*IResourceWithEnvironment), nil } -// WithEnvironmentExpression adds an environment variable with a reference expression -func (s *ExecutableResource) WithEnvironmentExpression(name string, value *ReferenceExpression) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["name"] = SerializeValue(name) - reqArgs["value"] = SerializeValue(value) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentExpression", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - // WithEnvironmentCallback sets environment variables via callback func (s *ExecutableResource) WithEnvironmentCallback(callback func(...any) any) (*IResourceWithEnvironment, error) { reqArgs := map[string]any{ @@ -6967,48 +6785,6 @@ func (s *ExecutableResource) WithEnvironmentCallback(callback func(...any) any) return result.(*IResourceWithEnvironment), nil } -// WithEnvironmentEndpoint sets an environment variable from an endpoint reference -func (s *ExecutableResource) WithEnvironmentEndpoint(name string, endpointReference *EndpointReference) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["name"] = SerializeValue(name) - reqArgs["endpointReference"] = SerializeValue(endpointReference) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentEndpoint", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - -// WithEnvironmentParameter sets an environment variable from a parameter resource -func (s *ExecutableResource) WithEnvironmentParameter(name string, parameter *ParameterResource) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["name"] = SerializeValue(name) - reqArgs["parameter"] = SerializeValue(parameter) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentParameter", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - -// WithEnvironmentConnectionString sets an environment variable from a connection string resource -func (s *ExecutableResource) WithEnvironmentConnectionString(envVarName string, resource *IResourceWithConnectionString) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["envVarName"] = SerializeValue(envVarName) - reqArgs["resource"] = SerializeValue(resource) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentConnectionString", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - // WithArgs adds arguments func (s *ExecutableResource) WithArgs(args []string) (*IResourceWithArgs, error) { reqArgs := map[string]any{ @@ -9464,6 +9240,18 @@ func NewIDistributedApplicationResourceEvent(handle *Handle, client *AspireClien } } +// IEnvironmentValue wraps a handle for Aspire.Hosting/Aspire.Hosting.ApplicationModel.IEnvironmentValue. +type IEnvironmentValue struct { + HandleWrapperBase +} + +// NewIEnvironmentValue creates a new IEnvironmentValue. +func NewIEnvironmentValue(handle *Handle, client *AspireClient) *IEnvironmentValue { + return &IEnvironmentValue{ + HandleWrapperBase: NewHandleWrapperBase(handle, client), + } +} + // IHostEnvironment wraps a handle for Microsoft.Extensions.Hosting.Abstractions/Microsoft.Extensions.Hosting.IHostEnvironment. type IHostEnvironment struct { HandleWrapperBase @@ -11564,7 +11352,7 @@ func (s *ProjectResource) WithRequiredCommand(command string, helpLink *string) } // WithEnvironment sets an environment variable -func (s *ProjectResource) WithEnvironment(name string, value string) (*IResourceWithEnvironment, error) { +func (s *ProjectResource) WithEnvironment(name string, value any) (*IResourceWithEnvironment, error) { reqArgs := map[string]any{ "builder": SerializeValue(s.Handle()), } @@ -11577,20 +11365,6 @@ func (s *ProjectResource) WithEnvironment(name string, value string) (*IResource return result.(*IResourceWithEnvironment), nil } -// WithEnvironmentExpression adds an environment variable with a reference expression -func (s *ProjectResource) WithEnvironmentExpression(name string, value *ReferenceExpression) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["name"] = SerializeValue(name) - reqArgs["value"] = SerializeValue(value) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentExpression", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - // WithEnvironmentCallback sets environment variables via callback func (s *ProjectResource) WithEnvironmentCallback(callback func(...any) any) (*IResourceWithEnvironment, error) { reqArgs := map[string]any{ @@ -11606,48 +11380,6 @@ func (s *ProjectResource) WithEnvironmentCallback(callback func(...any) any) (*I return result.(*IResourceWithEnvironment), nil } -// WithEnvironmentEndpoint sets an environment variable from an endpoint reference -func (s *ProjectResource) WithEnvironmentEndpoint(name string, endpointReference *EndpointReference) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["name"] = SerializeValue(name) - reqArgs["endpointReference"] = SerializeValue(endpointReference) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentEndpoint", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - -// WithEnvironmentParameter sets an environment variable from a parameter resource -func (s *ProjectResource) WithEnvironmentParameter(name string, parameter *ParameterResource) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["name"] = SerializeValue(name) - reqArgs["parameter"] = SerializeValue(parameter) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentParameter", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - -// WithEnvironmentConnectionString sets an environment variable from a connection string resource -func (s *ProjectResource) WithEnvironmentConnectionString(envVarName string, resource *IResourceWithConnectionString) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["envVarName"] = SerializeValue(envVarName) - reqArgs["resource"] = SerializeValue(resource) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentConnectionString", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - // WithArgs adds arguments func (s *ProjectResource) WithArgs(args []string) (*IResourceWithArgs, error) { reqArgs := map[string]any{ @@ -13667,7 +13399,7 @@ func (s *TestDatabaseResource) WithRequiredCommand(command string, helpLink *str } // WithEnvironment sets an environment variable -func (s *TestDatabaseResource) WithEnvironment(name string, value string) (*IResourceWithEnvironment, error) { +func (s *TestDatabaseResource) WithEnvironment(name string, value any) (*IResourceWithEnvironment, error) { reqArgs := map[string]any{ "builder": SerializeValue(s.Handle()), } @@ -13680,20 +13412,6 @@ func (s *TestDatabaseResource) WithEnvironment(name string, value string) (*IRes return result.(*IResourceWithEnvironment), nil } -// WithEnvironmentExpression adds an environment variable with a reference expression -func (s *TestDatabaseResource) WithEnvironmentExpression(name string, value *ReferenceExpression) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["name"] = SerializeValue(name) - reqArgs["value"] = SerializeValue(value) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentExpression", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - // WithEnvironmentCallback sets environment variables via callback func (s *TestDatabaseResource) WithEnvironmentCallback(callback func(...any) any) (*IResourceWithEnvironment, error) { reqArgs := map[string]any{ @@ -13709,48 +13427,6 @@ func (s *TestDatabaseResource) WithEnvironmentCallback(callback func(...any) any return result.(*IResourceWithEnvironment), nil } -// WithEnvironmentEndpoint sets an environment variable from an endpoint reference -func (s *TestDatabaseResource) WithEnvironmentEndpoint(name string, endpointReference *EndpointReference) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["name"] = SerializeValue(name) - reqArgs["endpointReference"] = SerializeValue(endpointReference) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentEndpoint", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - -// WithEnvironmentParameter sets an environment variable from a parameter resource -func (s *TestDatabaseResource) WithEnvironmentParameter(name string, parameter *ParameterResource) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["name"] = SerializeValue(name) - reqArgs["parameter"] = SerializeValue(parameter) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentParameter", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - -// WithEnvironmentConnectionString sets an environment variable from a connection string resource -func (s *TestDatabaseResource) WithEnvironmentConnectionString(envVarName string, resource *IResourceWithConnectionString) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["envVarName"] = SerializeValue(envVarName) - reqArgs["resource"] = SerializeValue(resource) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentConnectionString", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - // WithArgs adds arguments func (s *TestDatabaseResource) WithArgs(args []string) (*IResourceWithArgs, error) { reqArgs := map[string]any{ @@ -15273,7 +14949,7 @@ func (s *TestRedisResource) WithRequiredCommand(command string, helpLink *string } // WithEnvironment sets an environment variable -func (s *TestRedisResource) WithEnvironment(name string, value string) (*IResourceWithEnvironment, error) { +func (s *TestRedisResource) WithEnvironment(name string, value any) (*IResourceWithEnvironment, error) { reqArgs := map[string]any{ "builder": SerializeValue(s.Handle()), } @@ -15286,20 +14962,6 @@ func (s *TestRedisResource) WithEnvironment(name string, value string) (*IResour return result.(*IResourceWithEnvironment), nil } -// WithEnvironmentExpression adds an environment variable with a reference expression -func (s *TestRedisResource) WithEnvironmentExpression(name string, value *ReferenceExpression) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["name"] = SerializeValue(name) - reqArgs["value"] = SerializeValue(value) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentExpression", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - // WithEnvironmentCallback sets environment variables via callback func (s *TestRedisResource) WithEnvironmentCallback(callback func(...any) any) (*IResourceWithEnvironment, error) { reqArgs := map[string]any{ @@ -15315,48 +14977,6 @@ func (s *TestRedisResource) WithEnvironmentCallback(callback func(...any) any) ( return result.(*IResourceWithEnvironment), nil } -// WithEnvironmentEndpoint sets an environment variable from an endpoint reference -func (s *TestRedisResource) WithEnvironmentEndpoint(name string, endpointReference *EndpointReference) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["name"] = SerializeValue(name) - reqArgs["endpointReference"] = SerializeValue(endpointReference) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentEndpoint", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - -// WithEnvironmentParameter sets an environment variable from a parameter resource -func (s *TestRedisResource) WithEnvironmentParameter(name string, parameter *ParameterResource) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["name"] = SerializeValue(name) - reqArgs["parameter"] = SerializeValue(parameter) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentParameter", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - -// WithEnvironmentConnectionString sets an environment variable from a connection string resource -func (s *TestRedisResource) WithEnvironmentConnectionString(envVarName string, resource *IResourceWithConnectionString) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["envVarName"] = SerializeValue(envVarName) - reqArgs["resource"] = SerializeValue(resource) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentConnectionString", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - // WithConnectionProperty adds a connection property with a reference expression func (s *TestRedisResource) WithConnectionProperty(name string, value *ReferenceExpression) (*IResourceWithConnectionString, error) { reqArgs := map[string]any{ @@ -17091,7 +16711,7 @@ func (s *TestVaultResource) WithRequiredCommand(command string, helpLink *string } // WithEnvironment sets an environment variable -func (s *TestVaultResource) WithEnvironment(name string, value string) (*IResourceWithEnvironment, error) { +func (s *TestVaultResource) WithEnvironment(name string, value any) (*IResourceWithEnvironment, error) { reqArgs := map[string]any{ "builder": SerializeValue(s.Handle()), } @@ -17104,20 +16724,6 @@ func (s *TestVaultResource) WithEnvironment(name string, value string) (*IResour return result.(*IResourceWithEnvironment), nil } -// WithEnvironmentExpression adds an environment variable with a reference expression -func (s *TestVaultResource) WithEnvironmentExpression(name string, value *ReferenceExpression) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["name"] = SerializeValue(name) - reqArgs["value"] = SerializeValue(value) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentExpression", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - // WithEnvironmentCallback sets environment variables via callback func (s *TestVaultResource) WithEnvironmentCallback(callback func(...any) any) (*IResourceWithEnvironment, error) { reqArgs := map[string]any{ @@ -17133,48 +16739,6 @@ func (s *TestVaultResource) WithEnvironmentCallback(callback func(...any) any) ( return result.(*IResourceWithEnvironment), nil } -// WithEnvironmentEndpoint sets an environment variable from an endpoint reference -func (s *TestVaultResource) WithEnvironmentEndpoint(name string, endpointReference *EndpointReference) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["name"] = SerializeValue(name) - reqArgs["endpointReference"] = SerializeValue(endpointReference) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentEndpoint", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - -// WithEnvironmentParameter sets an environment variable from a parameter resource -func (s *TestVaultResource) WithEnvironmentParameter(name string, parameter *ParameterResource) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["name"] = SerializeValue(name) - reqArgs["parameter"] = SerializeValue(parameter) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentParameter", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - -// WithEnvironmentConnectionString sets an environment variable from a connection string resource -func (s *TestVaultResource) WithEnvironmentConnectionString(envVarName string, resource *IResourceWithConnectionString) (*IResourceWithEnvironment, error) { - reqArgs := map[string]any{ - "builder": SerializeValue(s.Handle()), - } - reqArgs["envVarName"] = SerializeValue(envVarName) - reqArgs["resource"] = SerializeValue(resource) - result, err := s.Client().InvokeCapability("Aspire.Hosting/withEnvironmentConnectionString", reqArgs) - if err != nil { - return nil, err - } - return result.(*IResourceWithEnvironment), nil -} - // WithArgs adds arguments func (s *TestVaultResource) WithArgs(args []string) (*IResourceWithArgs, error) { reqArgs := map[string]any{ @@ -18467,6 +18031,9 @@ func init() { RegisterHandleWrapper("Aspire.Hosting/Aspire.Hosting.ApplicationModel.EnvironmentCallbackContext", func(h *Handle, c *AspireClient) any { return NewEnvironmentCallbackContext(h, c) }) + RegisterHandleWrapper("Aspire.Hosting/Aspire.Hosting.ApplicationModel.IEnvironmentValue", func(h *Handle, c *AspireClient) any { + return NewIEnvironmentValue(h, c) + }) RegisterHandleWrapper("Aspire.Hosting/Aspire.Hosting.ApplicationModel.InitializeResourceEvent", func(h *Handle, c *AspireClient) any { return NewInitializeResourceEvent(h, c) }) diff --git a/tests/Aspire.Hosting.CodeGeneration.Java.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.java b/tests/Aspire.Hosting.CodeGeneration.Java.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.java index 38850f68c1d..6596d1f0249 100644 --- a/tests/Aspire.Hosting.CodeGeneration.Java.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.java +++ b/tests/Aspire.Hosting.CodeGeneration.Java.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.java @@ -1049,6 +1049,7 @@ public class AspireRegistrations { AspireClient.registerHandleWrapper("Aspire.Hosting/Aspire.Hosting.ApplicationModel.DistributedApplicationModel", (h, c) -> new DistributedApplicationModel(h, c)); AspireClient.registerHandleWrapper("Aspire.Hosting/Aspire.Hosting.ApplicationModel.EndpointReferenceExpression", (h, c) -> new EndpointReferenceExpression(h, c)); AspireClient.registerHandleWrapper("Aspire.Hosting/Aspire.Hosting.ApplicationModel.EnvironmentCallbackContext", (h, c) -> new EnvironmentCallbackContext(h, c)); + AspireClient.registerHandleWrapper("Aspire.Hosting/Aspire.Hosting.ApplicationModel.IEnvironmentValue", (h, c) -> new IEnvironmentValue(h, c)); AspireClient.registerHandleWrapper("Aspire.Hosting/Aspire.Hosting.ApplicationModel.InitializeResourceEvent", (h, c) -> new InitializeResourceEvent(h, c)); AspireClient.registerHandleWrapper("Aspire.Hosting/Aspire.Hosting.ApplicationModel.ReferenceExpressionBuilder", (h, c) -> new ReferenceExpressionBuilder(h, c)); AspireClient.registerHandleWrapper("Aspire.Hosting/Aspire.Hosting.ApplicationModel.UpdateCommandStateContext", (h, c) -> new UpdateCommandStateContext(h, c)); @@ -1364,23 +1365,37 @@ public CSharpAppResource withRequiredCommand(String command, String helpLink) { return this; } - /** Sets an environment variable */ public CSharpAppResource withEnvironment(String name, String value) { - Map reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("name", AspireClient.serializeValue(name)); - reqArgs.put("value", AspireClient.serializeValue(value)); - getClient().invokeCapability("Aspire.Hosting/withEnvironment", reqArgs); - return this; + return withEnvironment(name, AspireUnion.of(value)); + } + + public CSharpAppResource withEnvironment(String name, ReferenceExpression value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + public CSharpAppResource withEnvironment(String name, EndpointReference value) { + return withEnvironment(name, AspireUnion.of(value)); } - /** Adds an environment variable with a reference expression */ - public CSharpAppResource withEnvironmentExpression(String name, ReferenceExpression value) { + public CSharpAppResource withEnvironment(String name, ParameterResource value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + public CSharpAppResource withEnvironment(String name, IResourceWithConnectionString value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + public CSharpAppResource withEnvironment(String name, IEnvironmentValue value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + /** Sets an environment variable */ + public CSharpAppResource withEnvironment(String name, AspireUnion value) { Map reqArgs = new HashMap<>(); reqArgs.put("builder", AspireClient.serializeValue(getHandle())); reqArgs.put("name", AspireClient.serializeValue(name)); reqArgs.put("value", AspireClient.serializeValue(value)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentExpression", reqArgs); + getClient().invokeCapability("Aspire.Hosting/withEnvironment", reqArgs); return this; } @@ -1400,40 +1415,6 @@ public CSharpAppResource withEnvironmentCallback(AspireAction1 reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("name", AspireClient.serializeValue(name)); - reqArgs.put("endpointReference", AspireClient.serializeValue(endpointReference)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentEndpoint", reqArgs); - return this; - } - - /** Sets an environment variable from a parameter resource */ - public CSharpAppResource withEnvironmentParameter(String name, ParameterResource parameter) { - Map reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("name", AspireClient.serializeValue(name)); - reqArgs.put("parameter", AspireClient.serializeValue(parameter)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentParameter", reqArgs); - return this; - } - - /** Sets an environment variable from a connection string resource */ - public CSharpAppResource withEnvironmentConnectionString(String envVarName, IResourceWithConnectionString resource) { - Map reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("envVarName", AspireClient.serializeValue(envVarName)); - reqArgs.put("resource", AspireClient.serializeValue(resource)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentConnectionString", reqArgs); - return this; - } - - public CSharpAppResource withEnvironmentConnectionString(String envVarName, ResourceBuilderBase resource) { - return withEnvironmentConnectionString(envVarName, new IResourceWithConnectionString(resource.getHandle(), resource.getClient())); - } - /** Adds arguments */ public CSharpAppResource withArgs(String[] args) { Map reqArgs = new HashMap<>(); @@ -4643,23 +4624,37 @@ public ContainerResource withRequiredCommand(String command, String helpLink) { return this; } - /** Sets an environment variable */ public ContainerResource withEnvironment(String name, String value) { - Map reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("name", AspireClient.serializeValue(name)); - reqArgs.put("value", AspireClient.serializeValue(value)); - getClient().invokeCapability("Aspire.Hosting/withEnvironment", reqArgs); - return this; + return withEnvironment(name, AspireUnion.of(value)); + } + + public ContainerResource withEnvironment(String name, ReferenceExpression value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + public ContainerResource withEnvironment(String name, EndpointReference value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + public ContainerResource withEnvironment(String name, ParameterResource value) { + return withEnvironment(name, AspireUnion.of(value)); } - /** Adds an environment variable with a reference expression */ - public ContainerResource withEnvironmentExpression(String name, ReferenceExpression value) { + public ContainerResource withEnvironment(String name, IResourceWithConnectionString value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + public ContainerResource withEnvironment(String name, IEnvironmentValue value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + /** Sets an environment variable */ + public ContainerResource withEnvironment(String name, AspireUnion value) { Map reqArgs = new HashMap<>(); reqArgs.put("builder", AspireClient.serializeValue(getHandle())); reqArgs.put("name", AspireClient.serializeValue(name)); reqArgs.put("value", AspireClient.serializeValue(value)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentExpression", reqArgs); + getClient().invokeCapability("Aspire.Hosting/withEnvironment", reqArgs); return this; } @@ -4679,40 +4674,6 @@ public ContainerResource withEnvironmentCallback(AspireAction1 reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("name", AspireClient.serializeValue(name)); - reqArgs.put("endpointReference", AspireClient.serializeValue(endpointReference)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentEndpoint", reqArgs); - return this; - } - - /** Sets an environment variable from a parameter resource */ - public ContainerResource withEnvironmentParameter(String name, ParameterResource parameter) { - Map reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("name", AspireClient.serializeValue(name)); - reqArgs.put("parameter", AspireClient.serializeValue(parameter)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentParameter", reqArgs); - return this; - } - - /** Sets an environment variable from a connection string resource */ - public ContainerResource withEnvironmentConnectionString(String envVarName, IResourceWithConnectionString resource) { - Map reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("envVarName", AspireClient.serializeValue(envVarName)); - reqArgs.put("resource", AspireClient.serializeValue(resource)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentConnectionString", reqArgs); - return this; - } - - public ContainerResource withEnvironmentConnectionString(String envVarName, ResourceBuilderBase resource) { - return withEnvironmentConnectionString(envVarName, new IResourceWithConnectionString(resource.getHandle(), resource.getClient())); - } - /** Adds arguments */ public ContainerResource withArgs(String[] args) { Map reqArgs = new HashMap<>(); @@ -6293,23 +6254,37 @@ public DotnetToolResource withRequiredCommand(String command, String helpLink) { return this; } - /** Sets an environment variable */ public DotnetToolResource withEnvironment(String name, String value) { - Map reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("name", AspireClient.serializeValue(name)); - reqArgs.put("value", AspireClient.serializeValue(value)); - getClient().invokeCapability("Aspire.Hosting/withEnvironment", reqArgs); - return this; + return withEnvironment(name, AspireUnion.of(value)); + } + + public DotnetToolResource withEnvironment(String name, ReferenceExpression value) { + return withEnvironment(name, AspireUnion.of(value)); } - /** Adds an environment variable with a reference expression */ - public DotnetToolResource withEnvironmentExpression(String name, ReferenceExpression value) { + public DotnetToolResource withEnvironment(String name, EndpointReference value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + public DotnetToolResource withEnvironment(String name, ParameterResource value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + public DotnetToolResource withEnvironment(String name, IResourceWithConnectionString value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + public DotnetToolResource withEnvironment(String name, IEnvironmentValue value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + /** Sets an environment variable */ + public DotnetToolResource withEnvironment(String name, AspireUnion value) { Map reqArgs = new HashMap<>(); reqArgs.put("builder", AspireClient.serializeValue(getHandle())); reqArgs.put("name", AspireClient.serializeValue(name)); reqArgs.put("value", AspireClient.serializeValue(value)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentExpression", reqArgs); + getClient().invokeCapability("Aspire.Hosting/withEnvironment", reqArgs); return this; } @@ -6329,40 +6304,6 @@ public DotnetToolResource withEnvironmentCallback(AspireAction1 reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("name", AspireClient.serializeValue(name)); - reqArgs.put("endpointReference", AspireClient.serializeValue(endpointReference)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentEndpoint", reqArgs); - return this; - } - - /** Sets an environment variable from a parameter resource */ - public DotnetToolResource withEnvironmentParameter(String name, ParameterResource parameter) { - Map reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("name", AspireClient.serializeValue(name)); - reqArgs.put("parameter", AspireClient.serializeValue(parameter)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentParameter", reqArgs); - return this; - } - - /** Sets an environment variable from a connection string resource */ - public DotnetToolResource withEnvironmentConnectionString(String envVarName, IResourceWithConnectionString resource) { - Map reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("envVarName", AspireClient.serializeValue(envVarName)); - reqArgs.put("resource", AspireClient.serializeValue(resource)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentConnectionString", reqArgs); - return this; - } - - public DotnetToolResource withEnvironmentConnectionString(String envVarName, ResourceBuilderBase resource) { - return withEnvironmentConnectionString(envVarName, new IResourceWithConnectionString(resource.getHandle(), resource.getClient())); - } - /** Adds arguments */ public DotnetToolResource withArgs(String[] args) { Map reqArgs = new HashMap<>(); @@ -7882,23 +7823,37 @@ public ExecutableResource withRequiredCommand(String command, String helpLink) { return this; } - /** Sets an environment variable */ public ExecutableResource withEnvironment(String name, String value) { - Map reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("name", AspireClient.serializeValue(name)); - reqArgs.put("value", AspireClient.serializeValue(value)); - getClient().invokeCapability("Aspire.Hosting/withEnvironment", reqArgs); - return this; + return withEnvironment(name, AspireUnion.of(value)); + } + + public ExecutableResource withEnvironment(String name, ReferenceExpression value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + public ExecutableResource withEnvironment(String name, EndpointReference value) { + return withEnvironment(name, AspireUnion.of(value)); } - /** Adds an environment variable with a reference expression */ - public ExecutableResource withEnvironmentExpression(String name, ReferenceExpression value) { + public ExecutableResource withEnvironment(String name, ParameterResource value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + public ExecutableResource withEnvironment(String name, IResourceWithConnectionString value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + public ExecutableResource withEnvironment(String name, IEnvironmentValue value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + /** Sets an environment variable */ + public ExecutableResource withEnvironment(String name, AspireUnion value) { Map reqArgs = new HashMap<>(); reqArgs.put("builder", AspireClient.serializeValue(getHandle())); reqArgs.put("name", AspireClient.serializeValue(name)); reqArgs.put("value", AspireClient.serializeValue(value)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentExpression", reqArgs); + getClient().invokeCapability("Aspire.Hosting/withEnvironment", reqArgs); return this; } @@ -7918,40 +7873,6 @@ public ExecutableResource withEnvironmentCallback(AspireAction1 reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("name", AspireClient.serializeValue(name)); - reqArgs.put("endpointReference", AspireClient.serializeValue(endpointReference)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentEndpoint", reqArgs); - return this; - } - - /** Sets an environment variable from a parameter resource */ - public ExecutableResource withEnvironmentParameter(String name, ParameterResource parameter) { - Map reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("name", AspireClient.serializeValue(name)); - reqArgs.put("parameter", AspireClient.serializeValue(parameter)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentParameter", reqArgs); - return this; - } - - /** Sets an environment variable from a connection string resource */ - public ExecutableResource withEnvironmentConnectionString(String envVarName, IResourceWithConnectionString resource) { - Map reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("envVarName", AspireClient.serializeValue(envVarName)); - reqArgs.put("resource", AspireClient.serializeValue(resource)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentConnectionString", reqArgs); - return this; - } - - public ExecutableResource withEnvironmentConnectionString(String envVarName, ResourceBuilderBase resource) { - return withEnvironmentConnectionString(envVarName, new IResourceWithConnectionString(resource.getHandle(), resource.getClient())); - } - /** Adds arguments */ public ExecutableResource withArgs(String[] args) { Map reqArgs = new HashMap<>(); @@ -10415,6 +10336,22 @@ public class IDistributedApplicationResourceEvent extends HandleWrapperBase { } +// ===== IEnvironmentValue.java ===== +// IEnvironmentValue.java - GENERATED CODE - DO NOT EDIT + +package aspire; + +import java.util.*; +import java.util.function.*; + +/** Wrapper for Aspire.Hosting/Aspire.Hosting.ApplicationModel.IEnvironmentValue. */ +public class IEnvironmentValue extends HandleWrapperBase { + IEnvironmentValue(Handle handle, AspireClient client) { + super(handle, client); + } + +} + // ===== IHostEnvironment.java ===== // IHostEnvironment.java - GENERATED CODE - DO NOT EDIT @@ -12470,23 +12407,37 @@ public ProjectResource withRequiredCommand(String command, String helpLink) { return this; } - /** Sets an environment variable */ public ProjectResource withEnvironment(String name, String value) { - Map reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("name", AspireClient.serializeValue(name)); - reqArgs.put("value", AspireClient.serializeValue(value)); - getClient().invokeCapability("Aspire.Hosting/withEnvironment", reqArgs); - return this; + return withEnvironment(name, AspireUnion.of(value)); + } + + public ProjectResource withEnvironment(String name, ReferenceExpression value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + public ProjectResource withEnvironment(String name, EndpointReference value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + public ProjectResource withEnvironment(String name, ParameterResource value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + public ProjectResource withEnvironment(String name, IResourceWithConnectionString value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + public ProjectResource withEnvironment(String name, IEnvironmentValue value) { + return withEnvironment(name, AspireUnion.of(value)); } - /** Adds an environment variable with a reference expression */ - public ProjectResource withEnvironmentExpression(String name, ReferenceExpression value) { + /** Sets an environment variable */ + public ProjectResource withEnvironment(String name, AspireUnion value) { Map reqArgs = new HashMap<>(); reqArgs.put("builder", AspireClient.serializeValue(getHandle())); reqArgs.put("name", AspireClient.serializeValue(name)); reqArgs.put("value", AspireClient.serializeValue(value)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentExpression", reqArgs); + getClient().invokeCapability("Aspire.Hosting/withEnvironment", reqArgs); return this; } @@ -12506,40 +12457,6 @@ public ProjectResource withEnvironmentCallback(AspireAction1 reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("name", AspireClient.serializeValue(name)); - reqArgs.put("endpointReference", AspireClient.serializeValue(endpointReference)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentEndpoint", reqArgs); - return this; - } - - /** Sets an environment variable from a parameter resource */ - public ProjectResource withEnvironmentParameter(String name, ParameterResource parameter) { - Map reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("name", AspireClient.serializeValue(name)); - reqArgs.put("parameter", AspireClient.serializeValue(parameter)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentParameter", reqArgs); - return this; - } - - /** Sets an environment variable from a connection string resource */ - public ProjectResource withEnvironmentConnectionString(String envVarName, IResourceWithConnectionString resource) { - Map reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("envVarName", AspireClient.serializeValue(envVarName)); - reqArgs.put("resource", AspireClient.serializeValue(resource)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentConnectionString", reqArgs); - return this; - } - - public ProjectResource withEnvironmentConnectionString(String envVarName, ResourceBuilderBase resource) { - return withEnvironmentConnectionString(envVarName, new IResourceWithConnectionString(resource.getHandle(), resource.getClient())); - } - /** Adds arguments */ public ProjectResource withArgs(String[] args) { Map reqArgs = new HashMap<>(); @@ -14785,23 +14702,37 @@ public TestDatabaseResource withRequiredCommand(String command, String helpLink) return this; } - /** Sets an environment variable */ public TestDatabaseResource withEnvironment(String name, String value) { - Map reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("name", AspireClient.serializeValue(name)); - reqArgs.put("value", AspireClient.serializeValue(value)); - getClient().invokeCapability("Aspire.Hosting/withEnvironment", reqArgs); - return this; + return withEnvironment(name, AspireUnion.of(value)); } - /** Adds an environment variable with a reference expression */ - public TestDatabaseResource withEnvironmentExpression(String name, ReferenceExpression value) { + public TestDatabaseResource withEnvironment(String name, ReferenceExpression value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + public TestDatabaseResource withEnvironment(String name, EndpointReference value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + public TestDatabaseResource withEnvironment(String name, ParameterResource value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + public TestDatabaseResource withEnvironment(String name, IResourceWithConnectionString value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + public TestDatabaseResource withEnvironment(String name, IEnvironmentValue value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + /** Sets an environment variable */ + public TestDatabaseResource withEnvironment(String name, AspireUnion value) { Map reqArgs = new HashMap<>(); reqArgs.put("builder", AspireClient.serializeValue(getHandle())); reqArgs.put("name", AspireClient.serializeValue(name)); reqArgs.put("value", AspireClient.serializeValue(value)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentExpression", reqArgs); + getClient().invokeCapability("Aspire.Hosting/withEnvironment", reqArgs); return this; } @@ -14821,40 +14752,6 @@ public TestDatabaseResource withEnvironmentCallback(AspireAction1 reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("name", AspireClient.serializeValue(name)); - reqArgs.put("endpointReference", AspireClient.serializeValue(endpointReference)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentEndpoint", reqArgs); - return this; - } - - /** Sets an environment variable from a parameter resource */ - public TestDatabaseResource withEnvironmentParameter(String name, ParameterResource parameter) { - Map reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("name", AspireClient.serializeValue(name)); - reqArgs.put("parameter", AspireClient.serializeValue(parameter)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentParameter", reqArgs); - return this; - } - - /** Sets an environment variable from a connection string resource */ - public TestDatabaseResource withEnvironmentConnectionString(String envVarName, IResourceWithConnectionString resource) { - Map reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("envVarName", AspireClient.serializeValue(envVarName)); - reqArgs.put("resource", AspireClient.serializeValue(resource)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentConnectionString", reqArgs); - return this; - } - - public TestDatabaseResource withEnvironmentConnectionString(String envVarName, ResourceBuilderBase resource) { - return withEnvironmentConnectionString(envVarName, new IResourceWithConnectionString(resource.getHandle(), resource.getClient())); - } - /** Adds arguments */ public TestDatabaseResource withArgs(String[] args) { Map reqArgs = new HashMap<>(); @@ -16412,23 +16309,37 @@ public TestRedisResource withRequiredCommand(String command, String helpLink) { return this; } - /** Sets an environment variable */ public TestRedisResource withEnvironment(String name, String value) { - Map reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("name", AspireClient.serializeValue(name)); - reqArgs.put("value", AspireClient.serializeValue(value)); - getClient().invokeCapability("Aspire.Hosting/withEnvironment", reqArgs); - return this; + return withEnvironment(name, AspireUnion.of(value)); + } + + public TestRedisResource withEnvironment(String name, ReferenceExpression value) { + return withEnvironment(name, AspireUnion.of(value)); } - /** Adds an environment variable with a reference expression */ - public TestRedisResource withEnvironmentExpression(String name, ReferenceExpression value) { + public TestRedisResource withEnvironment(String name, EndpointReference value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + public TestRedisResource withEnvironment(String name, ParameterResource value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + public TestRedisResource withEnvironment(String name, IResourceWithConnectionString value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + public TestRedisResource withEnvironment(String name, IEnvironmentValue value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + /** Sets an environment variable */ + public TestRedisResource withEnvironment(String name, AspireUnion value) { Map reqArgs = new HashMap<>(); reqArgs.put("builder", AspireClient.serializeValue(getHandle())); reqArgs.put("name", AspireClient.serializeValue(name)); reqArgs.put("value", AspireClient.serializeValue(value)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentExpression", reqArgs); + getClient().invokeCapability("Aspire.Hosting/withEnvironment", reqArgs); return this; } @@ -16448,40 +16359,6 @@ public TestRedisResource withEnvironmentCallback(AspireAction1 reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("name", AspireClient.serializeValue(name)); - reqArgs.put("endpointReference", AspireClient.serializeValue(endpointReference)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentEndpoint", reqArgs); - return this; - } - - /** Sets an environment variable from a parameter resource */ - public TestRedisResource withEnvironmentParameter(String name, ParameterResource parameter) { - Map reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("name", AspireClient.serializeValue(name)); - reqArgs.put("parameter", AspireClient.serializeValue(parameter)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentParameter", reqArgs); - return this; - } - - /** Sets an environment variable from a connection string resource */ - public TestRedisResource withEnvironmentConnectionString(String envVarName, IResourceWithConnectionString resource) { - Map reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("envVarName", AspireClient.serializeValue(envVarName)); - reqArgs.put("resource", AspireClient.serializeValue(resource)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentConnectionString", reqArgs); - return this; - } - - public TestRedisResource withEnvironmentConnectionString(String envVarName, ResourceBuilderBase resource) { - return withEnvironmentConnectionString(envVarName, new IResourceWithConnectionString(resource.getHandle(), resource.getClient())); - } - /** Adds a connection property with a reference expression */ public TestRedisResource withConnectionProperty(String name, ReferenceExpression value) { Map reqArgs = new HashMap<>(); @@ -18176,23 +18053,37 @@ public TestVaultResource withRequiredCommand(String command, String helpLink) { return this; } - /** Sets an environment variable */ public TestVaultResource withEnvironment(String name, String value) { - Map reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("name", AspireClient.serializeValue(name)); - reqArgs.put("value", AspireClient.serializeValue(value)); - getClient().invokeCapability("Aspire.Hosting/withEnvironment", reqArgs); - return this; + return withEnvironment(name, AspireUnion.of(value)); } - /** Adds an environment variable with a reference expression */ - public TestVaultResource withEnvironmentExpression(String name, ReferenceExpression value) { + public TestVaultResource withEnvironment(String name, ReferenceExpression value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + public TestVaultResource withEnvironment(String name, EndpointReference value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + public TestVaultResource withEnvironment(String name, ParameterResource value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + public TestVaultResource withEnvironment(String name, IResourceWithConnectionString value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + public TestVaultResource withEnvironment(String name, IEnvironmentValue value) { + return withEnvironment(name, AspireUnion.of(value)); + } + + /** Sets an environment variable */ + public TestVaultResource withEnvironment(String name, AspireUnion value) { Map reqArgs = new HashMap<>(); reqArgs.put("builder", AspireClient.serializeValue(getHandle())); reqArgs.put("name", AspireClient.serializeValue(name)); reqArgs.put("value", AspireClient.serializeValue(value)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentExpression", reqArgs); + getClient().invokeCapability("Aspire.Hosting/withEnvironment", reqArgs); return this; } @@ -18212,40 +18103,6 @@ public TestVaultResource withEnvironmentCallback(AspireAction1 reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("name", AspireClient.serializeValue(name)); - reqArgs.put("endpointReference", AspireClient.serializeValue(endpointReference)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentEndpoint", reqArgs); - return this; - } - - /** Sets an environment variable from a parameter resource */ - public TestVaultResource withEnvironmentParameter(String name, ParameterResource parameter) { - Map reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("name", AspireClient.serializeValue(name)); - reqArgs.put("parameter", AspireClient.serializeValue(parameter)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentParameter", reqArgs); - return this; - } - - /** Sets an environment variable from a connection string resource */ - public TestVaultResource withEnvironmentConnectionString(String envVarName, IResourceWithConnectionString resource) { - Map reqArgs = new HashMap<>(); - reqArgs.put("builder", AspireClient.serializeValue(getHandle())); - reqArgs.put("envVarName", AspireClient.serializeValue(envVarName)); - reqArgs.put("resource", AspireClient.serializeValue(resource)); - getClient().invokeCapability("Aspire.Hosting/withEnvironmentConnectionString", reqArgs); - return this; - } - - public TestVaultResource withEnvironmentConnectionString(String envVarName, ResourceBuilderBase resource) { - return withEnvironmentConnectionString(envVarName, new IResourceWithConnectionString(resource.getHandle(), resource.getClient())); - } - /** Adds arguments */ public TestVaultResource withArgs(String[] args) { Map reqArgs = new HashMap<>(); @@ -20117,6 +19974,7 @@ public WithVolumeOptions isReadOnly(Boolean value) { .modules/IDistributedApplicationEvent.java .modules/IDistributedApplicationEventing.java .modules/IDistributedApplicationResourceEvent.java +.modules/IEnvironmentValue.java .modules/IHostEnvironment.java .modules/ILogger.java .modules/ILoggerFactory.java diff --git a/tests/Aspire.Hosting.CodeGeneration.Rust.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.rs b/tests/Aspire.Hosting.CodeGeneration.Rust.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.rs index 589382ca04e..6b4f11b2a84 100644 --- a/tests/Aspire.Hosting.CodeGeneration.Rust.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.rs +++ b/tests/Aspire.Hosting.CodeGeneration.Rust.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.rs @@ -859,7 +859,7 @@ impl CSharpAppResource { } /// Sets an environment variable - pub fn with_environment(&self, name: &str, value: &str) -> Result> { + pub fn with_environment(&self, name: &str, value: Value) -> Result> { let mut args: HashMap = HashMap::new(); args.insert("builder".to_string(), self.handle.to_json()); args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); @@ -869,17 +869,6 @@ impl CSharpAppResource { Ok(IResourceWithEnvironment::new(handle, self.client.clone())) } - /// Adds an environment variable with a reference expression - pub fn with_environment_expression(&self, name: &str, value: ReferenceExpression) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); - args.insert("value".to_string(), serde_json::to_value(&value).unwrap_or(Value::Null)); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentExpression", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - /// Sets environment variables via callback pub fn with_environment_callback(&self, callback: impl Fn(Vec) -> Value + Send + Sync + 'static) -> Result> { let mut args: HashMap = HashMap::new(); @@ -891,39 +880,6 @@ impl CSharpAppResource { Ok(IResourceWithEnvironment::new(handle, self.client.clone())) } - /// Sets an environment variable from an endpoint reference - pub fn with_environment_endpoint(&self, name: &str, endpoint_reference: &EndpointReference) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); - args.insert("endpointReference".to_string(), endpoint_reference.handle().to_json()); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentEndpoint", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - - /// Sets an environment variable from a parameter resource - pub fn with_environment_parameter(&self, name: &str, parameter: &ParameterResource) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); - args.insert("parameter".to_string(), parameter.handle().to_json()); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentParameter", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - - /// Sets an environment variable from a connection string resource - pub fn with_environment_connection_string(&self, env_var_name: &str, resource: &IResourceWithConnectionString) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("envVarName".to_string(), serde_json::to_value(&env_var_name).unwrap_or(Value::Null)); - args.insert("resource".to_string(), resource.handle().to_json()); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentConnectionString", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - /// Adds arguments pub fn with_args(&self, args: Vec) -> Result> { let mut args: HashMap = HashMap::new(); @@ -3365,7 +3321,7 @@ impl ContainerResource { } /// Sets an environment variable - pub fn with_environment(&self, name: &str, value: &str) -> Result> { + pub fn with_environment(&self, name: &str, value: Value) -> Result> { let mut args: HashMap = HashMap::new(); args.insert("builder".to_string(), self.handle.to_json()); args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); @@ -3375,17 +3331,6 @@ impl ContainerResource { Ok(IResourceWithEnvironment::new(handle, self.client.clone())) } - /// Adds an environment variable with a reference expression - pub fn with_environment_expression(&self, name: &str, value: ReferenceExpression) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); - args.insert("value".to_string(), serde_json::to_value(&value).unwrap_or(Value::Null)); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentExpression", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - /// Sets environment variables via callback pub fn with_environment_callback(&self, callback: impl Fn(Vec) -> Value + Send + Sync + 'static) -> Result> { let mut args: HashMap = HashMap::new(); @@ -3397,39 +3342,6 @@ impl ContainerResource { Ok(IResourceWithEnvironment::new(handle, self.client.clone())) } - /// Sets an environment variable from an endpoint reference - pub fn with_environment_endpoint(&self, name: &str, endpoint_reference: &EndpointReference) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); - args.insert("endpointReference".to_string(), endpoint_reference.handle().to_json()); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentEndpoint", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - - /// Sets an environment variable from a parameter resource - pub fn with_environment_parameter(&self, name: &str, parameter: &ParameterResource) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); - args.insert("parameter".to_string(), parameter.handle().to_json()); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentParameter", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - - /// Sets an environment variable from a connection string resource - pub fn with_environment_connection_string(&self, env_var_name: &str, resource: &IResourceWithConnectionString) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("envVarName".to_string(), serde_json::to_value(&env_var_name).unwrap_or(Value::Null)); - args.insert("resource".to_string(), resource.handle().to_json()); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentConnectionString", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - /// Adds arguments pub fn with_args(&self, args: Vec) -> Result> { let mut args: HashMap = HashMap::new(); @@ -4733,7 +4645,7 @@ impl DotnetToolResource { } /// Sets an environment variable - pub fn with_environment(&self, name: &str, value: &str) -> Result> { + pub fn with_environment(&self, name: &str, value: Value) -> Result> { let mut args: HashMap = HashMap::new(); args.insert("builder".to_string(), self.handle.to_json()); args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); @@ -4743,17 +4655,6 @@ impl DotnetToolResource { Ok(IResourceWithEnvironment::new(handle, self.client.clone())) } - /// Adds an environment variable with a reference expression - pub fn with_environment_expression(&self, name: &str, value: ReferenceExpression) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); - args.insert("value".to_string(), serde_json::to_value(&value).unwrap_or(Value::Null)); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentExpression", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - /// Sets environment variables via callback pub fn with_environment_callback(&self, callback: impl Fn(Vec) -> Value + Send + Sync + 'static) -> Result> { let mut args: HashMap = HashMap::new(); @@ -4765,39 +4666,6 @@ impl DotnetToolResource { Ok(IResourceWithEnvironment::new(handle, self.client.clone())) } - /// Sets an environment variable from an endpoint reference - pub fn with_environment_endpoint(&self, name: &str, endpoint_reference: &EndpointReference) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); - args.insert("endpointReference".to_string(), endpoint_reference.handle().to_json()); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentEndpoint", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - - /// Sets an environment variable from a parameter resource - pub fn with_environment_parameter(&self, name: &str, parameter: &ParameterResource) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); - args.insert("parameter".to_string(), parameter.handle().to_json()); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentParameter", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - - /// Sets an environment variable from a connection string resource - pub fn with_environment_connection_string(&self, env_var_name: &str, resource: &IResourceWithConnectionString) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("envVarName".to_string(), serde_json::to_value(&env_var_name).unwrap_or(Value::Null)); - args.insert("resource".to_string(), resource.handle().to_json()); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentConnectionString", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - /// Adds arguments pub fn with_args(&self, args: Vec) -> Result> { let mut args: HashMap = HashMap::new(); @@ -6089,7 +5957,7 @@ impl ExecutableResource { } /// Sets an environment variable - pub fn with_environment(&self, name: &str, value: &str) -> Result> { + pub fn with_environment(&self, name: &str, value: Value) -> Result> { let mut args: HashMap = HashMap::new(); args.insert("builder".to_string(), self.handle.to_json()); args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); @@ -6099,17 +5967,6 @@ impl ExecutableResource { Ok(IResourceWithEnvironment::new(handle, self.client.clone())) } - /// Adds an environment variable with a reference expression - pub fn with_environment_expression(&self, name: &str, value: ReferenceExpression) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); - args.insert("value".to_string(), serde_json::to_value(&value).unwrap_or(Value::Null)); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentExpression", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - /// Sets environment variables via callback pub fn with_environment_callback(&self, callback: impl Fn(Vec) -> Value + Send + Sync + 'static) -> Result> { let mut args: HashMap = HashMap::new(); @@ -6121,39 +5978,6 @@ impl ExecutableResource { Ok(IResourceWithEnvironment::new(handle, self.client.clone())) } - /// Sets an environment variable from an endpoint reference - pub fn with_environment_endpoint(&self, name: &str, endpoint_reference: &EndpointReference) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); - args.insert("endpointReference".to_string(), endpoint_reference.handle().to_json()); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentEndpoint", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - - /// Sets an environment variable from a parameter resource - pub fn with_environment_parameter(&self, name: &str, parameter: &ParameterResource) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); - args.insert("parameter".to_string(), parameter.handle().to_json()); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentParameter", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - - /// Sets an environment variable from a connection string resource - pub fn with_environment_connection_string(&self, env_var_name: &str, resource: &IResourceWithConnectionString) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("envVarName".to_string(), serde_json::to_value(&env_var_name).unwrap_or(Value::Null)); - args.insert("resource".to_string(), resource.handle().to_json()); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentConnectionString", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - /// Adds arguments pub fn with_args(&self, args: Vec) -> Result> { let mut args: HashMap = HashMap::new(); @@ -8248,6 +8072,32 @@ impl IDistributedApplicationResourceEvent { } } +/// Wrapper for Aspire.Hosting/Aspire.Hosting.ApplicationModel.IEnvironmentValue +pub struct IEnvironmentValue { + handle: Handle, + client: Arc, +} + +impl HasHandle for IEnvironmentValue { + fn handle(&self) -> &Handle { + &self.handle + } +} + +impl IEnvironmentValue { + pub fn new(handle: Handle, client: Arc) -> Self { + Self { handle, client } + } + + pub fn handle(&self) -> &Handle { + &self.handle + } + + pub fn client(&self) -> &Arc { + &self.client + } +} + /// Wrapper for Microsoft.Extensions.Hosting.Abstractions/Microsoft.Extensions.Hosting.IHostEnvironment pub struct IHostEnvironment { handle: Handle, @@ -10315,7 +10165,7 @@ impl ProjectResource { } /// Sets an environment variable - pub fn with_environment(&self, name: &str, value: &str) -> Result> { + pub fn with_environment(&self, name: &str, value: Value) -> Result> { let mut args: HashMap = HashMap::new(); args.insert("builder".to_string(), self.handle.to_json()); args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); @@ -10325,17 +10175,6 @@ impl ProjectResource { Ok(IResourceWithEnvironment::new(handle, self.client.clone())) } - /// Adds an environment variable with a reference expression - pub fn with_environment_expression(&self, name: &str, value: ReferenceExpression) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); - args.insert("value".to_string(), serde_json::to_value(&value).unwrap_or(Value::Null)); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentExpression", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - /// Sets environment variables via callback pub fn with_environment_callback(&self, callback: impl Fn(Vec) -> Value + Send + Sync + 'static) -> Result> { let mut args: HashMap = HashMap::new(); @@ -10347,39 +10186,6 @@ impl ProjectResource { Ok(IResourceWithEnvironment::new(handle, self.client.clone())) } - /// Sets an environment variable from an endpoint reference - pub fn with_environment_endpoint(&self, name: &str, endpoint_reference: &EndpointReference) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); - args.insert("endpointReference".to_string(), endpoint_reference.handle().to_json()); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentEndpoint", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - - /// Sets an environment variable from a parameter resource - pub fn with_environment_parameter(&self, name: &str, parameter: &ParameterResource) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); - args.insert("parameter".to_string(), parameter.handle().to_json()); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentParameter", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - - /// Sets an environment variable from a connection string resource - pub fn with_environment_connection_string(&self, env_var_name: &str, resource: &IResourceWithConnectionString) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("envVarName".to_string(), serde_json::to_value(&env_var_name).unwrap_or(Value::Null)); - args.insert("resource".to_string(), resource.handle().to_json()); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentConnectionString", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - /// Adds arguments pub fn with_args(&self, args: Vec) -> Result> { let mut args: HashMap = HashMap::new(); @@ -12144,7 +11950,7 @@ impl TestDatabaseResource { } /// Sets an environment variable - pub fn with_environment(&self, name: &str, value: &str) -> Result> { + pub fn with_environment(&self, name: &str, value: Value) -> Result> { let mut args: HashMap = HashMap::new(); args.insert("builder".to_string(), self.handle.to_json()); args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); @@ -12154,17 +11960,6 @@ impl TestDatabaseResource { Ok(IResourceWithEnvironment::new(handle, self.client.clone())) } - /// Adds an environment variable with a reference expression - pub fn with_environment_expression(&self, name: &str, value: ReferenceExpression) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); - args.insert("value".to_string(), serde_json::to_value(&value).unwrap_or(Value::Null)); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentExpression", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - /// Sets environment variables via callback pub fn with_environment_callback(&self, callback: impl Fn(Vec) -> Value + Send + Sync + 'static) -> Result> { let mut args: HashMap = HashMap::new(); @@ -12176,39 +11971,6 @@ impl TestDatabaseResource { Ok(IResourceWithEnvironment::new(handle, self.client.clone())) } - /// Sets an environment variable from an endpoint reference - pub fn with_environment_endpoint(&self, name: &str, endpoint_reference: &EndpointReference) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); - args.insert("endpointReference".to_string(), endpoint_reference.handle().to_json()); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentEndpoint", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - - /// Sets an environment variable from a parameter resource - pub fn with_environment_parameter(&self, name: &str, parameter: &ParameterResource) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); - args.insert("parameter".to_string(), parameter.handle().to_json()); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentParameter", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - - /// Sets an environment variable from a connection string resource - pub fn with_environment_connection_string(&self, env_var_name: &str, resource: &IResourceWithConnectionString) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("envVarName".to_string(), serde_json::to_value(&env_var_name).unwrap_or(Value::Null)); - args.insert("resource".to_string(), resource.handle().to_json()); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentConnectionString", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - /// Adds arguments pub fn with_args(&self, args: Vec) -> Result> { let mut args: HashMap = HashMap::new(); @@ -13440,7 +13202,7 @@ impl TestRedisResource { } /// Sets an environment variable - pub fn with_environment(&self, name: &str, value: &str) -> Result> { + pub fn with_environment(&self, name: &str, value: Value) -> Result> { let mut args: HashMap = HashMap::new(); args.insert("builder".to_string(), self.handle.to_json()); args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); @@ -13450,17 +13212,6 @@ impl TestRedisResource { Ok(IResourceWithEnvironment::new(handle, self.client.clone())) } - /// Adds an environment variable with a reference expression - pub fn with_environment_expression(&self, name: &str, value: ReferenceExpression) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); - args.insert("value".to_string(), serde_json::to_value(&value).unwrap_or(Value::Null)); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentExpression", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - /// Sets environment variables via callback pub fn with_environment_callback(&self, callback: impl Fn(Vec) -> Value + Send + Sync + 'static) -> Result> { let mut args: HashMap = HashMap::new(); @@ -13472,39 +13223,6 @@ impl TestRedisResource { Ok(IResourceWithEnvironment::new(handle, self.client.clone())) } - /// Sets an environment variable from an endpoint reference - pub fn with_environment_endpoint(&self, name: &str, endpoint_reference: &EndpointReference) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); - args.insert("endpointReference".to_string(), endpoint_reference.handle().to_json()); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentEndpoint", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - - /// Sets an environment variable from a parameter resource - pub fn with_environment_parameter(&self, name: &str, parameter: &ParameterResource) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); - args.insert("parameter".to_string(), parameter.handle().to_json()); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentParameter", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - - /// Sets an environment variable from a connection string resource - pub fn with_environment_connection_string(&self, env_var_name: &str, resource: &IResourceWithConnectionString) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("envVarName".to_string(), serde_json::to_value(&env_var_name).unwrap_or(Value::Null)); - args.insert("resource".to_string(), resource.handle().to_json()); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentConnectionString", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - /// Adds a connection property with a reference expression pub fn with_connection_property(&self, name: &str, value: ReferenceExpression) -> Result> { let mut args: HashMap = HashMap::new(); @@ -14900,7 +14618,7 @@ impl TestVaultResource { } /// Sets an environment variable - pub fn with_environment(&self, name: &str, value: &str) -> Result> { + pub fn with_environment(&self, name: &str, value: Value) -> Result> { let mut args: HashMap = HashMap::new(); args.insert("builder".to_string(), self.handle.to_json()); args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); @@ -14910,17 +14628,6 @@ impl TestVaultResource { Ok(IResourceWithEnvironment::new(handle, self.client.clone())) } - /// Adds an environment variable with a reference expression - pub fn with_environment_expression(&self, name: &str, value: ReferenceExpression) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); - args.insert("value".to_string(), serde_json::to_value(&value).unwrap_or(Value::Null)); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentExpression", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - /// Sets environment variables via callback pub fn with_environment_callback(&self, callback: impl Fn(Vec) -> Value + Send + Sync + 'static) -> Result> { let mut args: HashMap = HashMap::new(); @@ -14932,39 +14639,6 @@ impl TestVaultResource { Ok(IResourceWithEnvironment::new(handle, self.client.clone())) } - /// Sets an environment variable from an endpoint reference - pub fn with_environment_endpoint(&self, name: &str, endpoint_reference: &EndpointReference) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); - args.insert("endpointReference".to_string(), endpoint_reference.handle().to_json()); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentEndpoint", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - - /// Sets an environment variable from a parameter resource - pub fn with_environment_parameter(&self, name: &str, parameter: &ParameterResource) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("name".to_string(), serde_json::to_value(&name).unwrap_or(Value::Null)); - args.insert("parameter".to_string(), parameter.handle().to_json()); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentParameter", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - - /// Sets an environment variable from a connection string resource - pub fn with_environment_connection_string(&self, env_var_name: &str, resource: &IResourceWithConnectionString) -> Result> { - let mut args: HashMap = HashMap::new(); - args.insert("builder".to_string(), self.handle.to_json()); - args.insert("envVarName".to_string(), serde_json::to_value(&env_var_name).unwrap_or(Value::Null)); - args.insert("resource".to_string(), resource.handle().to_json()); - let result = self.client.invoke_capability("Aspire.Hosting/withEnvironmentConnectionString", args)?; - let handle: Handle = serde_json::from_value(result)?; - Ok(IResourceWithEnvironment::new(handle, self.client.clone())) - } - /// Adds arguments pub fn with_args(&self, args: Vec) -> Result> { let mut args: HashMap = HashMap::new(); From a7208004554cd30f22556c05977aaddd443d6d02 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Fri, 27 Mar 2026 13:53:23 -0700 Subject: [PATCH 5/5] Fix Java withEnvironment generation Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../ValidationAppHost/AppHost.java | 8 +-- .../ValidationAppHost/AppHost.java | 6 +- .../AtsJavaCodeGenerator.cs | 53 +++++++++++++++ ...oPassScanningGeneratedAspire.verified.java | 64 +++++++++++++++++++ 4 files changed, 124 insertions(+), 7 deletions(-) diff --git a/playground/polyglot/Java/Aspire.Hosting.Azure/ValidationAppHost/AppHost.java b/playground/polyglot/Java/Aspire.Hosting.Azure/ValidationAppHost/AppHost.java index 27e1b57f5a3..ddb56b64070 100644 --- a/playground/polyglot/Java/Aspire.Hosting.Azure/ValidationAppHost/AppHost.java +++ b/playground/polyglot/Java/Aspire.Hosting.Azure/ValidationAppHost/AppHost.java @@ -73,11 +73,11 @@ void main() throws Exception { identity.publishAsExisting("identity-existing", "rg-identity"); identity.publishAsExistingFromParameters(existingName, existingResourceGroup); identity.asExisting(existingName, existingResourceGroup); - container.withEnvironmentFromOutput("INFRA_URL", infrastructureOutput); - container.withEnvironmentFromKeyVaultSecret("SECRET_FROM_IDENTITY", identity); + container.withEnvironment("INFRA_URL", infrastructureOutput); + container.withEnvironment("SECRET_FROM_IDENTITY", identity); container.withAzureUserAssignedIdentity(identity); - executable.withEnvironmentFromOutput("INFRA_URL", infrastructureOutput); - executable.withEnvironmentFromKeyVaultSecret("SECRET_FROM_IDENTITY", identity); + executable.withEnvironment("INFRA_URL", infrastructureOutput); + executable.withEnvironment("SECRET_FROM_IDENTITY", identity); executable.withAzureUserAssignedIdentity(identity); builder.build().run(); } diff --git a/playground/polyglot/Java/Aspire.Hosting/ValidationAppHost/AppHost.java b/playground/polyglot/Java/Aspire.Hosting/ValidationAppHost/AppHost.java index 201380007ae..6e29c263266 100644 --- a/playground/polyglot/Java/Aspire.Hosting/ValidationAppHost/AppHost.java +++ b/playground/polyglot/Java/Aspire.Hosting/ValidationAppHost/AppHost.java @@ -19,9 +19,9 @@ void main() throws Exception { var builtConnectionString = builder.addConnectionStringBuilder("customcs", (connectionStringBuilder) -> { var _isEmpty = connectionStringBuilder.isEmpty(); connectionStringBuilder.appendLiteral("Host="); connectionStringBuilder.appendValueProvider(endpoint); connectionStringBuilder.appendLiteral(";Key="); connectionStringBuilder.appendValueProvider(secretParam); var _builtExpression = connectionStringBuilder.build(); }); builtConnectionString.withConnectionProperty("Host", expr); builtConnectionString.withConnectionPropertyValue("Mode", "Development"); - container.withEnvironmentEndpoint("MY_ENDPOINT", endpoint); - container.withEnvironmentParameter("MY_PARAM", configParam); - container.withEnvironmentConnectionString("MY_CONN", builtConnectionString); + container.withEnvironment("MY_ENDPOINT", endpoint); + container.withEnvironment("MY_PARAM", configParam); + container.withEnvironment("MY_CONN", builtConnectionString); builtConnectionString.withConnectionProperty("Endpoint", expr); builtConnectionString.withConnectionPropertyValue("Protocol", "https"); container.excludeFromManifest(); diff --git a/src/Aspire.Hosting.CodeGeneration.Java/AtsJavaCodeGenerator.cs b/src/Aspire.Hosting.CodeGeneration.Java/AtsJavaCodeGenerator.cs index 3c1b88482b8..8b1ad20e520 100644 --- a/src/Aspire.Hosting.CodeGeneration.Java/AtsJavaCodeGenerator.cs +++ b/src/Aspire.Hosting.CodeGeneration.Java/AtsJavaCodeGenerator.cs @@ -756,6 +756,11 @@ private List CreateMethodParameters(IEnumerable ReferenceEquals(parameter, unionParameter) ? $"{MapInputTypeToJava(unionType, unionParameter.IsOptional || unionParameter.IsNullable)} {ToCamelCase(parameter.Name)}" : $"{MapParameterToJava(parameter)} {ToCamelCase(parameter.Name)}"))}) {{"); if (returnInfo.HasReturn) { @@ -1126,6 +1145,40 @@ private void GenerateUnionOverloadsWithOptions( } } + private List CreateUnionMethodParameters( + List parameters, + AtsParameterInfo unionParameter, + AtsTypeRef unionType) + { + var result = new List(parameters.Count); + + foreach (var parameter in parameters) + { + var parameterName = ToCamelCase(parameter.Name); + + if (!ReferenceEquals(parameter, unionParameter)) + { + var (parameterResourceWrapperType, parameterResourceWrapperParameterType) = GetResourceBuilderWrapperType(parameter); + result.Add(new JavaMethodParameter( + MapParameterToJava(parameter), + parameterName, + parameterResourceWrapperType, + parameterResourceWrapperParameterType)); + continue; + } + + var parameterType = MapInputTypeToJava(unionType, unionParameter.IsOptional || unionParameter.IsNullable); + var (resourceWrapperType, resourceWrapperParameterType) = GetResourceBuilderWrapperType(parameterType); + result.Add(new JavaMethodParameter( + parameterType, + parameterName, + resourceWrapperType, + resourceWrapperParameterType)); + } + + return result; + } + private void GenerateOptionsOverloads( AtsCapabilityInfo capability, JavaCapabilityReturnInfo returnInfo, diff --git a/tests/Aspire.Hosting.CodeGeneration.Java.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.java b/tests/Aspire.Hosting.CodeGeneration.Java.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.java index 6596d1f0249..52b35d7eea5 100644 --- a/tests/Aspire.Hosting.CodeGeneration.Java.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.java +++ b/tests/Aspire.Hosting.CodeGeneration.Java.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.java @@ -1385,10 +1385,18 @@ public CSharpAppResource withEnvironment(String name, IResourceWithConnectionStr return withEnvironment(name, AspireUnion.of(value)); } + public CSharpAppResource withEnvironment(String name, ResourceBuilderBase value) { + return withEnvironment(name, new IResourceWithConnectionString(value.getHandle(), value.getClient())); + } + public CSharpAppResource withEnvironment(String name, IEnvironmentValue value) { return withEnvironment(name, AspireUnion.of(value)); } + public CSharpAppResource withEnvironment(String name, HandleWrapperBase value) { + return withEnvironment(name, new IEnvironmentValue(value.getHandle(), value.getClient())); + } + /** Sets an environment variable */ public CSharpAppResource withEnvironment(String name, AspireUnion value) { Map reqArgs = new HashMap<>(); @@ -4644,10 +4652,18 @@ public ContainerResource withEnvironment(String name, IResourceWithConnectionStr return withEnvironment(name, AspireUnion.of(value)); } + public ContainerResource withEnvironment(String name, ResourceBuilderBase value) { + return withEnvironment(name, new IResourceWithConnectionString(value.getHandle(), value.getClient())); + } + public ContainerResource withEnvironment(String name, IEnvironmentValue value) { return withEnvironment(name, AspireUnion.of(value)); } + public ContainerResource withEnvironment(String name, HandleWrapperBase value) { + return withEnvironment(name, new IEnvironmentValue(value.getHandle(), value.getClient())); + } + /** Sets an environment variable */ public ContainerResource withEnvironment(String name, AspireUnion value) { Map reqArgs = new HashMap<>(); @@ -6274,10 +6290,18 @@ public DotnetToolResource withEnvironment(String name, IResourceWithConnectionSt return withEnvironment(name, AspireUnion.of(value)); } + public DotnetToolResource withEnvironment(String name, ResourceBuilderBase value) { + return withEnvironment(name, new IResourceWithConnectionString(value.getHandle(), value.getClient())); + } + public DotnetToolResource withEnvironment(String name, IEnvironmentValue value) { return withEnvironment(name, AspireUnion.of(value)); } + public DotnetToolResource withEnvironment(String name, HandleWrapperBase value) { + return withEnvironment(name, new IEnvironmentValue(value.getHandle(), value.getClient())); + } + /** Sets an environment variable */ public DotnetToolResource withEnvironment(String name, AspireUnion value) { Map reqArgs = new HashMap<>(); @@ -7843,10 +7867,18 @@ public ExecutableResource withEnvironment(String name, IResourceWithConnectionSt return withEnvironment(name, AspireUnion.of(value)); } + public ExecutableResource withEnvironment(String name, ResourceBuilderBase value) { + return withEnvironment(name, new IResourceWithConnectionString(value.getHandle(), value.getClient())); + } + public ExecutableResource withEnvironment(String name, IEnvironmentValue value) { return withEnvironment(name, AspireUnion.of(value)); } + public ExecutableResource withEnvironment(String name, HandleWrapperBase value) { + return withEnvironment(name, new IEnvironmentValue(value.getHandle(), value.getClient())); + } + /** Sets an environment variable */ public ExecutableResource withEnvironment(String name, AspireUnion value) { Map reqArgs = new HashMap<>(); @@ -12427,10 +12459,18 @@ public ProjectResource withEnvironment(String name, IResourceWithConnectionStrin return withEnvironment(name, AspireUnion.of(value)); } + public ProjectResource withEnvironment(String name, ResourceBuilderBase value) { + return withEnvironment(name, new IResourceWithConnectionString(value.getHandle(), value.getClient())); + } + public ProjectResource withEnvironment(String name, IEnvironmentValue value) { return withEnvironment(name, AspireUnion.of(value)); } + public ProjectResource withEnvironment(String name, HandleWrapperBase value) { + return withEnvironment(name, new IEnvironmentValue(value.getHandle(), value.getClient())); + } + /** Sets an environment variable */ public ProjectResource withEnvironment(String name, AspireUnion value) { Map reqArgs = new HashMap<>(); @@ -14722,10 +14762,18 @@ public TestDatabaseResource withEnvironment(String name, IResourceWithConnection return withEnvironment(name, AspireUnion.of(value)); } + public TestDatabaseResource withEnvironment(String name, ResourceBuilderBase value) { + return withEnvironment(name, new IResourceWithConnectionString(value.getHandle(), value.getClient())); + } + public TestDatabaseResource withEnvironment(String name, IEnvironmentValue value) { return withEnvironment(name, AspireUnion.of(value)); } + public TestDatabaseResource withEnvironment(String name, HandleWrapperBase value) { + return withEnvironment(name, new IEnvironmentValue(value.getHandle(), value.getClient())); + } + /** Sets an environment variable */ public TestDatabaseResource withEnvironment(String name, AspireUnion value) { Map reqArgs = new HashMap<>(); @@ -16329,10 +16377,18 @@ public TestRedisResource withEnvironment(String name, IResourceWithConnectionStr return withEnvironment(name, AspireUnion.of(value)); } + public TestRedisResource withEnvironment(String name, ResourceBuilderBase value) { + return withEnvironment(name, new IResourceWithConnectionString(value.getHandle(), value.getClient())); + } + public TestRedisResource withEnvironment(String name, IEnvironmentValue value) { return withEnvironment(name, AspireUnion.of(value)); } + public TestRedisResource withEnvironment(String name, HandleWrapperBase value) { + return withEnvironment(name, new IEnvironmentValue(value.getHandle(), value.getClient())); + } + /** Sets an environment variable */ public TestRedisResource withEnvironment(String name, AspireUnion value) { Map reqArgs = new HashMap<>(); @@ -18073,10 +18129,18 @@ public TestVaultResource withEnvironment(String name, IResourceWithConnectionStr return withEnvironment(name, AspireUnion.of(value)); } + public TestVaultResource withEnvironment(String name, ResourceBuilderBase value) { + return withEnvironment(name, new IResourceWithConnectionString(value.getHandle(), value.getClient())); + } + public TestVaultResource withEnvironment(String name, IEnvironmentValue value) { return withEnvironment(name, AspireUnion.of(value)); } + public TestVaultResource withEnvironment(String name, HandleWrapperBase value) { + return withEnvironment(name, new IEnvironmentValue(value.getHandle(), value.getClient())); + } + /** Sets an environment variable */ public TestVaultResource withEnvironment(String name, AspireUnion value) { Map reqArgs = new HashMap<>();