use super::*;
#[derive(clap::Args, Debug)]
#[command(after_long_help = "\
Examples:
mnem blame <node-uuid> # list incoming edges
mnem blame <node-uuid> --etype authored # only one edge-type
")]
pub(crate) struct Args {
pub node: String,
#[arg(long)]
pub etype: Option<String>,
}
pub(crate) fn run(override_path: Option<&Path>, args: Args) -> Result<()> {
let (_dir, r, _bs, _ohs) = repo::open_all(override_path)?;
let node_id = NodeId::parse_uuid(&args.node).context("parsing node id")?;
let filter = args.etype.as_deref();
let filter_slice = filter.map(|s| [s]);
let filter_ref = filter_slice.as_ref().map(|arr| &arr[..]);
let edges = r
.incoming_edges(&node_id, filter_ref)
.context("walking incoming-adjacency index")?;
let head = r
.view()
.heads
.first()
.map_or_else(|| "<no-head>".into(), ToString::to_string);
if edges.is_empty() {
println!("<no incoming edges>");
return Ok(());
}
println!(
"{:<36} {:<16} {:<36} in_commit",
"edge_id", "etype", "src"
);
for e in &edges {
println!(
"{} {:<16} {} {head}",
e.id.to_uuid_string(),
e.etype,
e.src.to_uuid_string()
);
}
Ok(())
}