func generateDocumentation()

in tools/generator-example-doc/main.go [127:213]


func generateDocumentation(inputDir string) (string, error) {
	resourceType := strings.Split(path.Base(inputDir), "@")[0]
	resourceType = strings.ReplaceAll(resourceType, "_", "/")

	resourceProviderName := strings.Split(resourceType, "/")[0]
	resourceTypeWithoutRP := strings.Join(strings.Split(resourceType, "/")[1:], "/")

	resourceProviderFriendlyName := GetResourceProviderFriendlyName(resourceProviderName)
	if resourceProviderFriendlyName == "" {
		return "", fmt.Errorf("resource provider %s friendly name not found, please add it to resource_providers.json", resourceProviderName)
	}

	resourceTypeFriendlyName := GetResourceTypeFriendlyName(resourceType)
	if resourceTypeFriendlyName == "" {
		return "", fmt.Errorf("resource type %s friendly name not found, please add it to resource_types.json", resourceType)
	}

	apiVersions := azure.GetApiVersions(resourceType)
	apiVersion := "API_VERSION"
	if len(apiVersions) > 0 {
		apiVersion = apiVersions[len(apiVersions)-1]
	}

	parentIds := getParentIds(resourceType)

	resourceId := ""
	if len(parentIds) > 0 {
		lastSegment := resourceType[strings.LastIndex(resourceType, "/")+1:]
		if utils.IsTopLevelResourceType(resourceType) {
			resourceId = fmt.Sprintf("%s/providers/%s/%s/{resourceName}", parentIds[0], resourceProviderName, lastSegment)
		} else {
			resourceId = fmt.Sprintf("%s/%s/{resourceName}", parentIds[0], lastSegment)
		}
	}

	out := template
	out = strings.ReplaceAll(out, "{{.subcategory}}", fmt.Sprintf("%s - %s", resourceProviderName, resourceProviderFriendlyName))
	out = strings.ReplaceAll(out, "{{.page_title}}", resourceTypeWithoutRP)
	out = strings.ReplaceAll(out, "{{.resource_type}}", resourceType)
	out = strings.ReplaceAll(out, "{{.resource_type_friendly_name}}", resourceTypeFriendlyName)
	out = strings.ReplaceAll(out, "{{.reference_link}}", fmt.Sprintf("https://learn.microsoft.com/en-us/azure/templates/%s?pivots=deployment-language-terraform", resourceType))
	out = strings.ReplaceAll(out, "{{.api_versions}}", strings.Join(addBackticks(apiVersions), ", "))
	out = strings.ReplaceAll(out, "{{.api_version}}", apiVersion)
	out = strings.ReplaceAll(out, "{{.resource_id}}", resourceId)
	out = strings.ReplaceAll(out, "{{.parent_id}}", strings.Join(addBackticks(parentIds), "  \n  "))

	// key is the scenario name, value is the example content
	exampleMap := make(map[string]string)
	scenarioDirs, err := os.ReadDir(inputDir)
	if err != nil {
		return "", fmt.Errorf("error reading directory: %w", err)
	}
	for _, scenarioDir := range scenarioDirs {
		if !scenarioDir.IsDir() || scenarioDir.Name() == "testdata" {
			continue
		}

		scenarioName := scenarioDir.Name()
		exampleFilePath := path.Join(inputDir, scenarioName, "main.tf")
		exampleContent, err := os.ReadFile(exampleFilePath)
		if err != nil {
			log.Printf("Error reading example file for %s: %s", exampleFilePath, err)
			continue
		}

		exampleMap[scenarioName] = string(exampleContent)
	}
	// check if there's main.tf in the inputDir
	mainFilePath := path.Join(inputDir, "main.tf")
	if _, err := os.Stat(mainFilePath); err == nil {
		exampleContent, err := os.ReadFile(mainFilePath)
		if err != nil {
			log.Printf("Error reading example file for %s: %s", mainFilePath, err)
			return "", err
		}
		exampleMap["default"] = string(exampleContent)
	}

	example := ""
	for scenarioName, exampleContent := range exampleMap {
		example += fmt.Sprintf("### %s\n\n", scenarioName)
		example += fmt.Sprintf("```hcl\n%s\n```\n\n", exampleContent)
	}
	out = strings.ReplaceAll(out, "{{.example}}", example)

	return out, nil
}