All Downloads are FREE. Search and download functionalities are using the official Maven repository.

xyz.pavelkorolev.danger.detekt.DetektViolationReporter.kt Maven / Gradle / Ivy

package xyz.pavelkorolev.danger.detekt

import systems.danger.kotlin.sdk.DangerContext
import xyz.pavelkorolev.danger.detekt.model.DetektViolation
import xyz.pavelkorolev.danger.detekt.model.DetektViolationSeverity
import java.io.File

/**
 * Interface of violation reporting logic.
 *
 * If you want to report only error level violations or write custom message with emojis
 * feel free to implement this.
 *
 * You could use [DangerContext] to call [DangerContext.message], [DangerContext.warn],
 * [DangerContext.fail] etc functions in your reporter.
 */
fun interface DetektViolationReporter {

    /**
     * Reports a [violation] found by detekt.
     */
    fun report(violation: DetektViolation)
}

/**
 * Out of box reporter implementation which sends [DangerContext.message], [DangerContext.warn] and
 * [DangerContext.fail] based on violation severity with default message, file and line if provided.
 *
 * Created message looks like "**Detekt:** Something wrong **Rule:** detekt.SomethingWrongRule"
 */
class DefaultDetektViolationReporter(
    private val context: DangerContext,
    private val isInlineEnabled: Boolean = true,
) : DetektViolationReporter {

    private val pathPrefix = File("").absolutePath

    override fun report(
        violation: DetektViolation,
    ) {
        val message = createMessage(violation)
        val severity = violation.severity ?: DetektViolationSeverity.WARNING
        val file = violation.filePath?.let(::File)
        val filePath = file?.let(::createFilePath)
        val line = violation.location?.startLine

        if (!isInlineEnabled || line == null || filePath == null) {
            report(message, severity)
            return
        }
        report(message, severity, filePath, line)
    }

    private fun report(
        message: String,
        severity: DetektViolationSeverity,
    ) {
        when (severity) {
            DetektViolationSeverity.INFO -> context.message(message)
            DetektViolationSeverity.WARNING -> context.warn(message)
            DetektViolationSeverity.ERROR -> context.fail(message)
        }
    }

    private fun report(
        message: String,
        severity: DetektViolationSeverity,
        filePath: String,
        line: Int,
    ) {
        when (severity) {
            DetektViolationSeverity.INFO -> context.message(message, filePath, line)
            DetektViolationSeverity.WARNING -> context.warn(message, filePath, line)
            DetektViolationSeverity.ERROR -> context.fail(message, filePath, line)
        }
    }

    private fun createFilePath(file: File): String? {
        if (file.absolutePath == pathPrefix) return null
        return file.absolutePath.removePrefix(pathPrefix + File.separator)
    }

    private fun createMessage(violation: DetektViolation): String {
        val message = violation.message?.let { "**Detekt**: $it" }
        val rule = violation.ruleId?.let { "**Rule**: $it" }
        return listOfNotNull(
            "", // start message with blank line
            message,
            rule,
        ).joinToString(separator = "\n")
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy