forge-pilot 0.1.0

Closed-loop orchestrator over runtime advisories, kernel oracles, and canonical Forge export/import lanes
Documentation
pub(crate) mod generic;
pub(crate) mod python;
pub(crate) mod rust;
pub(crate) mod typescript;

use crate::bootstrap::types::{ChunkRecord, SourceFileRecord, SymbolRecord, MAX_SYMBOL_SCAN_BYTES};

#[derive(Debug, Clone)]
pub(crate) struct SymbolExtractionResult {
    pub symbols: Vec<SymbolRecord>,
    pub degraded_reason: Option<String>,
}

pub(crate) fn extract_symbols(
    file: &SourceFileRecord,
    chunks: &[ChunkRecord],
) -> SymbolExtractionResult {
    if file.byte_count > MAX_SYMBOL_SCAN_BYTES {
        return SymbolExtractionResult {
            symbols: Vec::new(),
            degraded_reason: Some(format!(
                "symbol extraction skipped above {} byte threshold",
                MAX_SYMBOL_SCAN_BYTES
            )),
        };
    }

    let extraction = match file.language.as_str() {
        "rust" => rust::extract(file),
        "typescript" | "javascript" => SymbolExtractionResult {
            symbols: typescript::extract(file),
            degraded_reason: None,
        },
        "python" => SymbolExtractionResult {
            symbols: python::extract(file),
            degraded_reason: None,
        },
        _ => SymbolExtractionResult {
            symbols: generic::extract(file),
            degraded_reason: None,
        },
    };
    let mut symbols = extraction.symbols;

    for symbol in &mut symbols {
        symbol.parent_chunk_id = chunks
            .iter()
            .find(|chunk| {
                symbol.line_start >= chunk.start_line && symbol.line_start <= chunk.end_line
            })
            .map(|chunk| chunk.chunk_id.clone());
    }

    SymbolExtractionResult {
        symbols,
        degraded_reason: extraction.degraded_reason,
    }
}