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
}