predicates_tree/
lib.rs
1use std::fmt;
12
13use predicates_core::reflection;
14
15pub trait CaseTreeExt {
17 fn tree(&self) -> CaseTree;
19}
20
21impl<'a> CaseTreeExt for reflection::Case<'a> {
22 fn tree(&self) -> CaseTree {
23 CaseTree(convert(self))
24 }
25}
26
27type CaseTreeInner = treeline::Tree<Box<dyn fmt::Display>>;
28
29fn convert(case: &reflection::Case<'_>) -> CaseTreeInner {
30 let mut leaves: Vec<CaseTreeInner> = vec![];
31
32 leaves.extend(case.predicate().iter().flat_map(|pred| {
33 pred.parameters().map(|item| {
34 let root: Box<dyn fmt::Display> = Box::new(item.to_string());
35 treeline::Tree::new(root, vec![])
36 })
37 }));
38
39 leaves.extend(case.products().map(|item| {
40 let root: Box<dyn fmt::Display> = Box::new(item.to_string());
41 treeline::Tree::new(root, vec![])
42 }));
43
44 leaves.extend(case.children().map(|item| convert(item)));
45
46 let root = Box::new(case.predicate().map(|p| p.to_string()).unwrap_or_default());
47 CaseTreeInner::new(root, leaves)
48}
49
50#[allow(missing_debug_implementations)]
52pub struct CaseTree(CaseTreeInner);
53
54impl fmt::Display for CaseTree {
55 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
56 self.0.fmt(f)
57 }
58}