func Text()

in sg/internal/result/presenter/text.go [13:126]


func Text(queryResultsList []result.QueryResults) WriteQueryResultTo {
	const (
		categoryFAIL      = "FAIL"
		categoryWARNING   = "WARNING"
		categoryEXCEPTION = "EXCEPTION"
	)

	queryResultsObjList := asQueryResultsObjList(queryResultsList)

	var logger cilog.Logger
	switch name := ci.Detect(); name {
	case ci.AzurePipelines:
		// we use LogIssue in Azure pipelines to prompt the error in build details.
		logger = cilog.AzurePipeline(cilog.AzurePipelineUseLogIssue(true))
	default:
		logger = cilog.Get(name)
	}

	printResultObj := func(
		logger cilog.Logger,
		category string,
		filename string,
		o resultObj,
	) {
		var messageDetails string
		if o.Message == "" {
			messageDetails = fmt.Sprintf("(%s)", o.Rule.Name)
		} else {
			messageDetails = fmt.Sprintf("(%s) %s", o.Rule.Name, o.Message)
		}

		println := logger.Log
		switch category {
		case categoryFAIL:
			println = func(s string) { cilog.Error(logger, s) }
		case categoryWARNING:
			println = func(s string) { cilog.Warning(logger, s) }
		}

		println(fmt.Sprintf("%s - %s - %s", category, filename, messageDetails))
	}

	printDocumentLink := func(logger cilog.Logger, docLink string) {
		if docLink == "" {
			return
		}
		logger.Log(fmt.Sprintf("Document: %s", docLink))
	}

	return writeQueryResultToFunc(func(w io.Writer) error {
		logger.SetOutput(w)

		var (
			totalTests  int
			totalPasses int

			failures   []func(cilog.Logger)
			warnings   []func(cilog.Logger)
			exceptions []func(cilog.Logger)
		)

		for _, queryResultObj := range queryResultsObjList {
			totalPasses += queryResultObj.Success

			for _, o := range queryResultObj.Failures {
				o := o
				fileName := queryResultObj.Filename
				failures = append(failures, func(l cilog.Logger) {
					printResultObj(logger, categoryFAIL, fileName, o)
					printDocumentLink(logger, o.Rule.DocLink)
				})
			}
			for _, o := range queryResultObj.Warnings {
				o := o
				fileName := queryResultObj.Filename
				warnings = append(warnings, func(l cilog.Logger) {
					printResultObj(logger, categoryWARNING, fileName, o)
					printDocumentLink(logger, o.Rule.DocLink)
				})
			}
			for _, o := range queryResultObj.Exceptions {
				o := o
				fileName := queryResultObj.Filename
				exceptions = append(exceptions, func(l cilog.Logger) {
					printResultObj(logger, categoryEXCEPTION, fileName, o)
				})
			}
		}

		for _, cb := range failures {
			cb(logger)
		}
		for _, cb := range warnings {
			cb(logger)
		}
		if c := len(exceptions); c > 0 {
			groupName := fmt.Sprintf("EXCEPTIONS (%d)", c)
			excLogger, endExc := cilog.Group(logger, cilog.GroupLogParams{Name: groupName})
			for _, cb := range exceptions {
				cb(excLogger)
			}

			endExc()
		}

		totalTests = totalPasses + len(failures) + len(warnings) + len(exceptions)
		logger.Log(fmt.Sprintf(
			"%d test(s), %d passed, %d failure(s) %d warning(s), %d exception(s)",
			totalTests, totalPasses, len(failures), len(warnings), len(exceptions),
		))

		return nil
	})
}