import { messages } from '../../../core/messages/index.js';
import { createLineLookup, maskRustComments } from '../../../shared/helpers/index.js';
import { criarAnalista } from '../../../types/index.js';
const disableEnv = process.env.TUTANUS_DISABLE_PLUGIN_RUST === '1';
function detectPotentialErrors(src, relPath) {
    const ocorrencias = [];
    const lineOf = createLineLookup(src).lineAt;
    const scan = maskRustComments(src);
    for (const match of scan.matchAll(/\.unwrap\(\)/g)) {
        const line = lineOf(match.index);
        const fnContext = src.slice(0, match.index).match(/\bfn\s+\w+[\s\S]{0,200}$/);
        const returnsResult = fnContext && /->\s*Result</.test(fnContext[0]);
        const nivel = returnsResult ? messages.SeverityNiveis.warning : messages.SeverityNiveis.error;
        ocorrencias.push({
            relPath,
            mensagem: returnsResult
                ? messages.RustMensagens.unwrapInResult
                : messages.RustMensagens.unwrapUsage,
            linha: line,
            nivel,
            origem: 'detector-erros-potenciais',
            tipo: 'rust/rule'
        });
    }
    for (const match of scan.matchAll(/\.expect\(\)/g)) {
        const line = lineOf(match.index);
        ocorrencias.push({
            relPath,
            mensagem: messages.RustMensagens.emptyExpect,
            linha: line,
            nivel: messages.SeverityNiveis.warning,
            origem: 'detector-erros-potenciais',
            tipo: 'rust/rule'
        });
    }
    for (const match of scan.matchAll(/\.expect\(["'`](failed|error|unwrap failed)["'`]\)/gi)) {
        const line = lineOf(match.index);
        ocorrencias.push({
            relPath,
            mensagem: messages.RustMensagens.genericExpect,
            linha: line,
            nivel: messages.SeverityNiveis.warning,
            origem: 'detector-erros-potenciais',
            tipo: 'rust/rule'
        });
    }
    for (const match of scan.matchAll(/\b(unreachable!|unimplemented!)\s*\(/g)) {
        const line = lineOf(match.index);
        ocorrencias.push({
            relPath,
            mensagem: messages.RustMensagens.stubMacro(match[1]),
            linha: line,
            nivel: messages.SeverityNiveis.warning,
            origem: 'detector-erros-potenciais',
            tipo: 'rust/rule'
        });
    }
    for (const match of scan.matchAll(/\btodo!\s*\(/g)) {
        const line = lineOf(match.index);
        ocorrencias.push({
            relPath,
            mensagem: messages.RustMensagens.todoFound,
            linha: line,
            nivel: messages.SeverityNiveis.warning,
            origem: 'detector-erros-potenciais',
            tipo: 'rust/rule'
        });
    }
    return ocorrencias;
}
export const detectorErrosPotenciais = criarAnalista({
    nome: 'detector-erros-potenciais-rust',
    categoria: 'seguranca',
    descricao: 'Detecta padrões de erro potencial em código Rust.',
    global: false,
    test: (relPath) => /\.(rs)$/i.test(relPath),
    aplicar: async (src, relPath) => {
        if (disableEnv)
            return null;
        const msgs = detectPotentialErrors(src, relPath);
        return msgs.length ? msgs : null;
    }
});
//# sourceMappingURL=detector-errors-potential.js.map