core_api/repograph/
rules.rs1use core_rules::{default_max_edges, Predicate, RuleDef};
12
13pub const ABOUT_LABELS: [&str; 5] = ["Author", "Concept", "File", "Note", "Symbol"];
16
17#[must_use]
20pub fn about_rule(label: &str) -> RuleDef {
21 key_rule(
22 &format!("about_{}", label.to_lowercase()),
23 "Note",
24 label,
25 "about",
26 "ABOUT",
27 )
28}
29
30#[must_use]
33pub fn concept_sources_rule() -> RuleDef {
34 key_rule(
35 "concept_sources",
36 "Concept",
37 "File",
38 "source_files",
39 "DESCRIBED_IN",
40 )
41}
42
43fn key_rule(name: &str, src: &str, dst: &str, field: &str, edge: &str) -> RuleDef {
46 let predicate = Predicate::KeyMatch {
47 field: field.into(),
48 };
49 let max_edges = Some(default_max_edges(&predicate));
50 RuleDef {
51 name: name.into(),
52 src_label: src.into(),
53 dst_label: dst.into(),
54 predicate,
55 edge_type: edge.into(),
56 weight_prop: None,
57 max_edges,
58 approximate: false,
59 via_label: None,
60 via_edge: None,
61 via_dir: None,
62 }
63}
64
65#[cfg(test)]
66mod tests {
67 use super::*;
68
69 #[test]
70 fn about_rule_names_and_shapes_match_one_label_per_call() {
71 let r = about_rule("Concept");
72 assert_eq!(r.name, "about_concept");
73 assert_eq!(r.src_label, "Note");
74 assert_eq!(r.dst_label, "Concept");
75 assert_eq!(r.edge_type, "ABOUT");
76 assert_eq!(r.max_edges, Some(default_max_edges(&r.predicate)));
77 }
78
79 #[test]
80 fn concept_sources_rule_is_concept_to_file() {
81 let r = concept_sources_rule();
82 assert_eq!(r.name, "concept_sources");
83 assert_eq!(r.src_label, "Concept");
84 assert_eq!(r.dst_label, "File");
85 assert_eq!(r.edge_type, "DESCRIBED_IN");
86 }
87}