Skip to main content

llmwiki_tooling/cmd/
refs.rs

1use crate::error::WikiError;
2use crate::link_index::LinkIndex;
3use crate::page::PageId;
4use crate::wiki::Wiki;
5
6/// Run `refs to <page>`: list all pages that link to the given page.
7pub fn refs_to(wiki: &Wiki, page_name: &str) -> Result<(), WikiError> {
8    let page_id = PageId::from(page_name);
9    let index = LinkIndex::build(wiki)?;
10
11    let mut sources = index.inbound(&page_id);
12    sources.sort();
13
14    for source in &sources {
15        if let Some(entry) = wiki.get(source) {
16            println!("{} -> {page_name}", entry.rel_path.display());
17        } else {
18            println!("{source} -> {page_name}");
19        }
20    }
21
22    if sources.is_empty() {
23        eprintln!("no inbound links to '{page_name}'");
24    }
25
26    Ok(())
27}
28
29/// Run `refs from <page>`: list all pages the given page links to.
30pub fn refs_from(wiki: &Wiki, page_name: &str) -> Result<(), WikiError> {
31    let page_id = PageId::from(page_name);
32    let index = LinkIndex::build(wiki)?;
33
34    let outbound = index.outbound(&page_id);
35
36    let mut targets: Vec<&str> = outbound.iter().map(|wl| wl.page.as_str()).collect();
37    targets.sort();
38    targets.dedup();
39
40    for target in &targets {
41        println!("{page_name} -> {target}");
42    }
43
44    if targets.is_empty() {
45        eprintln!("no outbound links from '{page_name}'");
46    }
47
48    Ok(())
49}
50
51/// Run `refs graph`: dump the full link graph.
52pub fn refs_graph(wiki: &Wiki) -> Result<(), WikiError> {
53    let index = LinkIndex::build(wiki)?;
54    let edges = index.all_edges();
55
56    for (source, target) in &edges {
57        println!("{source} -> {target}");
58    }
59
60    Ok(())
61}