internal/renderers/json/json.go (54 lines of code) (raw):
package json
import (
"encoding/json"
"fmt"
"os"
"github.com/Azure/azqr/internal/renderers"
"github.com/iancoleman/strcase"
"github.com/rs/zerolog/log"
)
func CreateJsonReport(data *renderers.ReportData) {
writeData(data.RecommendationsTable(), data.OutputFileName, "recommendations")
writeData(data.ImpactedTable(), data.OutputFileName, "impacted")
writeData(data.ResourceTypesTable(), data.OutputFileName, "resourceType")
writeData(data.ResourcesTable(), data.OutputFileName, "inventory")
writeData(data.DefenderTable(), data.OutputFileName, "defender")
writeData(data.DefenderRecommendationsTable(), data.OutputFileName, "defenderRecommendations")
writeData(data.AdvisorTable(), data.OutputFileName, "advisor")
writeData(data.CostTable(), data.OutputFileName, "costs")
writeData(data.ExcludedResourcesTable(), data.OutputFileName, "outofscope")
}
func writeData(data [][]string, fileName, extension string) {
filename := fmt.Sprintf("%s.%s.json", fileName, extension)
log.Info().Msgf("Generating Report: %s", filename)
f, err := os.Create(filename)
if err != nil {
log.Fatal().Err(err).Msg("error creating json:")
}
defer func() {
// Handle error during file close
if cerr := f.Close(); cerr != nil {
log.Fatal().Err(cerr).Msg("error closing file:")
}
}()
jsonData := convertToJSON(data)
js, err := json.MarshalIndent(jsonData, "", "\t")
if err != nil {
log.Fatal().Err(err).Msg("error marshaling data:")
}
_, err = f.Write(js)
if err != nil {
log.Fatal().Err(err).Msg("error writing json:")
}
}
func convertToJSON(data [][]string) []map[string]string {
var result []map[string]string
headers := data[0]
for _, row := range data[1:] {
item := make(map[string]string)
for i, value := range row {
item[strcase.ToLowerCamel(headers[i])] = value
}
result = append(result, item)
}
return result
}