in cli/azd/pkg/project/scaffold_gen.go [471:556]
func mapHostUses(
res *ResourceConfig,
svcSpec *scaffold.ServiceSpec,
backendMapping map[string]string,
existingMap map[string]*scaffold.ExistingResource,
prj *ProjectConfig) error {
for _, use := range res.Uses {
useRes, ok := prj.Resources[use]
if !ok {
return fmt.Errorf("resource %s uses %s, which does not exist", res.Name, use)
}
if useRes.Existing {
resourceMeta, ok := scaffold.ResourceMetaFromType(useRes.Type.AzureResourceType())
if !ok {
return fmt.Errorf("resource type '%s' is not currently supported for existing", string(res.Type))
}
existingDecl := existingMap[use]
emitEnv := EmitEnv{FuncMap: scaffold.BaseEmitBicepFuncMap(), ResourceVarName: existingDecl.Name}
emitter := func(val *scaffold.ExpressionVar, results map[string]string) error {
return emitVariable(emitEnv, val, results)
}
results, err := scaffold.EmitBicep(resourceMeta.Variables, emitter)
if err != nil {
return fmt.Errorf("emitting bicep bindings for '%s': %w", useRes.Name, err)
}
for key, value := range results {
envKey := scaffold.EnvVarName(
fmt.Sprintf("%s_%s", resourceMeta.StandardVarPrefix, environment.Key(use)),
key)
if envValue, exists := svcSpec.Env[envKey]; exists {
panic(fmt.Sprintf(
"env collision: env value %s already set to %s, cannot set to %s", envKey, envValue, value))
}
svcSpec.Env[envKey] = value
}
svcSpec.Existing = append(svcSpec.Existing, existingDecl)
continue
}
switch useRes.Type {
case ResourceTypeDbMongo:
svcSpec.DbCosmosMongo = &scaffold.DatabaseReference{DatabaseName: useRes.Name}
case ResourceTypeDbCosmos:
svcSpec.DbCosmos = &scaffold.DatabaseReference{DatabaseName: useRes.Name}
case ResourceTypeDbPostgres:
svcSpec.DbPostgres = &scaffold.DatabaseReference{DatabaseName: useRes.Name}
case ResourceTypeDbMySql:
svcSpec.DbMySql = &scaffold.DatabaseReference{DatabaseName: useRes.Name}
case ResourceTypeDbRedis:
svcSpec.DbRedis = &scaffold.DatabaseReference{DatabaseName: useRes.Name}
case ResourceTypeHostAppService,
ResourceTypeHostContainerApp:
if svcSpec.Frontend == nil {
svcSpec.Frontend = &scaffold.Frontend{}
}
svcSpec.Frontend.Backends = append(svcSpec.Frontend.Backends,
scaffold.ServiceReference{Name: use})
backendMapping[use] = res.Name // record the backend -> frontend mapping
case ResourceTypeOpenAiModel:
svcSpec.AIModels = append(svcSpec.AIModels, scaffold.AIModelReference{Name: use})
case ResourceTypeMessagingEventHubs:
svcSpec.EventHubs = &scaffold.EventHubs{}
case ResourceTypeMessagingServiceBus:
svcSpec.ServiceBus = &scaffold.ServiceBus{}
case ResourceTypeStorage:
svcSpec.StorageAccount = &scaffold.StorageReference{}
case ResourceTypeAiProject:
svcSpec.AiFoundryProject = &scaffold.AiFoundrySpec{}
case ResourceTypeAiSearch:
svcSpec.AISearch = &scaffold.AISearchReference{}
case ResourceTypeKeyVault:
svcSpec.KeyVault = &scaffold.KeyVaultReference{}
}
}
return nil
}