in cli/azd/extensions/microsoft.azd.extensions/internal/resources/languages/dotnet/commands/PromptCommand.cs [17:214]
public Command Build()
{
var cmd = new Command("prompt", "Examples of prompting the user for input.");
cmd.SetHandler(async () =>
{
var context = new AzureContext { Scope = new AzureScope() };
// === Prompt user for service choices ===
var multiSelectRequest = new MultiSelectRequest
{
Options = new MultiSelectOptions
{
Message = "Which Azure services do you use most with AZD?"
}
};
multiSelectRequest.Options.Choices.AddRange(
[
new MultiSelectChoice { Label = "Container Apps", Value = "container-apps" },
new MultiSelectChoice { Label = "Functions", Value = "functions" },
new MultiSelectChoice { Label = "Static Web Apps", Value = "static-web-apps" },
new MultiSelectChoice { Label = "App Service", Value = "app-service" },
new MultiSelectChoice { Label = "Cosmos DB", Value = "cosmos-db" },
new MultiSelectChoice { Label = "SQL Database", Value = "sql-db" },
new MultiSelectChoice { Label = "Storage", Value = "storage" },
new MultiSelectChoice { Label = "Key Vault", Value = "key-vault" },
new MultiSelectChoice { Label = "Kubernetes Service", Value = "kubernetes-service" },
]);
await _azdClient.Prompt.MultiSelectAsync(multiSelectRequest);
// === Confirm whether to continue with resource selection ===
var confirmSearch = await _azdClient.Prompt.ConfirmAsync(new ConfirmRequest
{
Options = new ConfirmOptions
{
Message = "Do you want to search for Azure resources?",
DefaultValue = true
}
});
if (confirmSearch?.Value != true) return;
// === Prompt subscription ===
var subResponse = await _azdClient.Prompt.PromptSubscriptionAsync(new());
context.Scope.SubscriptionId = subResponse.Subscription.Id;
context.Scope.TenantId = subResponse.Subscription.TenantId;
// === Setup Azure credentials and clients ===
var credential = new AzureDeveloperCliCredential(new AzureDeveloperCliCredentialOptions
{
TenantId = context.Scope.TenantId
});
var armClient = new ArmClient(credential, context.Scope.SubscriptionId);
var subscription = armClient.GetSubscriptionResource(new ResourceIdentifier($"/subscriptions/{context.Scope.SubscriptionId}"));
string? fullResourceType = null;
// === Ask to filter by resource type ===
var filterByType = await _azdClient.Prompt.ConfirmAsync(new ConfirmRequest
{
Options = new ConfirmOptions
{
Message = "Do you want to filter by resource type?",
DefaultValue = false
}
});
if (filterByType?.Value == true)
{
var providers = subscription.GetResourceProviders().ToList();
var registeredProviders = providers
.Where(p => p.Data.RegistrationState == "Registered")
.ToList();
var selectOptionsForProvider = new SelectOptions
{
Message = "Select a resource provider"
};
selectOptionsForProvider.Choices.AddRange(
registeredProviders.Select((p, i) => new SelectChoice { Label = p.Data.Namespace, Value = i.ToString() })
);
var selectedProviderResponse = await _azdClient.Prompt.SelectAsync(new SelectRequest
{
Options = selectOptionsForProvider
});
var selectedProviderIndex = selectedProviderResponse.Value;
var selectedProvider = registeredProviders[selectedProviderIndex];
var resourceTypes = selectedProvider.Data.ResourceTypes;
var selectOptionsForResourceType = new SelectOptions
{
Message = $"Select a {selectedProvider.Data.Namespace} resource type"
};
selectOptionsForResourceType.Choices.AddRange(
resourceTypes.Select((rt, i) => new SelectChoice { Label = rt.ResourceType, Value = i.ToString() })
);
var selectedResourceTypeResponse = await _azdClient.Prompt.SelectAsync(new SelectRequest
{
Options = selectOptionsForResourceType
});
var selectedResourceTypeIndex = selectedResourceTypeResponse.Value;
var selectedType = resourceTypes[selectedResourceTypeIndex];
fullResourceType = $"{selectedProvider.Data.Namespace}/{selectedType.ResourceType}";
}
// === Ask to filter by resource group ===
var filterByGroup = await _azdClient.Prompt.ConfirmAsync(new ConfirmRequest
{
Options = new ConfirmOptions
{
Message = "Do you want to filter by resource group?",
DefaultValue = false
}
});
ResourceExtended? selectedResource;
if (filterByGroup?.Value == true)
{
var rgResponse = await _azdClient.Prompt.PromptResourceGroupAsync(new PromptResourceGroupRequest
{
AzureContext = context
});
context.Scope.ResourceGroup = rgResponse.ResourceGroup.Name;
var resourceGroupRes = await _azdClient.Prompt.PromptResourceGroupResourceAsync(new PromptResourceGroupResourceRequest
{
AzureContext = context,
Options = new PromptResourceOptions
{
ResourceType = fullResourceType,
SelectOptions = new PromptResourceSelectOptions
{
AllowNewResource = false
}
}
});
selectedResource = resourceGroupRes.Resource;
}
else
{
var subscriptionRes = await _azdClient.Prompt.PromptSubscriptionResourceAsync(new PromptSubscriptionResourceRequest
{
AzureContext = context,
Options = new PromptResourceOptions
{
ResourceType = fullResourceType,
SelectOptions = new PromptResourceSelectOptions
{
AllowNewResource = false
}
}
});
selectedResource = subscriptionRes.Resource;
}
// === Parse and display resource info ===
var parsed = new
{
SubscriptionID = selectedResource.Id.Split('/')[2],
ResourceGroup = selectedResource.Id.Split('/')[4],
Name = selectedResource.Id.Split('/').Last(),
Location = selectedResource.Location
};
AnsiConsole.WriteLine();
AnsiConsole.MarkupLine("[cyan]Selected resource:[/]");
var info = new Dictionary<string, string?>
{
["Subscription ID"] = parsed.SubscriptionID,
["Resource Group"] = parsed.ResourceGroup,
["Name"] = parsed.Name,
["Type"] = selectedResource.Type,
["Location"] = parsed.Location,
["Kind"] = selectedResource.Kind
};
foreach (var kvp in info)
{
var value = string.IsNullOrWhiteSpace(kvp.Value) ? "N/A" : kvp.Value;
AnsiConsole.MarkupLine($"[white]{kvp.Key}[/]: [grey]{value}[/]");
}
});
return cmd;
}