repopilot 0.1.0

Local-first codebase audit CLI with evidence-backed findings
Documentation
use crate::scan::types::{Marker, MarkerKind};
use std::path::Path;

pub fn detect_markers(path: &Path, content: &str) -> Vec<Marker> {
    let mut markers = Vec::new();

    for (index, line) in content.lines().enumerate() {
        let Some(comment_text) = comment_text(line) else {
            continue;
        };

        let line_number = index + 1;
        if comment_text.contains("TODO") {
            markers.push(Marker {
                kind: MarkerKind::Todo,
                line_number,
                path: path.to_path_buf(),
                text: line.to_string(),
            });
        }
        if comment_text.contains("FIXME") {
            markers.push(Marker {
                kind: MarkerKind::Fixme,
                line_number,
                path: path.to_path_buf(),
                text: line.to_string(),
            });
        }
        if comment_text.contains("HACK") {
            markers.push(Marker {
                kind: MarkerKind::Hack,
                line_number,
                path: path.to_path_buf(),
                text: line.to_string(),
            });
        }
    }

    markers
}

fn comment_text(line: &str) -> Option<&str> {
    const COMMENT_MARKERS: &[&str] = &["//", "#", "--", "/*", "*", "<!--"];

    COMMENT_MARKERS
        .iter()
        .filter_map(|marker| line.find(marker).map(|index| (index, marker.len())))
        .min_by_key(|(index, _)| *index)
        .map(|(index, marker_len)| &line[index + marker_len..])
}