the-code-graph-cli 0.1.2

Command-line interface for The Code Graph
Documentation
use domain::error::Result;
use domain::model::EdgeKind;
use domain::ports::GraphStore;
use domain::use_cases::query::QueryUseCase;

use crate::commands::helpers::open_graph;
use crate::commands::FindArgs;
use crate::output::{print, FindResult, OutputFormat};

pub fn run_find(args: &FindArgs, output_format: OutputFormat) -> Result<()> {
    let (store, _root) = open_graph()?;
    let uc = QueryUseCase::new(store.clone(), store.clone());
    let symbols = uc.find(&args.pattern)?;

    let mut results = Vec::new();
    for symbol in symbols {
        let callers: Vec<String> = store
            .get_edges_to(&symbol.qualified_name)?
            .into_iter()
            .filter(|e| e.kind == EdgeKind::Calls)
            .map(|e| e.source)
            .collect();
        let callees: Vec<String> = store
            .get_edges_from(&symbol.qualified_name)?
            .into_iter()
            .filter(|e| e.kind == EdgeKind::Calls)
            .map(|e| e.target)
            .collect();
        let tested_by: Vec<String> = store
            .get_edges_to(&symbol.qualified_name)?
            .into_iter()
            .filter(|e| e.kind == EdgeKind::TestedBy)
            .map(|e| e.source)
            .collect();
        results.push(FindResult {
            symbol,
            callers,
            callees,
            tested_by,
        });
    }

    print(&results, output_format);
    Ok(())
}