EngineConfig.java

/*
 * SPDX-License-Identifier: Apache-2.0
 * Copyright 2026 Nikolas Charalambidis
 */

package dev.nichar.facepalm.config;

import java.util.Set;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;

/**
 * Configuration for scanner execution and file filtering logic.
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class EngineConfig {

    /**
     * Internal defaults for directories to ignore during discovery.
     */
    public static final Set<String> SKIP_DIRS = Set.of(".git", ".svn", ".hg", ".idea", ".vscode", "target", ".mvn",
        ".gradle",
        "node_modules", "dist", ".next", "build", "out");

    /**
     * Thread pool size for parallel scanning. Defaults to available CPUs.
     */
    private Integer threads = Runtime.getRuntime().availableProcessors();

    /**
     * Safety limit for file size to prevent memory exhaustion during analysis.
     */
    @Getter
    private long maxFileSizeBytes = 5 * 1024 * 1024;

    /**
     * Filter for non-text assets and binary artifacts.
     */
    @Getter
    private String skipBinaryRegex = ".*\\.(png|jpg|jpeg|gif|pdf|zip|jar|class|tar|gz|exe|dll)$";

    /**
     * User-defined directory exclusions.
     */
    private Set<String> skipDirs;

    /**
     * Enable verbose logging for successfully processed files.
     */
    @Getter
    private boolean showProcessed = false;

    /**
     * Enable verbose logging for files skipped by filters.
     */
    @Getter
    private boolean showSkipped = false;

    /**
     * Returns the configured thread count or defaults to available processors.
     */
    public Integer getThreads() {
        return threads != null ? threads : Runtime.getRuntime().availableProcessors();
    }

    /**
     * Returns the user-defined skip list or falls back to internal defaults.
     * Maven injects an empty set when the parameter is not configured, so empty also means defaults.
     */
    public Set<String> getSkipDirs() {
        return skipDirs != null && !skipDirs.isEmpty() ? skipDirs : SKIP_DIRS;
    }
}