use crate::{EdgeRelation, EndpointKind};
pub fn endpoint_matches(
spec: &EndpointKind,
substrate: &str,
kind: &str,
entity_type: Option<&str>,
) -> bool {
match spec {
EndpointKind::EntityOfKind(k) => substrate == "entity" && *k == kind,
EndpointKind::NoteOfKind(k) => substrate == "note" && *k == kind,
EndpointKind::EntityOfType {
kind: k,
entity_type: t,
} => substrate == "entity" && *k == kind && entity_type == Some(*t),
}
}
pub const BASE_ENTITY_ENDPOINT_RULES: &[(&str, EdgeRelation, &str)] = &[
("concept", EdgeRelation::Contains, "concept"),
("project", EdgeRelation::Contains, "project"),
("project", EdgeRelation::Contains, "artifact"),
("org", EdgeRelation::Contains, "project"),
("org", EdgeRelation::Contains, "service"),
("concept", EdgeRelation::PartOf, "concept"),
("project", EdgeRelation::PartOf, "project"),
("project", EdgeRelation::PartOf, "org"),
("*", EdgeRelation::InstanceOf, "concept"),
("service", EdgeRelation::InstanceOf, "project"),
("document", EdgeRelation::LinksTo, "document"),
("concept", EdgeRelation::LocatedIn, "concept"),
("org", EdgeRelation::LocatedIn, "concept"),
("person", EdgeRelation::Owns, "org"),
("org", EdgeRelation::Owns, "org"),
("concept", EdgeRelation::Extends, "concept"),
("concept", EdgeRelation::VariantOf, "concept"),
("artifact", EdgeRelation::VariantOf, "artifact"),
("concept", EdgeRelation::IntroducedBy, "document"),
("concept", EdgeRelation::IntroducedBy, "person"),
("artifact", EdgeRelation::IntroducedBy, "document"),
("project", EdgeRelation::IntroducedBy, "document"),
("service", EdgeRelation::IntroducedBy, "document"),
("document", EdgeRelation::IntroducedBy, "person"),
("document", EdgeRelation::IntroducedBy, "org"),
("concept", EdgeRelation::IntroducedBy, "org"),
("artifact", EdgeRelation::DerivedFrom, "dataset"),
("artifact", EdgeRelation::DerivedFrom, "document"),
("artifact", EdgeRelation::DerivedFrom, "project"),
("artifact", EdgeRelation::DerivedFrom, "artifact"),
("document", EdgeRelation::DerivedFrom, "document"),
("document", EdgeRelation::Precedes, "document"),
("dataset", EdgeRelation::Precedes, "dataset"),
("artifact", EdgeRelation::Precedes, "artifact"),
("service", EdgeRelation::Precedes, "service"),
("project", EdgeRelation::Precedes, "project"),
("project", EdgeRelation::DependsOn, "project"),
("service", EdgeRelation::DependsOn, "project"),
("service", EdgeRelation::DependsOn, "service"),
("service", EdgeRelation::DependsOn, "artifact"),
("service", EdgeRelation::DependsOn, "dataset"),
("artifact", EdgeRelation::DependsOn, "project"),
("artifact", EdgeRelation::DependsOn, "service"),
("document", EdgeRelation::DependsOn, "document"),
("concept", EdgeRelation::Enables, "concept"),
("service", EdgeRelation::Enables, "concept"),
("dataset", EdgeRelation::Enables, "concept"),
("project", EdgeRelation::Implements, "concept"),
("service", EdgeRelation::Implements, "concept"),
("concept", EdgeRelation::CompetesWith, "concept"),
("project", EdgeRelation::CompetesWith, "project"),
("service", EdgeRelation::CompetesWith, "service"),
("org", EdgeRelation::CompetesWith, "org"),
("concept", EdgeRelation::ComposedWith, "concept"),
("project", EdgeRelation::ComposedWith, "project"),
("concept", EdgeRelation::Supersedes, "concept"),
("document", EdgeRelation::Supersedes, "document"),
("artifact", EdgeRelation::Supersedes, "artifact"),
("service", EdgeRelation::Supersedes, "service"),
("dataset", EdgeRelation::Supersedes, "dataset"),
("concept", EdgeRelation::Supports, "concept"),
("document", EdgeRelation::Supports, "concept"),
("dataset", EdgeRelation::Supports, "concept"),
("artifact", EdgeRelation::Supports, "concept"),
("concept", EdgeRelation::Refutes, "concept"),
("document", EdgeRelation::Refutes, "concept"),
("dataset", EdgeRelation::Refutes, "concept"),
("artifact", EdgeRelation::Refutes, "concept"),
];
pub fn base_entity_endpoint_rules() -> &'static [(&'static str, EdgeRelation, &'static str)] {
BASE_ENTITY_ENDPOINT_RULES
}
pub fn base_entity_rule_allows(src_kind: &str, relation: EdgeRelation, tgt_kind: &str) -> bool {
BASE_ENTITY_ENDPOINT_RULES.iter().any(|(src, rel, tgt)| {
*rel == relation && (*src == "*" || *src == src_kind) && *tgt == tgt_kind
})
}