From 21e5ed25041a2f8e0b95074f7f194611975d54ba Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Fri, 27 Mar 2026 11:00:54 -0700 Subject: [PATCH 1/7] 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/7] 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/7] 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/7] 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/7] 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<>(); From b5350e8aeea413a92227cf793c43f3154b98ebb1 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Mon, 30 Mar 2026 09:58:01 -0700 Subject: [PATCH 6/7] Simplify ATS withEnvironment exports Keep the new IExpressionValue-based C# abstraction while collapsing ATS back to a single preview-only withEnvironment export. Update generated ATS artifacts and polyglot codegen snapshots to match the unified surface. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../AzureKeyVaultSecretReference.cs | 10 +- .../AzureKeyVaultSecretResource.cs | 10 +- .../AzureBicepResource.cs | 12 +- .../AzureBicepResourceExtensions.cs | 4 +- .../IAzureKeyVaultSecretReference.cs | 2 +- .../ConnectionStringReference.cs | 2 +- .../ApplicationModel/EndpointReference.cs | 4 +- .../ApplicationModel/HostUrl.cs | 2 +- .../ApplicationModel/IEnvironmentValue.cs | 16 -- .../ApplicationModel/IExpressionValue.cs | 16 ++ .../IResourceWithConnectionString.cs | 2 +- .../IValueWithCustomWithEnvironment.cs | 35 --- .../ApplicationModel/ParameterResource.cs | 2 +- .../ApplicationModel/ReferenceExpression.cs | 2 +- .../ResourceBuilderExtensions.cs | 76 ++---- .../api/Aspire.Hosting.Capabilities.txt | 4 +- .../AddTestRedisCapability.verified.txt | 76 +++++- ...TwoPassScanningGeneratedAspire.verified.go | 14 +- .../WithOptionalStringCapability.verified.txt | 76 +++++- .../WithPersistenceCapability.verified.txt | 228 ++++++++++++++++-- .../AddTestRedisCapability.verified.txt | 76 +++++- ...oPassScanningGeneratedAspire.verified.java | 46 ++-- .../WithOptionalStringCapability.verified.txt | 76 +++++- .../WithPersistenceCapability.verified.txt | 228 ++++++++++++++++-- .../AddTestRedisCapability.verified.txt | 76 +++++- .../Snapshots/AtsGeneratedAspire.verified.py | 9 +- ...TwoPassScanningGeneratedAspire.verified.py | 58 ++--- .../WithOptionalStringCapability.verified.txt | 76 +++++- .../WithPersistenceCapability.verified.txt | 228 ++++++++++++++++-- .../AddTestRedisCapability.verified.txt | 76 +++++- ...TwoPassScanningGeneratedAspire.verified.rs | 8 +- .../WithOptionalStringCapability.verified.txt | 76 +++++- .../WithPersistenceCapability.verified.txt | 228 ++++++++++++++++-- .../AddTestRedisCapability.verified.txt | 76 +++++- ...TwoPassScanningGeneratedAspire.verified.ts | 54 ++--- .../WithOptionalStringCapability.verified.txt | 76 +++++- .../WithPersistenceCapability.verified.txt | 228 ++++++++++++++++-- .../WithRedisSpecificCapability.verified.txt | 228 ++++++++++++++++-- 38 files changed, 2111 insertions(+), 405 deletions(-) delete mode 100644 src/Aspire.Hosting/ApplicationModel/IEnvironmentValue.cs create mode 100644 src/Aspire.Hosting/ApplicationModel/IExpressionValue.cs delete mode 100644 src/Aspire.Hosting/ApplicationModel/IValueWithCustomWithEnvironment.cs diff --git a/src/Aspire.Hosting.Azure.KeyVault/AzureKeyVaultSecretReference.cs b/src/Aspire.Hosting.Azure.KeyVault/AzureKeyVaultSecretReference.cs index c8779664861..dfc0da70cee 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, IValueWithCustomWithEnvironment +internal sealed class AzureKeyVaultSecretReference(string secretName, AzureKeyVaultResource azureKeyVaultResource) : IAzureKeyVaultSecretReference { /// /// Gets the name of the secret. @@ -38,12 +38,4 @@ 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 2827061b037..526d47dbe3a 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, IValueWithCustomWithEnvironment + : Resource(name), IResourceWithParent, IAzureKeyVaultSecretReference { private readonly IAzureKeyVaultSecretReference _secret = parent.GetSecret(secretName); @@ -53,12 +53,4 @@ 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 0fa311eb82f..42f923c9818 100644 --- a/src/Aspire.Hosting.Azure/AzureBicepResource.cs +++ b/src/Aspire.Hosting.Azure/AzureBicepResource.cs @@ -573,7 +573,7 @@ public void Dispose() /// The name of the KeyVault secret. /// The . [Obsolete("BicepSecretOutputReference is no longer supported. Use IAzureKeyVaultResource instead.")] -public sealed class BicepSecretOutputReference(string name, AzureBicepResource resource) : IManifestExpressionProvider, IValueProvider, IValueWithReferences +public sealed class BicepSecretOutputReference(string name, AzureBicepResource resource) : IExpressionValue, IValueWithReferences { /// /// Name of the KeyVault secret. @@ -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, IValueWithCustomWithEnvironment, IEquatable +public sealed class BicepOutputReference(string name, AzureBicepResource resource) : IExpressionValue, IValueWithReferences, IEquatable { /// /// Name of the output. @@ -686,12 +686,4 @@ 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 61422ae126f..e996348d411 100644 --- a/src/Aspire.Hosting.Azure/AzureBicepResourceExtensions.cs +++ b/src/Aspire.Hosting.Azure/AzureBicepResourceExtensions.cs @@ -82,7 +82,7 @@ public static BicepSecretOutputReference GetSecretOutput(this IResourceBuilder WithEnvironment(this IResourceBuilder builder, string name, BicepOutputReference bicepOutputReference) where T : IResourceWithEnvironment { - return ResourceBuilderExtensions.WithEnvironment(builder, name, bicepOutputReference); + return builder.WithEnvironment(name, (IExpressionValue)bicepOutputReference); } /// @@ -115,7 +115,7 @@ public static IResourceBuilder WithEnvironment(this IResourceBuilder bu public static IResourceBuilder WithEnvironment(this IResourceBuilder builder, string name, IAzureKeyVaultSecretReference secretReference) where T : IResourceWithEnvironment { - return ResourceBuilderExtensions.WithEnvironment(builder, name, secretReference); + return builder.WithEnvironment(name, (IExpressionValue)secretReference); } /// diff --git a/src/Aspire.Hosting.Azure/IAzureKeyVaultSecretReference.cs b/src/Aspire.Hosting.Azure/IAzureKeyVaultSecretReference.cs index 89d98fcb8a9..215b217b49c 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 : IEnvironmentValue, IValueWithReferences +public interface IAzureKeyVaultSecretReference : IExpressionValue, IValueWithReferences { /// /// Gets the name of the secret. diff --git a/src/Aspire.Hosting/ApplicationModel/ConnectionStringReference.cs b/src/Aspire.Hosting/ApplicationModel/ConnectionStringReference.cs index 9d464b9cd6e..4fe74a5765e 100644 --- a/src/Aspire.Hosting/ApplicationModel/ConnectionStringReference.cs +++ b/src/Aspire.Hosting/ApplicationModel/ConnectionStringReference.cs @@ -5,7 +5,7 @@ namespace Aspire.Hosting.ApplicationModel; /// /// Represents a reference to a connection string. /// -public class ConnectionStringReference(IResourceWithConnectionString resource, bool optional) : IManifestExpressionProvider, IValueProvider, IValueWithReferences +public class ConnectionStringReference(IResourceWithConnectionString resource, bool optional) : IExpressionValue, IValueWithReferences { /// /// The resource that the connection string is referencing. diff --git a/src/Aspire.Hosting/ApplicationModel/EndpointReference.cs b/src/Aspire.Hosting/ApplicationModel/EndpointReference.cs index 9ced43243de..6a262773367 100644 --- a/src/Aspire.Hosting/ApplicationModel/EndpointReference.cs +++ b/src/Aspire.Hosting/ApplicationModel/EndpointReference.cs @@ -11,7 +11,7 @@ namespace Aspire.Hosting.ApplicationModel; /// [AspireExport(ExposeProperties = true)] [DebuggerDisplay("Resource = {Resource.Name}, EndpointName = {EndpointName}, IsAllocated = {IsAllocated}")] -public sealed class EndpointReference : IManifestExpressionProvider, IValueProvider, IValueWithReferences +public sealed class EndpointReference : IExpressionValue, IValueWithReferences { // A reference to the endpoint annotation if it exists. private EndpointAnnotation? _endpointAnnotation; @@ -298,7 +298,7 @@ public EndpointReference(IResourceWithEndpoints owner, string endpointName): thi /// The property of the endpoint. [AspireExport(ExposeProperties = true)] [DebuggerDisplay("EndpointExpression = {ValueExpression}, Property = {Property}, Endpoint = {Endpoint.EndpointName}")] -public class EndpointReferenceExpression(EndpointReference endpointReference, EndpointProperty property) : IManifestExpressionProvider, IValueProvider, IValueWithReferences +public class EndpointReferenceExpression(EndpointReference endpointReference, EndpointProperty property) : IExpressionValue, IValueWithReferences { /// /// Gets the . diff --git a/src/Aspire.Hosting/ApplicationModel/HostUrl.cs b/src/Aspire.Hosting/ApplicationModel/HostUrl.cs index 1a3d4a5fc49..4824864db45 100644 --- a/src/Aspire.Hosting/ApplicationModel/HostUrl.cs +++ b/src/Aspire.Hosting/ApplicationModel/HostUrl.cs @@ -11,7 +11,7 @@ namespace Aspire.Hosting.ApplicationModel; /// Represents a URL on the host machine. When referenced in a container resource, localhost will be /// replaced with the configured container host name. /// -public record HostUrl(string Url) : IValueProvider, IManifestExpressionProvider +public record HostUrl(string Url) : IExpressionValue { // Goes into the manifest as a value, not an expression string IManifestExpressionProvider.ValueExpression => Url; diff --git a/src/Aspire.Hosting/ApplicationModel/IEnvironmentValue.cs b/src/Aspire.Hosting/ApplicationModel/IEnvironmentValue.cs deleted file mode 100644 index 60bee96a945..00000000000 --- a/src/Aspire.Hosting/ApplicationModel/IEnvironmentValue.cs +++ /dev/null @@ -1,16 +0,0 @@ -// 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/IExpressionValue.cs b/src/Aspire.Hosting/ApplicationModel/IExpressionValue.cs new file mode 100644 index 00000000000..f3722b7558e --- /dev/null +++ b/src/Aspire.Hosting/ApplicationModel/IExpressionValue.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 provides both a runtime value and a manifest expression. +/// +/// +/// Expression values can be used anywhere both a runtime value and a publish-time +/// manifest expression are needed. +/// +[AspireExport] +public interface IExpressionValue : IValueProvider, IManifestExpressionProvider +{ +} diff --git a/src/Aspire.Hosting/ApplicationModel/IResourceWithConnectionString.cs b/src/Aspire.Hosting/ApplicationModel/IResourceWithConnectionString.cs index c60dfb1f1a3..4891764af09 100644 --- a/src/Aspire.Hosting/ApplicationModel/IResourceWithConnectionString.cs +++ b/src/Aspire.Hosting/ApplicationModel/IResourceWithConnectionString.cs @@ -6,7 +6,7 @@ namespace Aspire.Hosting.ApplicationModel; /// /// Represents a resource that has a connection string associated with it. /// -public interface IResourceWithConnectionString : IResource, IManifestExpressionProvider, IValueProvider, IValueWithReferences +public interface IResourceWithConnectionString : IResource, IExpressionValue, IValueWithReferences { /// /// Gets the connection string associated with the resource. diff --git a/src/Aspire.Hosting/ApplicationModel/IValueWithCustomWithEnvironment.cs b/src/Aspire.Hosting/ApplicationModel/IValueWithCustomWithEnvironment.cs deleted file mode 100644 index f2fe074b5a3..00000000000 --- a/src/Aspire.Hosting/ApplicationModel/IValueWithCustomWithEnvironment.cs +++ /dev/null @@ -1,35 +0,0 @@ -// 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 -/// handling. -/// -[Experimental("ASPIREATS001")] -public interface IValueWithCustomWithEnvironment : IEnvironmentValue - where TSelf : IEnvironmentValue, 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/ApplicationModel/ParameterResource.cs b/src/Aspire.Hosting/ApplicationModel/ParameterResource.cs index e5f57fb85cd..02268583968 100644 --- a/src/Aspire.Hosting/ApplicationModel/ParameterResource.cs +++ b/src/Aspire.Hosting/ApplicationModel/ParameterResource.cs @@ -9,7 +9,7 @@ namespace Aspire.Hosting.ApplicationModel; /// /// Represents a parameter resource. /// -public class ParameterResource : Resource, IManifestExpressionProvider, IValueProvider +public class ParameterResource : Resource, IExpressionValue { private readonly Lazy _lazyValue; private readonly Func _valueGetter; diff --git a/src/Aspire.Hosting/ApplicationModel/ReferenceExpression.cs b/src/Aspire.Hosting/ApplicationModel/ReferenceExpression.cs index 0dfb1b7a024..944c0bc17ec 100644 --- a/src/Aspire.Hosting/ApplicationModel/ReferenceExpression.cs +++ b/src/Aspire.Hosting/ApplicationModel/ReferenceExpression.cs @@ -27,7 +27,7 @@ namespace Aspire.Hosting.ApplicationModel; /// [AspireExport] [DebuggerDisplay("ReferenceExpression = {ValueExpression}, Providers = {ValueProviders.Count}")] -public class ReferenceExpression : IManifestExpressionProvider, IValueProvider, IValueWithReferences +public class ReferenceExpression : IExpressionValue, IValueWithReferences { /// /// Represents an empty reference expression with no name, value providers, or arguments. diff --git a/src/Aspire.Hosting/ResourceBuilderExtensions.cs b/src/Aspire.Hosting/ResourceBuilderExtensions.cs index 82cf9712540..4ebd6e96ccf 100644 --- a/src/Aspire.Hosting/ResourceBuilderExtensions.cs +++ b/src/Aspire.Hosting/ResourceBuilderExtensions.cs @@ -6,7 +6,6 @@ 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; @@ -23,8 +22,6 @@ 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)!; /// @@ -54,7 +51,7 @@ internal static IResourceBuilder WithEnvironment( typeof(EndpointReference), typeof(IResourceBuilder), typeof(IResourceBuilder), - typeof(IEnvironmentValue))] + typeof(IExpressionValue))] object value) where T : IResourceWithEnvironment { @@ -62,11 +59,6 @@ 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), @@ -74,7 +66,7 @@ internal static IResourceBuilder WithEnvironment( EndpointReference endpointReference => builder.WithEnvironment(name, endpointReference), IResourceBuilder parameter => builder.WithEnvironment(name, parameter), IResourceBuilder connectionStringResource => builder.WithEnvironment(name, connectionStringResource), - IEnvironmentValue environmentValue => builder.WithEnvironmentValue(name, environmentValue), + IExpressionValue expressionValue => builder.WithEnvironment(name, expressionValue), _ => throw new InvalidOperationException( $"The value '{value.GetType().FullName}' can't be used with withEnvironment because it doesn't provide a supported environment value.") }; @@ -312,10 +304,29 @@ public static IResourceBuilder WithEnvironment( }); } - private static IResourceBuilder WithEnvironmentValue( + /// + /// Adds an environment variable to the resource with a value that provides both a runtime value and a manifest expression. + /// + /// The resource type. + /// The resource builder. + /// The name of the environment variable. + /// The value that provides both runtime values and manifest expressions. + /// The . + /// This method is not available in polyglot app hosts. Use the unified withEnvironment overload instead. + [AspireExportIgnore(Reason = "Polyglot app hosts use the internal withEnvironment dispatcher export.")] + public static IResourceBuilder WithEnvironment( + this IResourceBuilder builder, + string name, + IExpressionValue value) + where T : IResourceWithEnvironment + { + return builder.WithEnvironmentExpressionValue(name, value); + } + + private static IResourceBuilder WithEnvironmentExpressionValue( this IResourceBuilder builder, string name, - IEnvironmentValue value) + IExpressionValue value) where T : IResourceWithEnvironment { ArgumentNullException.ThrowIfNull(builder); @@ -364,47 +375,6 @@ 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 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 (dispatchMethod is null) - { - dispatchedBuilder = null; - return false; - } - - 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 : IEnvironmentValue, 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/src/Aspire.Hosting/api/Aspire.Hosting.Capabilities.txt b/src/Aspire.Hosting/api/Aspire.Hosting.Capabilities.txt index d30e52f742a..eb49d9ba830 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.IEnvironmentValue [interface] +Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue [interface] Aspire.Hosting/Aspire.Hosting.ApplicationModel.InitializeResourceEvent [ExposeProperties] Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource [interface] Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithArgs [interface] @@ -386,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.IEnvironmentValue) -> 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.IExpressionValue) -> 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.Go.Tests/Snapshots/AddTestRedisCapability.verified.txt b/tests/Aspire.Hosting.CodeGeneration.Go.Tests/Snapshots/AddTestRedisCapability.verified.txt index ed2cd118f74..88dfd266f4a 100644 --- a/tests/Aspire.Hosting.CodeGeneration.Go.Tests/Snapshots/AddTestRedisCapability.verified.txt +++ b/tests/Aspire.Hosting.CodeGeneration.Go.Tests/Snapshots/AddTestRedisCapability.verified.txt @@ -208,14 +208,36 @@ IsDistributedApplication: false }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -227,6 +249,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -240,14 +272,36 @@ ] }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -259,6 +313,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, 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 f6fece974db..e16d26d5340 100644 --- a/tests/Aspire.Hosting.CodeGeneration.Go.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.go +++ b/tests/Aspire.Hosting.CodeGeneration.Go.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.go @@ -9240,14 +9240,14 @@ func NewIDistributedApplicationResourceEvent(handle *Handle, client *AspireClien } } -// IEnvironmentValue wraps a handle for Aspire.Hosting/Aspire.Hosting.ApplicationModel.IEnvironmentValue. -type IEnvironmentValue struct { +// IExpressionValue wraps a handle for Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue. +type IExpressionValue struct { HandleWrapperBase } -// NewIEnvironmentValue creates a new IEnvironmentValue. -func NewIEnvironmentValue(handle *Handle, client *AspireClient) *IEnvironmentValue { - return &IEnvironmentValue{ +// NewIExpressionValue creates a new IExpressionValue. +func NewIExpressionValue(handle *Handle, client *AspireClient) *IExpressionValue { + return &IExpressionValue{ HandleWrapperBase: NewHandleWrapperBase(handle, client), } } @@ -18031,8 +18031,8 @@ 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.IExpressionValue", func(h *Handle, c *AspireClient) any { + return NewIExpressionValue(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.Go.Tests/Snapshots/WithOptionalStringCapability.verified.txt b/tests/Aspire.Hosting.CodeGeneration.Go.Tests/Snapshots/WithOptionalStringCapability.verified.txt index 60fc94c8aac..701a2069a04 100644 --- a/tests/Aspire.Hosting.CodeGeneration.Go.Tests/Snapshots/WithOptionalStringCapability.verified.txt +++ b/tests/Aspire.Hosting.CodeGeneration.Go.Tests/Snapshots/WithOptionalStringCapability.verified.txt @@ -232,14 +232,36 @@ IsDistributedApplication: false }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -251,6 +273,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -264,14 +296,36 @@ ] }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -283,6 +337,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, diff --git a/tests/Aspire.Hosting.CodeGeneration.Go.Tests/Snapshots/WithPersistenceCapability.verified.txt b/tests/Aspire.Hosting.CodeGeneration.Go.Tests/Snapshots/WithPersistenceCapability.verified.txt index 2ea9add7fc1..c1504990c4a 100644 --- a/tests/Aspire.Hosting.CodeGeneration.Go.Tests/Snapshots/WithPersistenceCapability.verified.txt +++ b/tests/Aspire.Hosting.CodeGeneration.Go.Tests/Snapshots/WithPersistenceCapability.verified.txt @@ -195,14 +195,36 @@ IsDistributedApplication: false }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -214,6 +236,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -227,14 +259,36 @@ ] }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -246,6 +300,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -608,14 +672,36 @@ IsDistributedApplication: false }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -627,6 +713,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -640,14 +736,36 @@ ] }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -659,6 +777,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -1022,14 +1150,36 @@ IsDistributedApplication: false }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -1041,6 +1191,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -1054,14 +1214,36 @@ ] }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -1073,6 +1255,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, diff --git a/tests/Aspire.Hosting.CodeGeneration.Java.Tests/Snapshots/AddTestRedisCapability.verified.txt b/tests/Aspire.Hosting.CodeGeneration.Java.Tests/Snapshots/AddTestRedisCapability.verified.txt index 247af3354f2..620a9ae0dcf 100644 --- a/tests/Aspire.Hosting.CodeGeneration.Java.Tests/Snapshots/AddTestRedisCapability.verified.txt +++ b/tests/Aspire.Hosting.CodeGeneration.Java.Tests/Snapshots/AddTestRedisCapability.verified.txt @@ -208,14 +208,36 @@ IsDistributedApplication: false }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -227,6 +249,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -240,14 +272,36 @@ ] }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -259,6 +313,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, 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 52b35d7eea5..3092a9e6ee9 100644 --- a/tests/Aspire.Hosting.CodeGeneration.Java.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.java +++ b/tests/Aspire.Hosting.CodeGeneration.Java.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.java @@ -1049,7 +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.IExpressionValue", (h, c) -> new IExpressionValue(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)); @@ -1389,12 +1389,12 @@ public CSharpAppResource withEnvironment(String name, ResourceBuilderBase value) return withEnvironment(name, new IResourceWithConnectionString(value.getHandle(), value.getClient())); } - public CSharpAppResource withEnvironment(String name, IEnvironmentValue value) { + public CSharpAppResource withEnvironment(String name, IExpressionValue value) { return withEnvironment(name, AspireUnion.of(value)); } public CSharpAppResource withEnvironment(String name, HandleWrapperBase value) { - return withEnvironment(name, new IEnvironmentValue(value.getHandle(), value.getClient())); + return withEnvironment(name, new IExpressionValue(value.getHandle(), value.getClient())); } /** Sets an environment variable */ @@ -4656,12 +4656,12 @@ public ContainerResource withEnvironment(String name, ResourceBuilderBase value) return withEnvironment(name, new IResourceWithConnectionString(value.getHandle(), value.getClient())); } - public ContainerResource withEnvironment(String name, IEnvironmentValue value) { + public ContainerResource withEnvironment(String name, IExpressionValue value) { return withEnvironment(name, AspireUnion.of(value)); } public ContainerResource withEnvironment(String name, HandleWrapperBase value) { - return withEnvironment(name, new IEnvironmentValue(value.getHandle(), value.getClient())); + return withEnvironment(name, new IExpressionValue(value.getHandle(), value.getClient())); } /** Sets an environment variable */ @@ -6294,12 +6294,12 @@ public DotnetToolResource withEnvironment(String name, ResourceBuilderBase value return withEnvironment(name, new IResourceWithConnectionString(value.getHandle(), value.getClient())); } - public DotnetToolResource withEnvironment(String name, IEnvironmentValue value) { + public DotnetToolResource withEnvironment(String name, IExpressionValue value) { return withEnvironment(name, AspireUnion.of(value)); } public DotnetToolResource withEnvironment(String name, HandleWrapperBase value) { - return withEnvironment(name, new IEnvironmentValue(value.getHandle(), value.getClient())); + return withEnvironment(name, new IExpressionValue(value.getHandle(), value.getClient())); } /** Sets an environment variable */ @@ -7871,12 +7871,12 @@ public ExecutableResource withEnvironment(String name, ResourceBuilderBase value return withEnvironment(name, new IResourceWithConnectionString(value.getHandle(), value.getClient())); } - public ExecutableResource withEnvironment(String name, IEnvironmentValue value) { + public ExecutableResource withEnvironment(String name, IExpressionValue value) { return withEnvironment(name, AspireUnion.of(value)); } public ExecutableResource withEnvironment(String name, HandleWrapperBase value) { - return withEnvironment(name, new IEnvironmentValue(value.getHandle(), value.getClient())); + return withEnvironment(name, new IExpressionValue(value.getHandle(), value.getClient())); } /** Sets an environment variable */ @@ -10368,17 +10368,17 @@ public class IDistributedApplicationResourceEvent extends HandleWrapperBase { } -// ===== IEnvironmentValue.java ===== -// IEnvironmentValue.java - GENERATED CODE - DO NOT EDIT +// ===== IExpressionValue.java ===== +// IExpressionValue.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) { +/** Wrapper for Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue. */ +public class IExpressionValue extends HandleWrapperBase { + IExpressionValue(Handle handle, AspireClient client) { super(handle, client); } @@ -12463,12 +12463,12 @@ public ProjectResource withEnvironment(String name, ResourceBuilderBase value) { return withEnvironment(name, new IResourceWithConnectionString(value.getHandle(), value.getClient())); } - public ProjectResource withEnvironment(String name, IEnvironmentValue value) { + public ProjectResource withEnvironment(String name, IExpressionValue value) { return withEnvironment(name, AspireUnion.of(value)); } public ProjectResource withEnvironment(String name, HandleWrapperBase value) { - return withEnvironment(name, new IEnvironmentValue(value.getHandle(), value.getClient())); + return withEnvironment(name, new IExpressionValue(value.getHandle(), value.getClient())); } /** Sets an environment variable */ @@ -14766,12 +14766,12 @@ public TestDatabaseResource withEnvironment(String name, ResourceBuilderBase val return withEnvironment(name, new IResourceWithConnectionString(value.getHandle(), value.getClient())); } - public TestDatabaseResource withEnvironment(String name, IEnvironmentValue value) { + public TestDatabaseResource withEnvironment(String name, IExpressionValue value) { return withEnvironment(name, AspireUnion.of(value)); } public TestDatabaseResource withEnvironment(String name, HandleWrapperBase value) { - return withEnvironment(name, new IEnvironmentValue(value.getHandle(), value.getClient())); + return withEnvironment(name, new IExpressionValue(value.getHandle(), value.getClient())); } /** Sets an environment variable */ @@ -16381,12 +16381,12 @@ public TestRedisResource withEnvironment(String name, ResourceBuilderBase value) return withEnvironment(name, new IResourceWithConnectionString(value.getHandle(), value.getClient())); } - public TestRedisResource withEnvironment(String name, IEnvironmentValue value) { + public TestRedisResource withEnvironment(String name, IExpressionValue value) { return withEnvironment(name, AspireUnion.of(value)); } public TestRedisResource withEnvironment(String name, HandleWrapperBase value) { - return withEnvironment(name, new IEnvironmentValue(value.getHandle(), value.getClient())); + return withEnvironment(name, new IExpressionValue(value.getHandle(), value.getClient())); } /** Sets an environment variable */ @@ -18133,12 +18133,12 @@ public TestVaultResource withEnvironment(String name, ResourceBuilderBase value) return withEnvironment(name, new IResourceWithConnectionString(value.getHandle(), value.getClient())); } - public TestVaultResource withEnvironment(String name, IEnvironmentValue value) { + public TestVaultResource withEnvironment(String name, IExpressionValue value) { return withEnvironment(name, AspireUnion.of(value)); } public TestVaultResource withEnvironment(String name, HandleWrapperBase value) { - return withEnvironment(name, new IEnvironmentValue(value.getHandle(), value.getClient())); + return withEnvironment(name, new IExpressionValue(value.getHandle(), value.getClient())); } /** Sets an environment variable */ @@ -20038,7 +20038,7 @@ public WithVolumeOptions isReadOnly(Boolean value) { .modules/IDistributedApplicationEvent.java .modules/IDistributedApplicationEventing.java .modules/IDistributedApplicationResourceEvent.java -.modules/IEnvironmentValue.java +.modules/IExpressionValue.java .modules/IHostEnvironment.java .modules/ILogger.java .modules/ILoggerFactory.java diff --git a/tests/Aspire.Hosting.CodeGeneration.Java.Tests/Snapshots/WithOptionalStringCapability.verified.txt b/tests/Aspire.Hosting.CodeGeneration.Java.Tests/Snapshots/WithOptionalStringCapability.verified.txt index 96253f5953c..cf7b59d7b00 100644 --- a/tests/Aspire.Hosting.CodeGeneration.Java.Tests/Snapshots/WithOptionalStringCapability.verified.txt +++ b/tests/Aspire.Hosting.CodeGeneration.Java.Tests/Snapshots/WithOptionalStringCapability.verified.txt @@ -232,14 +232,36 @@ IsDistributedApplication: false }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -251,6 +273,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -264,14 +296,36 @@ ] }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -283,6 +337,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, diff --git a/tests/Aspire.Hosting.CodeGeneration.Java.Tests/Snapshots/WithPersistenceCapability.verified.txt b/tests/Aspire.Hosting.CodeGeneration.Java.Tests/Snapshots/WithPersistenceCapability.verified.txt index df81497ddec..15d05ff0dc8 100644 --- a/tests/Aspire.Hosting.CodeGeneration.Java.Tests/Snapshots/WithPersistenceCapability.verified.txt +++ b/tests/Aspire.Hosting.CodeGeneration.Java.Tests/Snapshots/WithPersistenceCapability.verified.txt @@ -195,14 +195,36 @@ IsDistributedApplication: false }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -214,6 +236,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -227,14 +259,36 @@ ] }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -246,6 +300,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -608,14 +672,36 @@ IsDistributedApplication: false }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -627,6 +713,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -640,14 +736,36 @@ ] }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -659,6 +777,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -1022,14 +1150,36 @@ IsDistributedApplication: false }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -1041,6 +1191,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -1054,14 +1214,36 @@ ] }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -1073,6 +1255,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, diff --git a/tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/AddTestRedisCapability.verified.txt b/tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/AddTestRedisCapability.verified.txt index 15010695ddf..68480e7bf3c 100644 --- a/tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/AddTestRedisCapability.verified.txt +++ b/tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/AddTestRedisCapability.verified.txt @@ -208,14 +208,36 @@ IsDistributedApplication: false }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -227,6 +249,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -240,14 +272,36 @@ ] }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -259,6 +313,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, diff --git a/tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/AtsGeneratedAspire.verified.py b/tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/AtsGeneratedAspire.verified.py index a976eb1109c..e202a18b0aa 100644 --- a/tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/AtsGeneratedAspire.verified.py +++ b/tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/AtsGeneratedAspire.verified.py @@ -1610,11 +1610,14 @@ def add_test_vault(self, name: str, **kwargs: typing.Unpack["TestVaultResourceKw return typing.cast(TestVaultResource, result) +class AbstractValueProvider(abc.ABC): + """Abstract base class for AbstractValueProvider.""" + class AbstractManifestExpressionProvider(abc.ABC): """Abstract base class for AbstractManifestExpressionProvider.""" -class AbstractValueProvider(abc.ABC): - """Abstract base class for AbstractValueProvider.""" +class AbstractExpressionValue(abc.ABC): + """Abstract base class for AbstractExpressionValue.""" class AbstractValueWithReferences(abc.ABC): """Abstract base class for AbstractValueWithReferences.""" @@ -1939,7 +1942,7 @@ class AbstractResourceWithArgs(AbstractResource): """Abstract base class for AbstractResourceWithArgs interface.""" -class AbstractResourceWithConnectionString(AbstractResource, AbstractManifestExpressionProvider, AbstractValueProvider, AbstractValueWithReferences): +class AbstractResourceWithConnectionString(AbstractResource, AbstractExpressionValue, AbstractValueWithReferences): """Abstract base class for AbstractResourceWithConnectionString interface.""" @abc.abstractmethod 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 8e9aebee1e3..1a278f56b51 100644 --- a/tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.py +++ b/tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.py @@ -2203,8 +2203,14 @@ def unsubscribe(self, subscription: DistributedApplicationEventSubscription) -> class AbstractDistributedApplicationResourceEvent(abc.ABC): """Abstract base class for AbstractDistributedApplicationResourceEvent.""" -class AbstractEnvironmentValue(abc.ABC): - """Abstract base class for AbstractEnvironmentValue.""" +class AbstractValueProvider(abc.ABC): + """Abstract base class for AbstractValueProvider.""" + +class AbstractManifestExpressionProvider(abc.ABC): + """Abstract base class for AbstractManifestExpressionProvider.""" + +class AbstractExpressionValue(abc.ABC): + """Abstract base class for AbstractExpressionValue.""" class AbstractHostEnvironment: """Type class for AbstractHostEnvironment.""" @@ -2347,9 +2353,6 @@ def create_logger(self, category_name: str) -> AbstractLogger: return typing.cast(AbstractLogger, result) -class AbstractManifestExpressionProvider(abc.ABC): - """Abstract base class for AbstractManifestExpressionProvider.""" - class AbstractReportingStep: """Type class for AbstractReportingStep.""" @@ -2501,9 +2504,6 @@ def complete_task_markdown(self, markdown_string: str, *, completion_state: str ) -class AbstractValueProvider(abc.ABC): - """Abstract base class for AbstractValueProvider.""" - class AbstractValueWithReferences(abc.ABC): """Abstract base class for AbstractValueWithReferences.""" @@ -4756,7 +4756,7 @@ def with_args_callback(self, callback: typing.Callable[[CommandLineArgsCallbackC """Sets command-line arguments via callback""" -class AbstractResourceWithConnectionString(AbstractResource, AbstractManifestExpressionProvider, AbstractValueProvider, AbstractValueWithReferences): +class AbstractResourceWithConnectionString(AbstractResource, AbstractExpressionValue, AbstractValueWithReferences): """Abstract base class for AbstractResourceWithConnectionString interface.""" @abc.abstractmethod @@ -4848,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 | AbstractEnvironmentValue) -> typing.Self: + def with_env(self, name: str, value: str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractExpressionValue) -> typing.Self: """Sets an environment variable""" @abc.abstractmethod @@ -6036,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 | AbstractEnvironmentValue] + env: tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractExpressionValue] env_callback: typing.Callable[[EnvironmentCallbackContext], None] args: typing.Iterable[str] args_callback: typing.Callable[[CommandLineArgsCallbackContext], None] @@ -6295,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 | AbstractEnvironmentValue) -> typing.Self: + def with_env(self, name: str, value: str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractExpressionValue) -> typing.Self: """Sets an environment variable""" rpc_args: dict[str, typing.Any] = {'builder': self._handle} rpc_args['name'] = name @@ -6855,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 | AbstractEnvironmentValue)): + if _validate_tuple_types(_env, (str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractExpressionValue)): rpc_args: dict[str, typing.Any] = {"builder": handle} - 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] + rpc_args["name"] = typing.cast(tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractExpressionValue], _env)[0] + rpc_args["value"] = typing.cast(tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractExpressionValue], _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 | AbstractEnvironmentValue)") + raise TypeError("Invalid type for option 'env'. Expected: (str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractExpressionValue)") 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} @@ -7139,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 | AbstractEnvironmentValue] + env: tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractExpressionValue] env_callback: typing.Callable[[EnvironmentCallbackContext], None] args: typing.Iterable[str] args_callback: typing.Callable[[CommandLineArgsCallbackContext], None] @@ -7235,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 | AbstractEnvironmentValue) -> typing.Self: + def with_env(self, name: str, value: str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractExpressionValue) -> typing.Self: """Sets an environment variable""" rpc_args: dict[str, typing.Any] = {'builder': self._handle} rpc_args['name'] = name @@ -7678,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 | AbstractEnvironmentValue)): + if _validate_tuple_types(_env, (str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractExpressionValue)): rpc_args: dict[str, typing.Any] = {"builder": handle} - 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] + rpc_args["name"] = typing.cast(tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractExpressionValue], _env)[0] + rpc_args["value"] = typing.cast(tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractExpressionValue], _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 | AbstractEnvironmentValue)") + raise TypeError("Invalid type for option 'env'. Expected: (str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractExpressionValue)") 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} @@ -7971,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 | AbstractEnvironmentValue] + env: tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractExpressionValue] env_callback: typing.Callable[[EnvironmentCallbackContext], None] args: typing.Iterable[str] args_callback: typing.Callable[[CommandLineArgsCallbackContext], None] @@ -8068,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 | AbstractEnvironmentValue) -> typing.Self: + def with_env(self, name: str, value: str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractExpressionValue) -> typing.Self: """Sets an environment variable""" rpc_args: dict[str, typing.Any] = {'builder': self._handle} rpc_args['name'] = name @@ -8500,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 | AbstractEnvironmentValue)): + if _validate_tuple_types(_env, (str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractExpressionValue)): rpc_args: dict[str, typing.Any] = {"builder": handle} - 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] + rpc_args["name"] = typing.cast(tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractExpressionValue], _env)[0] + rpc_args["value"] = typing.cast(tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractExpressionValue], _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 | AbstractEnvironmentValue)") + raise TypeError("Invalid type for option 'env'. Expected: (str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractExpressionValue)") 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} @@ -8930,7 +8930,7 @@ class ParameterResourceKwargs(_BaseResourceKwargs, total=False): description: str | tuple[str, bool] -class ParameterResource(_BaseResource, AbstractManifestExpressionProvider, AbstractValueProvider): +class ParameterResource(_BaseResource, AbstractExpressionValue): """ParameterResource resource.""" def __repr__(self) -> str: diff --git a/tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/WithOptionalStringCapability.verified.txt b/tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/WithOptionalStringCapability.verified.txt index 4806ad8ae8b..ede7c4adbeb 100644 --- a/tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/WithOptionalStringCapability.verified.txt +++ b/tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/WithOptionalStringCapability.verified.txt @@ -232,14 +232,36 @@ IsDistributedApplication: false }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -251,6 +273,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -264,14 +296,36 @@ ] }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -283,6 +337,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, diff --git a/tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/WithPersistenceCapability.verified.txt b/tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/WithPersistenceCapability.verified.txt index 06e178ed65a..ce3e8add9f2 100644 --- a/tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/WithPersistenceCapability.verified.txt +++ b/tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/WithPersistenceCapability.verified.txt @@ -195,14 +195,36 @@ IsDistributedApplication: false }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -214,6 +236,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -227,14 +259,36 @@ ] }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -246,6 +300,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -608,14 +672,36 @@ IsDistributedApplication: false }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -627,6 +713,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -640,14 +736,36 @@ ] }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -659,6 +777,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -1022,14 +1150,36 @@ IsDistributedApplication: false }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -1041,6 +1191,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -1054,14 +1214,36 @@ ] }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -1073,6 +1255,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, diff --git a/tests/Aspire.Hosting.CodeGeneration.Rust.Tests/Snapshots/AddTestRedisCapability.verified.txt b/tests/Aspire.Hosting.CodeGeneration.Rust.Tests/Snapshots/AddTestRedisCapability.verified.txt index defc480fc87..2e9f83a237a 100644 --- a/tests/Aspire.Hosting.CodeGeneration.Rust.Tests/Snapshots/AddTestRedisCapability.verified.txt +++ b/tests/Aspire.Hosting.CodeGeneration.Rust.Tests/Snapshots/AddTestRedisCapability.verified.txt @@ -208,14 +208,36 @@ IsDistributedApplication: false }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -227,6 +249,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -240,14 +272,36 @@ ] }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -259,6 +313,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, 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 6b4f11b2a84..fe96b88315e 100644 --- a/tests/Aspire.Hosting.CodeGeneration.Rust.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.rs +++ b/tests/Aspire.Hosting.CodeGeneration.Rust.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.rs @@ -8072,19 +8072,19 @@ impl IDistributedApplicationResourceEvent { } } -/// Wrapper for Aspire.Hosting/Aspire.Hosting.ApplicationModel.IEnvironmentValue -pub struct IEnvironmentValue { +/// Wrapper for Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue +pub struct IExpressionValue { handle: Handle, client: Arc, } -impl HasHandle for IEnvironmentValue { +impl HasHandle for IExpressionValue { fn handle(&self) -> &Handle { &self.handle } } -impl IEnvironmentValue { +impl IExpressionValue { pub fn new(handle: Handle, client: Arc) -> Self { Self { handle, client } } diff --git a/tests/Aspire.Hosting.CodeGeneration.Rust.Tests/Snapshots/WithOptionalStringCapability.verified.txt b/tests/Aspire.Hosting.CodeGeneration.Rust.Tests/Snapshots/WithOptionalStringCapability.verified.txt index 368db08e88b..35d5a7b561c 100644 --- a/tests/Aspire.Hosting.CodeGeneration.Rust.Tests/Snapshots/WithOptionalStringCapability.verified.txt +++ b/tests/Aspire.Hosting.CodeGeneration.Rust.Tests/Snapshots/WithOptionalStringCapability.verified.txt @@ -232,14 +232,36 @@ IsDistributedApplication: false }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -251,6 +273,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -264,14 +296,36 @@ ] }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -283,6 +337,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, diff --git a/tests/Aspire.Hosting.CodeGeneration.Rust.Tests/Snapshots/WithPersistenceCapability.verified.txt b/tests/Aspire.Hosting.CodeGeneration.Rust.Tests/Snapshots/WithPersistenceCapability.verified.txt index 460608de6a3..f7461c8288c 100644 --- a/tests/Aspire.Hosting.CodeGeneration.Rust.Tests/Snapshots/WithPersistenceCapability.verified.txt +++ b/tests/Aspire.Hosting.CodeGeneration.Rust.Tests/Snapshots/WithPersistenceCapability.verified.txt @@ -195,14 +195,36 @@ IsDistributedApplication: false }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -214,6 +236,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -227,14 +259,36 @@ ] }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -246,6 +300,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -608,14 +672,36 @@ IsDistributedApplication: false }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -627,6 +713,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -640,14 +736,36 @@ ] }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -659,6 +777,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -1022,14 +1150,36 @@ IsDistributedApplication: false }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -1041,6 +1191,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -1054,14 +1214,36 @@ ] }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -1073,6 +1255,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, diff --git a/tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/AddTestRedisCapability.verified.txt b/tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/AddTestRedisCapability.verified.txt index 9613e46a28a..bb691ca1fe2 100644 --- a/tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/AddTestRedisCapability.verified.txt +++ b/tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/AddTestRedisCapability.verified.txt @@ -208,14 +208,36 @@ IsDistributedApplication: false }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -227,6 +249,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -240,14 +272,36 @@ ] }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -259,6 +313,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, 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 7c7ab434ce9..fc6c5843bb5 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 | ResourceBuilderBase | EndpointReference | EndpointReferenceExpression): Promise { const rpcArgs: Record = { builder: this._handle, name, value }; const result = await this._client.invokeCapability( 'Aspire.Hosting/withEnvironment', @@ -7095,7 +7095,7 @@ export class ContainerResource extends ResourceBuilderBase } /** Sets an environment variable */ - withEnvironment(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase): ContainerResourcePromise { + withEnvironment(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase | ResourceBuilderBase | EndpointReference | EndpointReferenceExpression): ContainerResourcePromise { return new ContainerResourcePromise(this._promise.then(obj => obj.withEnvironment(name, value))); } @@ -8991,7 +8991,7 @@ export class CSharpAppResource extends ResourceBuilderBase { + private async _withEnvironmentInternal(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase | ResourceBuilderBase | EndpointReference | EndpointReferenceExpression): Promise { const rpcArgs: Record = { builder: this._handle, name, value }; const result = await this._client.invokeCapability( 'Aspire.Hosting/withEnvironment', @@ -9001,7 +9001,7 @@ export class CSharpAppResource extends ResourceBuilderBase } /** Sets an environment variable */ - withEnvironment(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase): CSharpAppResourcePromise { + withEnvironment(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase | ResourceBuilderBase | EndpointReference | EndpointReferenceExpression): CSharpAppResourcePromise { return new CSharpAppResourcePromise(this._promise.then(obj => obj.withEnvironment(name, value))); } @@ -10926,7 +10926,7 @@ export class DotnetToolResource extends ResourceBuilderBase { + private async _withEnvironmentInternal(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase | ResourceBuilderBase | EndpointReference | EndpointReferenceExpression): Promise { const rpcArgs: Record = { builder: this._handle, name, value }; const result = await this._client.invokeCapability( 'Aspire.Hosting/withEnvironment', @@ -10936,7 +10936,7 @@ export class DotnetToolResource extends ResourceBuilderBase obj.withEnvironment(name, value))); } @@ -12786,7 +12786,7 @@ export class ExecutableResource extends ResourceBuilderBase { + private async _withEnvironmentInternal(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase | ResourceBuilderBase | EndpointReference | EndpointReferenceExpression): Promise { const rpcArgs: Record = { builder: this._handle, name, value }; const result = await this._client.invokeCapability( 'Aspire.Hosting/withEnvironment', @@ -12796,7 +12796,7 @@ export class ExecutableResource extends ResourceBuilderBase obj.withEnvironment(name, value))); } @@ -16601,7 +16601,7 @@ export class ProjectResource extends ResourceBuilderBase } /** @internal */ - private async _withEnvironmentInternal(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase): Promise { + private async _withEnvironmentInternal(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase | ResourceBuilderBase | EndpointReference | EndpointReferenceExpression): Promise { const rpcArgs: Record = { builder: this._handle, name, value }; const result = await this._client.invokeCapability( 'Aspire.Hosting/withEnvironment', @@ -16611,7 +16611,7 @@ export class ProjectResource extends ResourceBuilderBase } /** Sets an environment variable */ - withEnvironment(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase): ProjectResourcePromise { + withEnvironment(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase | ResourceBuilderBase | EndpointReference | EndpointReferenceExpression): ProjectResourcePromise { return new ProjectResourcePromise(this._withEnvironmentInternal(name, value)); } @@ -17910,7 +17910,7 @@ export class ProjectResourcePromise implements PromiseLike { } /** Sets an environment variable */ - withEnvironment(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase): ProjectResourcePromise { + withEnvironment(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase | ResourceBuilderBase | EndpointReference | EndpointReferenceExpression): ProjectResourcePromise { return new ProjectResourcePromise(this._promise.then(obj => obj.withEnvironment(name, value))); } @@ -18644,7 +18644,7 @@ export class TestDatabaseResource extends ResourceBuilderBase { + private async _withEnvironmentInternal(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase | ResourceBuilderBase | EndpointReference | EndpointReferenceExpression): Promise { const rpcArgs: Record = { builder: this._handle, name, value }; const result = await this._client.invokeCapability( 'Aspire.Hosting/withEnvironment', @@ -18654,7 +18654,7 @@ export class TestDatabaseResource extends ResourceBuilderBase obj.withEnvironment(name, value))); } @@ -20761,7 +20761,7 @@ export class TestRedisResource extends ResourceBuilderBase { + private async _withEnvironmentInternal(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase | ResourceBuilderBase | EndpointReference | EndpointReferenceExpression): Promise { const rpcArgs: Record = { builder: this._handle, name, value }; const result = await this._client.invokeCapability( 'Aspire.Hosting/withEnvironment', @@ -20771,7 +20771,7 @@ export class TestRedisResource extends ResourceBuilderBase } /** Sets an environment variable */ - withEnvironment(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase): TestRedisResourcePromise { + withEnvironment(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase | ResourceBuilderBase | EndpointReference | EndpointReferenceExpression): TestRedisResourcePromise { return new TestRedisResourcePromise(this._promise.then(obj => obj.withEnvironment(name, value))); } @@ -23172,7 +23172,7 @@ export class TestVaultResource extends ResourceBuilderBase { + private async _withEnvironmentInternal(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase | ResourceBuilderBase | EndpointReference | EndpointReferenceExpression): Promise { const rpcArgs: Record = { builder: this._handle, name, value }; const result = await this._client.invokeCapability( 'Aspire.Hosting/withEnvironment', @@ -23182,7 +23182,7 @@ export class TestVaultResource extends ResourceBuilderBase } /** Sets an environment variable */ - withEnvironment(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase): TestVaultResourcePromise { + withEnvironment(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase | ResourceBuilderBase | EndpointReference | EndpointReferenceExpression): TestVaultResourcePromise { return new TestVaultResourcePromise(this._promise.then(obj => obj.withEnvironment(name, value))); } @@ -26654,7 +26654,7 @@ export class ResourceWithEnvironment extends ResourceBuilderBase { + private async _withEnvironmentInternal(name: string, value: string | ReferenceExpression | EndpointReference | ParameterResource | ResourceBuilderBase | ResourceBuilderBase | EndpointReference | EndpointReferenceExpression): Promise { const rpcArgs: Record = { builder: this._handle, name, value }; const result = await this._client.invokeCapability( 'Aspire.Hosting/withEnvironment', @@ -26664,7 +26664,7 @@ export class ResourceWithEnvironment extends ResourceBuilderBase obj.withEnvironment(name, value))); } diff --git a/tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/WithOptionalStringCapability.verified.txt b/tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/WithOptionalStringCapability.verified.txt index d33fa15b474..f2e501a7914 100644 --- a/tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/WithOptionalStringCapability.verified.txt +++ b/tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/WithOptionalStringCapability.verified.txt @@ -232,14 +232,36 @@ IsDistributedApplication: false }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -251,6 +273,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -264,14 +296,36 @@ ] }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -283,6 +337,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, diff --git a/tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/WithPersistenceCapability.verified.txt b/tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/WithPersistenceCapability.verified.txt index 18d8b82372b..dc116508368 100644 --- a/tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/WithPersistenceCapability.verified.txt +++ b/tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/WithPersistenceCapability.verified.txt @@ -195,14 +195,36 @@ IsDistributedApplication: false }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -214,6 +236,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -227,14 +259,36 @@ ] }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -246,6 +300,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -608,14 +672,36 @@ IsDistributedApplication: false }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -627,6 +713,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -640,14 +736,36 @@ ] }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -659,6 +777,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -1022,14 +1150,36 @@ IsDistributedApplication: false }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -1041,6 +1191,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -1054,14 +1214,36 @@ ] }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -1073,6 +1255,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, diff --git a/tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/WithRedisSpecificCapability.verified.txt b/tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/WithRedisSpecificCapability.verified.txt index 257d61a8081..901afb2dbbe 100644 --- a/tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/WithRedisSpecificCapability.verified.txt +++ b/tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/WithRedisSpecificCapability.verified.txt @@ -193,14 +193,36 @@ IsDistributedApplication: false }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -212,6 +234,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -225,14 +257,36 @@ ] }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -244,6 +298,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -606,14 +670,36 @@ IsDistributedApplication: false }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -625,6 +711,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -638,14 +734,36 @@ ] }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -657,6 +775,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -1020,14 +1148,36 @@ IsDistributedApplication: false }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -1039,6 +1189,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, @@ -1052,14 +1212,36 @@ ] }, { - TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, - ClrType: IManifestExpressionProvider, + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue, + ClrType: IExpressionValue, Category: Handle, IsInterface: true, IsReadOnly: false, IsResourceBuilder: false, IsDistributedApplicationBuilder: false, - IsDistributedApplication: false + IsDistributedApplication: false, + ImplementedInterfaces: [ + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, + ClrType: IValueProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + } + ] }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueProvider, @@ -1071,6 +1253,16 @@ IsDistributedApplicationBuilder: false, IsDistributedApplication: false }, + { + TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IManifestExpressionProvider, + ClrType: IManifestExpressionProvider, + Category: Handle, + IsInterface: true, + IsReadOnly: false, + IsResourceBuilder: false, + IsDistributedApplicationBuilder: false, + IsDistributedApplication: false + }, { TypeId: Aspire.Hosting/Aspire.Hosting.ApplicationModel.IValueWithReferences, ClrType: IValueWithReferences, From 7e72f6d3ac8c1a31331fdc4e712281be2966b91a Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Mon, 30 Mar 2026 10:20:39 -0700 Subject: [PATCH 7/7] Preserve ATS withEnvironment aliases Keep the unified withEnvironment export while restoring legacy ATS alias methods as obsolete internal compatibility shims for existing polyglot apps. Regenerate capability dumps and refresh codegen snapshots to match the non-breaking export surface. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../AzureBicepResourceExtensions.cs | 34 + .../api/Aspire.Hosting.SqlServer.ats.txt | 8 +- .../ResourceBuilderExtensions.cs | 69 ++ .../api/Aspire.Hosting.Capabilities.txt | 4 + ...TwoPassScanningGeneratedAspire.verified.go | 448 +++++++++++ ...oPassScanningGeneratedAspire.verified.java | 352 +++++++++ ...TwoPassScanningGeneratedAspire.verified.py | 268 +++++++ ...TwoPassScanningGeneratedAspire.verified.rs | 352 +++++++++ ...ContainerResourceCapabilities.verified.txt | 56 ++ ...TwoPassScanningGeneratedAspire.verified.ts | 720 ++++++++++++++++++ 10 files changed, 2309 insertions(+), 2 deletions(-) diff --git a/src/Aspire.Hosting.Azure/AzureBicepResourceExtensions.cs b/src/Aspire.Hosting.Azure/AzureBicepResourceExtensions.cs index e996348d411..4f8ddfe3563 100644 --- a/src/Aspire.Hosting.Azure/AzureBicepResourceExtensions.cs +++ b/src/Aspire.Hosting.Azure/AzureBicepResourceExtensions.cs @@ -85,6 +85,24 @@ public static IResourceBuilder WithEnvironment(this IResourceBuilder bu return builder.WithEnvironment(name, (IExpressionValue)bicepOutputReference); } + // Keep these ATS-only aliases for backward compatibility with existing polyglot app hosts. + // Remove them once callers have migrated to the unified withEnvironment(...) export. + /// + /// Obsolete ATS alias for . + /// + /// The resource type. + /// The resource builder. + /// The name of the environment variable. + /// The reference to the Bicep output. + /// An . + [Obsolete("ATS compatibility shim. Use withEnvironment instead. Remove after existing polyglot app hosts migrate.")] + [AspireExport("withEnvironmentFromOutput", Description = "Sets an environment variable from a Bicep output reference")] + internal static IResourceBuilder WithEnvironmentFromOutputShim(this IResourceBuilder builder, string name, BicepOutputReference bicepOutputReference) + where T : IResourceWithEnvironment + { + return builder.WithEnvironment(name, bicepOutputReference); + } + /// /// Adds an environment variable to the resource with the value of the secret output from the bicep template. /// @@ -118,6 +136,22 @@ public static IResourceBuilder WithEnvironment(this IResourceBuilder bu return builder.WithEnvironment(name, (IExpressionValue)secretReference); } + /// + /// Obsolete ATS alias for . + /// + /// The resource type. + /// The resource builder. + /// The name of the environment variable. + /// The key vault secret reference. + /// An . + [Obsolete("ATS compatibility shim. Use withEnvironment instead. Remove after existing polyglot app hosts migrate.")] + [AspireExport("withEnvironmentFromKeyVaultSecret", Description = "Sets an environment variable from an Azure Key Vault secret reference")] + internal static IResourceBuilder WithEnvironmentFromKeyVaultSecretShim(this IResourceBuilder builder, string name, IAzureKeyVaultSecretReference secretReference) + where T : IResourceWithEnvironment + { + return builder.WithEnvironment(name, secretReference); + } + /// /// Adds a parameter to the bicep template. /// 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 9460a0b2f2b..7caf46bef63 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.IEnvironmentValue [interface] +Aspire.Hosting/Aspire.Hosting.ApplicationModel.IExpressionValue [interface] Aspire.Hosting/Aspire.Hosting.ApplicationModel.InitializeResourceEvent [ExposeProperties] Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResource [interface] Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithArgs [interface] @@ -416,8 +416,12 @@ 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.IEnvironmentValue) -> 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.IExpressionValue) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment Aspire.Hosting/withEnvironmentCallback(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 diff --git a/src/Aspire.Hosting/ResourceBuilderExtensions.cs b/src/Aspire.Hosting/ResourceBuilderExtensions.cs index 4ebd6e96ccf..84d62d50595 100644 --- a/src/Aspire.Hosting/ResourceBuilderExtensions.cs +++ b/src/Aspire.Hosting/ResourceBuilderExtensions.cs @@ -137,6 +137,24 @@ public static IResourceBuilder WithEnvironment(this IResourceBuilder bu }); } + // Keep these ATS-only aliases for backward compatibility with existing polyglot app hosts. + // Remove them once callers have migrated to the unified withEnvironment(...) export. + /// + /// Obsolete ATS alias for . + /// + /// The resource type. + /// The resource builder. + /// The name of the environment variable. + /// The reference expression value. + /// The . + [Obsolete("ATS compatibility shim. Use withEnvironment instead. Remove after existing polyglot app hosts migrate.")] + [AspireExport("withEnvironmentExpression", Description = "Sets an environment variable from a reference expression")] + internal static IResourceBuilder WithEnvironmentExpressionShim(this IResourceBuilder builder, string name, ReferenceExpression value) + where T : IResourceWithEnvironment + { + return builder.WithEnvironment(name, value); + } + /// /// Adds an environment variable to the resource. /// @@ -211,6 +229,22 @@ public static IResourceBuilder WithEnvironment(this IResourceBuilder bu }); } + /// + /// Obsolete ATS alias for . + /// + /// The resource type. + /// The resource builder. + /// The name of the environment variable. + /// The endpoint reference value. + /// The . + [Obsolete("ATS compatibility shim. Use withEnvironment instead. Remove after existing polyglot app hosts migrate.")] + [AspireExport("withEnvironmentEndpoint", Description = "Sets an environment variable from an endpoint reference")] + internal static IResourceBuilder WithEnvironmentEndpointShim(this IResourceBuilder builder, string name, EndpointReference endpointReference) + where T : IResourceWithEnvironment + { + return builder.WithEnvironment(name, endpointReference); + } + /// /// Adds an environment variable to the resource with the URL from the . /// @@ -277,6 +311,22 @@ public static IResourceBuilder WithEnvironment(this IResourceBuilder bu }); } + /// + /// Obsolete ATS alias for . + /// + /// The resource type. + /// The resource builder. + /// The name of the environment variable. + /// The parameter resource builder. + /// The . + [Obsolete("ATS compatibility shim. Use withEnvironment instead. Remove after existing polyglot app hosts migrate.")] + [AspireExport("withEnvironmentParameter", Description = "Sets an environment variable from a parameter resource")] + internal static IResourceBuilder WithEnvironmentParameterShim(this IResourceBuilder builder, string name, IResourceBuilder parameter) + where T : IResourceWithEnvironment + { + return builder.WithEnvironment(name, parameter); + } + /// /// Adds an environment variable to the resource with the connection string from the referenced resource. /// @@ -304,6 +354,25 @@ public static IResourceBuilder WithEnvironment( }); } + /// + /// Obsolete ATS alias for . + /// + /// The destination resource type. + /// The destination resource builder. + /// The name of the environment variable. + /// The referenced connection string resource builder. + /// The . + [Obsolete("ATS compatibility shim. Use withEnvironment instead. Remove after existing polyglot app hosts migrate.")] + [AspireExport("withEnvironmentConnectionString", Description = "Sets an environment variable from a connection string resource")] + internal static IResourceBuilder WithEnvironmentConnectionStringShim( + this IResourceBuilder builder, + string envVarName, + IResourceBuilder resource) + where T : IResourceWithEnvironment + { + return builder.WithEnvironment(envVarName, resource); + } + /// /// Adds an environment variable to the resource with a value that provides both a runtime value and a manifest expression. /// diff --git a/src/Aspire.Hosting/api/Aspire.Hosting.Capabilities.txt b/src/Aspire.Hosting/api/Aspire.Hosting.Capabilities.txt index eb49d9ba830..1708174226c 100644 --- a/src/Aspire.Hosting/api/Aspire.Hosting.Capabilities.txt +++ b/src/Aspire.Hosting/api/Aspire.Hosting.Capabilities.txt @@ -388,6 +388,10 @@ Aspire.Hosting/withEndpointProxySupport(proxyEnabled: boolean) -> Aspire.Hosting 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.IExpressionValue) -> Aspire.Hosting/Aspire.Hosting.ApplicationModel.IResourceWithEnvironment Aspire.Hosting/withEnvironmentCallback(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 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 e16d26d5340..98f1183a47a 100644 --- a/tests/Aspire.Hosting.CodeGeneration.Go.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.go +++ b/tests/Aspire.Hosting.CodeGeneration.Go.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.go @@ -582,6 +582,20 @@ func (s *CSharpAppResource) WithEnvironment(name string, value any) (*IResourceW return result.(*IResourceWithEnvironment), nil } +// WithEnvironmentExpression sets an environment variable from 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{ @@ -597,6 +611,48 @@ 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{ @@ -3620,6 +3676,20 @@ func (s *ContainerResource) WithEnvironment(name string, value any) (*IResourceW return result.(*IResourceWithEnvironment), nil } +// WithEnvironmentExpression sets an environment variable from 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{ @@ -3635,6 +3705,48 @@ 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{ @@ -5157,6 +5269,20 @@ func (s *DotnetToolResource) WithEnvironment(name string, value any) (*IResource return result.(*IResourceWithEnvironment), nil } +// WithEnvironmentExpression sets an environment variable from 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{ @@ -5172,6 +5298,48 @@ 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{ @@ -6770,6 +6938,20 @@ func (s *ExecutableResource) WithEnvironment(name string, value any) (*IResource return result.(*IResourceWithEnvironment), nil } +// WithEnvironmentExpression sets an environment variable from 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{ @@ -6785,6 +6967,48 @@ 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{ @@ -11365,6 +11589,20 @@ func (s *ProjectResource) WithEnvironment(name string, value any) (*IResourceWit return result.(*IResourceWithEnvironment), nil } +// WithEnvironmentExpression sets an environment variable from 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{ @@ -11380,6 +11618,48 @@ 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{ @@ -13412,6 +13692,20 @@ func (s *TestDatabaseResource) WithEnvironment(name string, value any) (*IResour return result.(*IResourceWithEnvironment), nil } +// WithEnvironmentExpression sets an environment variable from 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{ @@ -13427,6 +13721,48 @@ 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{ @@ -14962,6 +15298,20 @@ func (s *TestRedisResource) WithEnvironment(name string, value any) (*IResourceW return result.(*IResourceWithEnvironment), nil } +// WithEnvironmentExpression sets an environment variable from 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{ @@ -14977,6 +15327,48 @@ 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{ @@ -16724,6 +17116,20 @@ func (s *TestVaultResource) WithEnvironment(name string, value any) (*IResourceW return result.(*IResourceWithEnvironment), nil } +// WithEnvironmentExpression sets an environment variable from 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{ @@ -16739,6 +17145,48 @@ 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{ 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 3092a9e6ee9..1f7777e881d 100644 --- a/tests/Aspire.Hosting.CodeGeneration.Java.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.java +++ b/tests/Aspire.Hosting.CodeGeneration.Java.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.java @@ -1407,6 +1407,16 @@ public CSharpAppResource withEnvironment(String name, AspireUnion value) { return this; } + /** Sets an environment variable from a reference expression */ + public CSharpAppResource withEnvironmentExpression(String name, ReferenceExpression 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); + return this; + } + /** Sets environment variables via callback */ public CSharpAppResource withEnvironmentCallback(AspireAction1 callback) { Map reqArgs = new HashMap<>(); @@ -1423,6 +1433,40 @@ 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<>(); @@ -4674,6 +4718,16 @@ public ContainerResource withEnvironment(String name, AspireUnion value) { return this; } + /** Sets an environment variable from a reference expression */ + public ContainerResource withEnvironmentExpression(String name, ReferenceExpression 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); + return this; + } + /** Sets environment variables via callback */ public ContainerResource withEnvironmentCallback(AspireAction1 callback) { Map reqArgs = new HashMap<>(); @@ -4690,6 +4744,40 @@ 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<>(); @@ -6312,6 +6400,16 @@ public DotnetToolResource withEnvironment(String name, AspireUnion value) { return this; } + /** Sets an environment variable from a reference expression */ + public DotnetToolResource withEnvironmentExpression(String name, ReferenceExpression 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); + return this; + } + /** Sets environment variables via callback */ public DotnetToolResource withEnvironmentCallback(AspireAction1 callback) { Map reqArgs = new HashMap<>(); @@ -6328,6 +6426,40 @@ 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<>(); @@ -7889,6 +8021,16 @@ public ExecutableResource withEnvironment(String name, AspireUnion value) { return this; } + /** Sets an environment variable from a reference expression */ + public ExecutableResource withEnvironmentExpression(String name, ReferenceExpression 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); + return this; + } + /** Sets environment variables via callback */ public ExecutableResource withEnvironmentCallback(AspireAction1 callback) { Map reqArgs = new HashMap<>(); @@ -7905,6 +8047,40 @@ 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<>(); @@ -12481,6 +12657,16 @@ public ProjectResource withEnvironment(String name, AspireUnion value) { return this; } + /** Sets an environment variable from a reference expression */ + public ProjectResource withEnvironmentExpression(String name, ReferenceExpression 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); + return this; + } + /** Sets environment variables via callback */ public ProjectResource withEnvironmentCallback(AspireAction1 callback) { Map reqArgs = new HashMap<>(); @@ -12497,6 +12683,40 @@ 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<>(); @@ -14784,6 +15004,16 @@ public TestDatabaseResource withEnvironment(String name, AspireUnion value) { return this; } + /** Sets an environment variable from a reference expression */ + public TestDatabaseResource withEnvironmentExpression(String name, ReferenceExpression 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); + return this; + } + /** Sets environment variables via callback */ public TestDatabaseResource withEnvironmentCallback(AspireAction1 callback) { Map reqArgs = new HashMap<>(); @@ -14800,6 +15030,40 @@ 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<>(); @@ -16399,6 +16663,16 @@ public TestRedisResource withEnvironment(String name, AspireUnion value) { return this; } + /** Sets an environment variable from a reference expression */ + public TestRedisResource withEnvironmentExpression(String name, ReferenceExpression 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); + return this; + } + /** Sets environment variables via callback */ public TestRedisResource withEnvironmentCallback(AspireAction1 callback) { Map reqArgs = new HashMap<>(); @@ -16415,6 +16689,40 @@ 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<>(); @@ -18151,6 +18459,16 @@ public TestVaultResource withEnvironment(String name, AspireUnion value) { return this; } + /** Sets an environment variable from a reference expression */ + public TestVaultResource withEnvironmentExpression(String name, ReferenceExpression 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); + return this; + } + /** Sets environment variables via callback */ public TestVaultResource withEnvironmentCallback(AspireAction1 callback) { Map reqArgs = new HashMap<>(); @@ -18167,6 +18485,40 @@ 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<>(); 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 1a278f56b51..28e06763f10 100644 --- a/tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.py +++ b/tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.py @@ -4855,6 +4855,22 @@ def with_env(self, name: str, value: str | ReferenceExpression | EndpointReferen def with_env_callback(self, callback: typing.Callable[[EnvironmentCallbackContext], None]) -> typing.Self: """Sets environment variables via callback""" + @abc.abstractmethod + def with_env_expression(self, name: str, value: ReferenceExpression) -> typing.Self: + """Sets an environment variable from a reference expression""" + + @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""" @@ -6038,6 +6054,10 @@ class ContainerResourceKwargs(_BaseResourceKwargs, total=False): publish_as_connection_string: typing.Literal[True] env: tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractExpressionValue] env_callback: typing.Callable[[EnvironmentCallbackContext], None] + env_expression: tuple[str, ReferenceExpression] + 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 @@ -6318,6 +6338,54 @@ def with_env_callback(self, callback: typing.Callable[[EnvironmentCallbackContex self._handle = self._wrap_builder(result) return self + def with_env_expression(self, name: str, value: ReferenceExpression) -> typing.Self: + """Sets an environment variable from 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_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} @@ -6869,6 +6937,38 @@ 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_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)") + 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} @@ -7141,6 +7241,10 @@ class ProjectResourceKwargs(_BaseResourceKwargs, total=False): publish_as_docker_file: typing.Callable[[ContainerResource], None] | typing.Literal[True] env: tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractExpressionValue] env_callback: typing.Callable[[EnvironmentCallbackContext], None] + env_expression: tuple[str, ReferenceExpression] + 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 @@ -7258,6 +7362,54 @@ def with_env_callback(self, callback: typing.Callable[[EnvironmentCallbackContex self._handle = self._wrap_builder(result) return self + def with_env_expression(self, name: str, value: ReferenceExpression) -> typing.Self: + """Sets an environment variable from 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_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} @@ -7692,6 +7844,38 @@ 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_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)") + 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} @@ -7973,6 +8157,10 @@ class ExecutableResourceKwargs(_BaseResourceKwargs, total=False): otlp_exporter: OtlpProtocol | typing.Literal[True] env: tuple[str, str | ReferenceExpression | EndpointReference | ParameterResource | AbstractResourceWithConnectionString | AbstractExpressionValue] env_callback: typing.Callable[[EnvironmentCallbackContext], None] + env_expression: tuple[str, ReferenceExpression] + 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 @@ -8091,6 +8279,54 @@ def with_env_callback(self, callback: typing.Callable[[EnvironmentCallbackContex self._handle = self._wrap_builder(result) return self + def with_env_expression(self, name: str, value: ReferenceExpression) -> typing.Self: + """Sets an environment variable from 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_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} @@ -8514,6 +8750,38 @@ 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_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)") + 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} 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 fe96b88315e..bdeda9659ce 100644 --- a/tests/Aspire.Hosting.CodeGeneration.Rust.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.rs +++ b/tests/Aspire.Hosting.CodeGeneration.Rust.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.rs @@ -869,6 +869,17 @@ impl CSharpAppResource { Ok(IResourceWithEnvironment::new(handle, self.client.clone())) } + /// Sets an environment variable from 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(); @@ -880,6 +891,39 @@ 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(); @@ -3331,6 +3375,17 @@ impl ContainerResource { Ok(IResourceWithEnvironment::new(handle, self.client.clone())) } + /// Sets an environment variable from 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(); @@ -3342,6 +3397,39 @@ 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(); @@ -4655,6 +4743,17 @@ impl DotnetToolResource { Ok(IResourceWithEnvironment::new(handle, self.client.clone())) } + /// Sets an environment variable from 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(); @@ -4666,6 +4765,39 @@ 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(); @@ -5967,6 +6099,17 @@ impl ExecutableResource { Ok(IResourceWithEnvironment::new(handle, self.client.clone())) } + /// Sets an environment variable from 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(); @@ -5978,6 +6121,39 @@ 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(); @@ -10175,6 +10351,17 @@ impl ProjectResource { Ok(IResourceWithEnvironment::new(handle, self.client.clone())) } + /// Sets an environment variable from 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(); @@ -10186,6 +10373,39 @@ 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(); @@ -11960,6 +12180,17 @@ impl TestDatabaseResource { Ok(IResourceWithEnvironment::new(handle, self.client.clone())) } + /// Sets an environment variable from 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(); @@ -11971,6 +12202,39 @@ 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(); @@ -13212,6 +13476,17 @@ impl TestRedisResource { Ok(IResourceWithEnvironment::new(handle, self.client.clone())) } + /// Sets an environment variable from 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(); @@ -13223,6 +13498,39 @@ 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(); @@ -14628,6 +14936,17 @@ impl TestVaultResource { Ok(IResourceWithEnvironment::new(handle, self.client.clone())) } + /// Sets an environment variable from 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(); @@ -14639,6 +14958,39 @@ 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(); 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 5dddbb78871..6ec567962be 100644 --- a/tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/HostingContainerResourceCapabilities.verified.txt +++ b/tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/HostingContainerResourceCapabilities.verified.txt @@ -517,6 +517,62 @@ } ] }, + { + 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 fc6c5843bb5..2fcc2bf5047 100644 --- a/tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.ts +++ b/tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.ts @@ -7099,6 +7099,21 @@ 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); + } + + /** Sets an environment variable from 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) => { @@ -7119,6 +7134,51 @@ 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 }; @@ -8472,11 +8532,31 @@ export class ContainerResourcePromise implements PromiseLike return new ContainerResourcePromise(this._promise.then(obj => obj.withEnvironment(name, value))); } + /** Sets an environment variable from 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))); @@ -9005,6 +9085,21 @@ 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); + } + + /** Sets an environment variable from 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) => { @@ -9025,6 +9120,51 @@ 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 }; @@ -10304,11 +10444,31 @@ export class CSharpAppResourcePromise implements PromiseLike return new CSharpAppResourcePromise(this._promise.then(obj => obj.withEnvironment(name, value))); } + /** Sets an environment variable from 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))); @@ -10940,6 +11100,21 @@ 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); + } + + /** Sets an environment variable from 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) => { @@ -10960,6 +11135,51 @@ 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 }; @@ -12259,11 +12479,31 @@ export class DotnetToolResourcePromise implements PromiseLike obj.withEnvironment(name, value))); } + /** Sets an environment variable from 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))); @@ -12800,6 +13040,21 @@ 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); + } + + /** Sets an environment variable from 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) => { @@ -12820,6 +13075,51 @@ 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 }; @@ -14089,11 +14389,31 @@ export class ExecutableResourcePromise implements PromiseLike obj.withEnvironment(name, value))); } + /** Sets an environment variable from 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))); @@ -16615,6 +16935,21 @@ export class ProjectResource extends ResourceBuilderBase 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); + } + + /** Sets an environment variable from 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) => { @@ -16635,6 +16970,51 @@ 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 }; @@ -17914,11 +18294,31 @@ export class ProjectResourcePromise implements PromiseLike { return new ProjectResourcePromise(this._promise.then(obj => obj.withEnvironment(name, value))); } + /** Sets an environment variable from 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))); @@ -18658,6 +19058,21 @@ 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); + } + + /** Sets an environment variable from 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) => { @@ -18678,6 +19093,51 @@ 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 }; @@ -20031,11 +20491,31 @@ export class TestDatabaseResourcePromise implements PromiseLike obj.withEnvironment(name, value))); } + /** Sets an environment variable from 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))); @@ -20775,6 +21255,21 @@ 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); + } + + /** Sets an environment variable from 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) => { @@ -20795,6 +21290,51 @@ 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 }; @@ -22367,11 +22907,31 @@ export class TestRedisResourcePromise implements PromiseLike return new TestRedisResourcePromise(this._promise.then(obj => obj.withEnvironment(name, value))); } + /** Sets an environment variable from 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))); @@ -23186,6 +23746,21 @@ 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); + } + + /** Sets an environment variable from 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) => { @@ -23206,6 +23781,51 @@ 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 }; @@ -24574,11 +25194,31 @@ export class TestVaultResourcePromise implements PromiseLike return new TestVaultResourcePromise(this._promise.then(obj => obj.withEnvironment(name, value))); } + /** Sets an environment variable from 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))); @@ -26668,6 +27308,21 @@ 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); + } + + /** Sets an environment variable from 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) => { @@ -26688,6 +27343,51 @@ 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 }; @@ -26883,11 +27583,31 @@ export class ResourceWithEnvironmentPromise implements PromiseLike obj.withEnvironment(name, value))); } + /** Sets an environment variable from 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)));