func writeSummary()

in scripts/update_assets_md/main.go [190:261]


func writeSummary(plannedByProvider, implementedByProvider *ByProvider, filepath string) error {
	file, err := os.Create(filepath)
	if err != nil {
		return err
	}
	defer file.Close()

	for providerNo, provider := range []string{AWS_PREFIX, AZURE_PREFIX, GCP_PREFIX} {
		planned := plannedByProvider.Get(provider)
		implemented := implementedByProvider.Get(provider)
		sortedKeys := slices.Sorted(maps.Keys(planned))

		// stats
		totalImplemented := 0
		implementedByCategory := map[string]int{}
		plannedByCategory := map[string]int{}

		// table of assets
		table := []string{
			"<details> <summary>Full table</summary>\n",
			"| Category | Old Type | Type | Implemented? |",
			"|---|---|---|---|",
		}

		for _, key := range sortedKeys {
			item := planned[key]
			status := "No ❌"

			plannedByCategory[item.Category] += 1
			if _, ok := implemented[key]; ok {
				status = "Yes ✅"
				totalImplemented += 1
				implementedByCategory[item.Category] += 1
			}
			table = append(table,
				fmt.Sprintf(
					"| %s | %s | %s | %s |",
					item.Category, item.OldType, item.Type, status,
				),
			)
		}
		table = append(table, "\n</details>")

		// write ASSETS.md
		if providerNo > 0 {
			writeToFile(file, "\n\n")
		}
		writeToFile(file, fmt.Sprintf("## %s Resources\n\n", strings.ToUpper(provider)))

		percentage := totalImplemented * 100 / len(planned)
		writeToFile(
			file,
			fmt.Sprintf("**Progress: %d%% (%d/%d)**\n", percentage, totalImplemented, len(planned)),
		)

		sortedCategories := slices.Sorted(maps.Keys(plannedByCategory))

		for _, category := range sortedCategories {
			plannedCount := plannedByCategory[category]
			implementedCount := implementedByCategory[category]
			percentage = implementedCount * 100 / plannedCount
			writeToFile(
				file,
				fmt.Sprintf("%s: %d%% (%d/%d)\n", category, percentage, implementedCount, plannedCount),
			)
		}
		writeToFile(file, "\n"+strings.Join(table, "\n"))
	}
	writeToFile(file, "\n") // required for valid Markdown :o

	return nil
}