aboutsummaryrefslogtreecommitdiff
path: root/rprt-engine/src/explainer.rs
diff options
context:
space:
mode:
authortslil <tslil@posteo.de>2025-10-19 18:33:45 +0100
committertslil <tslil@posteo.de>2025-10-19 18:38:09 +0100
commit3a13599095b1aaf69f949447251124a03bdf03a9 (patch)
treecfadbbfa0fee0f927bcf06c03b974d6f078d4d4b /rprt-engine/src/explainer.rs
parentaac3f4415820c9a14ece67f370de7ee14bb6b023 (diff)
Display groups more nicely
Diffstat (limited to 'rprt-engine/src/explainer.rs')
-rw-r--r--rprt-engine/src/explainer.rs40
1 files changed, 21 insertions, 19 deletions
diff --git a/rprt-engine/src/explainer.rs b/rprt-engine/src/explainer.rs
index b62bee4..9770c72 100644
--- a/rprt-engine/src/explainer.rs
+++ b/rprt-engine/src/explainer.rs
@@ -32,13 +32,19 @@ fn main() {
print!("{}", tree);
}
+enum NodeKind {
+ Hook(HookKind),
+ Train(u32),
+ Group,
+ Plain,
+}
+
struct TreeNode {
pos: usize,
depth: usize,
children: Vec<usize>,
is_leaf: bool,
- hook_kind: Option<HookKind>,
- train_arity: Option<u8>,
+ node_kind: NodeKind,
}
fn generate_tree(formatted: &str, expr: &Composite) -> String {
@@ -111,12 +117,13 @@ fn generate_tree(formatted: &str, expr: &Composite) -> String {
let node_at_pos = interior.iter().find(|n| n.pos == i);
if let Some(node) = node_at_pos {
- if let Some(hook_kind) = node.hook_kind {
- line[i] = hook_kind.to_string().chars().next().unwrap();
- } else if let Some(arity) = node.train_arity {
- line[i] = char::from_digit(arity as u32, 10).unwrap();
- } else if up || down || in_span {
- line[i] = box_char(up, down, left, right);
+ match node.node_kind {
+ NodeKind::Hook(hook_kind) => line[i] = hook_kind.to_string().chars().next().unwrap(),
+ NodeKind::Train(arity) => line[i] = char::from_digit(arity as u32, 10).unwrap(),
+ NodeKind::Group => line[i] = '+',
+ NodeKind::Plain => if up || down || in_span {
+ line[i] = box_char(up, down, left, right);
+ }
}
} else if up || down || in_span {
line[i] = box_char(up, down, left, right);
@@ -161,8 +168,7 @@ fn build_tree_from_expr(
depth,
children: vec![],
is_leaf: true,
- hook_kind: None,
- train_arity: None,
+ node_kind: NodeKind::Plain,
});
offset
}
@@ -177,8 +183,7 @@ fn build_tree_from_expr(
depth,
children: vec![f_pos, g_pos],
is_leaf: false,
- hook_kind: None,
- train_arity: Some(2),
+ node_kind: NodeKind::Train(2),
});
f_pos
}
@@ -195,8 +200,7 @@ fn build_tree_from_expr(
depth,
children: vec![f_pos, g_pos, h_pos],
is_leaf: false,
- hook_kind: None,
- train_arity: Some(3),
+ node_kind: NodeKind::Train(3),
});
g_pos
}
@@ -211,14 +215,13 @@ fn build_tree_from_expr(
depth,
children: vec![left_pos, right_pos],
is_leaf: false,
- hook_kind: Some(*kind),
- train_arity: None,
+ node_kind: NodeKind::Hook(*kind),
});
left_pos
}
Composite::Group { operations } => {
let mut children = Vec::new();
- let mut current_offset = offset + 1;
+ let mut current_offset = offset + 2;
for (i, op) in operations.iter().enumerate() {
if i > 0 {
@@ -235,8 +238,7 @@ fn build_tree_from_expr(
depth,
children,
is_leaf: false,
- hook_kind: None,
- train_arity: None,
+ node_kind: NodeKind::Group,
});
node_pos
}