From 27416cf782c10593700623a076f26bdefa45a766 Mon Sep 17 00:00:00 2001 From: Joscha Date: Mon, 26 Aug 2024 19:42:47 +0200 Subject: [PATCH] Add philosophy-game trace command --- brood/src/commands/philosophy_game.rs | 50 ++++++++++++++++++++++++--- brood/src/main.rs | 1 + 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/brood/src/commands/philosophy_game.rs b/brood/src/commands/philosophy_game.rs index 982fcb6..178df1d 100644 --- a/brood/src/commands/philosophy_game.rs +++ b/brood/src/commands/philosophy_game.rs @@ -11,7 +11,7 @@ use crate::{ info::{LinkInfo, PageInfo}, store, }, - PhilosophyGameCmd, + util, PhilosophyGameCmd, }; struct PageMap(Vec); @@ -142,6 +142,38 @@ fn print_forward_edges_as_json( Ok(()) } +fn print_trace(data: &AdjacencyList, forward: &PageMap, start: &str) { + let start_idx = util::resolve_redirects(data, util::find_index_of_title(&data.pages, start)); + + let mut current = start_idx; + let mut visited = HashSet::new(); + loop { + let page = data.page(current); + let title = &page.data.title; + if page.data.redirect { + println!(" v {title}"); + } else { + println!(" - {title}"); + } + + visited.insert(current); + + let next = forward.get(current); + + if next == u32::MAX { + println!("dead-end reached"); + return; + } + + if visited.contains(&next) { + println!("loop detected"); + return; + } + + current = next; + } +} + fn print_canonical_pages_as_json( data: &AdjacencyList, cluster: &PageMap, @@ -171,10 +203,18 @@ pub fn run(datafile: &Path, subcmd: PhilosophyGameCmd) -> io::Result<()> { eprintln!(">> Forward"); let forward = find_forward_edges(&data); - if subcmd == PhilosophyGameCmd::First { - eprintln!(">> First links"); - print_forward_edges_as_json(&data, &forward)?; - return Ok(()); + match subcmd { + PhilosophyGameCmd::First => { + eprintln!(">> First links"); + print_forward_edges_as_json(&data, &forward)?; + return Ok(()); + } + PhilosophyGameCmd::Trace { start } => { + eprintln!(">> Tracing"); + print_trace(&data, &forward, &start); + return Ok(()); + } + _ => {} } // Determine cluster for each page, represented via canonical page. The diff --git a/brood/src/main.rs b/brood/src/main.rs index 737d72a..e4b4074 100644 --- a/brood/src/main.rs +++ b/brood/src/main.rs @@ -12,6 +12,7 @@ pub enum PhilosophyGameCmd { First, Canonical, Cluster, + Trace { start: String }, } #[derive(Debug, Parser)]