func()

in commands/generate.go [290:365]


func (c *GenerateCommand) generate(apiPaths []swagger.ApiPath) int {
	wd := c.workingDir
	azapiDefinitionsAll := make([]types.AzapiDefinition, 0)
	for _, apiPath := range apiPaths {
		azapiDefinitionsAll = append(azapiDefinitionsAll, resource.NewAzapiDefinitionsFromSwagger(apiPath)...)
	}

	if c.useRawJsonPayload {
		logrus.Infof("using raw json payload in 'body'...")
		for i := range azapiDefinitionsAll {
			azapiDefinitionsAll[i].BodyFormat = types.BodyFormatJson
		}
	}

	azapiDefinitionByResourceType := make(map[string][]types.AzapiDefinition)
	for _, azapiDefinition := range azapiDefinitionsAll {
		azureResourceType := azapiDefinition.AzureResourceType
		// To avoid the case that there are multiple resource types with the same name but different casing
		for resourceType := range azapiDefinitionByResourceType {
			if strings.EqualFold(resourceType, azureResourceType) {
				azureResourceType = resourceType
			}
		}
		azapiDefinitionByResourceType[azureResourceType] = append(azapiDefinitionByResourceType[azureResourceType], azapiDefinition)
	}

	resourceTypes := make([]string, 0)
	for resourceType := range azapiDefinitionByResourceType {
		slices.SortFunc(azapiDefinitionByResourceType[resourceType], func(i, j types.AzapiDefinition) int {
			return azapiDefinitionOrder(i) - azapiDefinitionOrder(j)
		})
		resourceTypes = append(resourceTypes, resourceType)
	}

	sort.Strings(resourceTypes)

	referenceResolvers := []resolver.ReferenceResolver{
		resolver.NewAzapiDependencyResolver(),
		resolver.NewAzapiDefinitionResolver(azapiDefinitionsAll),
		resolver.NewProviderIDResolver(),
		resolver.NewLocationIDResolver(),
		resolver.NewAzapiResourceIdResolver(),
	}

	for _, resourceType := range resourceTypes {
		logrus.Infof("generating terraform configurations for %s...", resourceType)
		azapiDefinitions := azapiDefinitionByResourceType[resourceType]
		// remove existing folders by default
		folderName := strings.ReplaceAll(resourceType, "/", "_")
		err := os.RemoveAll(path.Join(wd, folderName))
		if err != nil {
			logrus.Errorf("removing existing folder: %+v", err)
		}
		err = os.MkdirAll(path.Join(wd, folderName), 0755)
		if err != nil {
			logrus.Fatalf("creating folder: %+v", err)
		}

		context := resource.NewContext(referenceResolvers)

		for _, azapiDefinition := range azapiDefinitions {
			logrus.Debugf("generating terraform configurations for %s...", azapiDefinition.Id)
			err = context.AddAzapiDefinition(azapiDefinition)
			if err != nil {
				logrus.Warnf("adding azapi definition for %s: %+v", azapiDefinition.Id, err)
			}
		}

		filename := path.Join(wd, folderName, "main.tf")
		err = os.WriteFile(filename, hclwrite.Format([]byte(context.String())), 0644)
		if err != nil {
			logrus.Errorf("writing %s: %+v", filename, err)
		}
	}
	return 0
}