func mapHostUses()

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
}