use core_rules::{default_max_edges, Predicate, RuleDef};
pub const ABOUT_LABELS: [&str; 5] = ["Author", "Concept", "File", "Note", "Symbol"];
#[must_use]
pub fn about_rule(label: &str) -> RuleDef {
key_rule(
&format!("about_{}", label.to_lowercase()),
"Note",
label,
"about",
"ABOUT",
)
}
#[must_use]
pub fn concept_sources_rule() -> RuleDef {
key_rule(
"concept_sources",
"Concept",
"File",
"source_files",
"DESCRIBED_IN",
)
}
fn key_rule(name: &str, src: &str, dst: &str, field: &str, edge: &str) -> RuleDef {
let predicate = Predicate::KeyMatch {
field: field.into(),
};
let max_edges = Some(default_max_edges(&predicate));
RuleDef {
name: name.into(),
src_label: src.into(),
dst_label: dst.into(),
predicate,
edge_type: edge.into(),
weight_prop: None,
max_edges,
approximate: false,
via_label: None,
via_edge: None,
via_dir: None,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn about_rule_names_and_shapes_match_one_label_per_call() {
let r = about_rule("Concept");
assert_eq!(r.name, "about_concept");
assert_eq!(r.src_label, "Note");
assert_eq!(r.dst_label, "Concept");
assert_eq!(r.edge_type, "ABOUT");
assert_eq!(r.max_edges, Some(default_max_edges(&r.predicate)));
}
#[test]
fn concept_sources_rule_is_concept_to_file() {
let r = concept_sources_rule();
assert_eq!(r.name, "concept_sources");
assert_eq!(r.src_label, "Concept");
assert_eq!(r.dst_label, "File");
assert_eq!(r.edge_type, "DESCRIBED_IN");
}
}