use serde::{Deserialize, Serialize};
use crate::node::{NodeId, Span};
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
pub enum Relation {
Calls,
Uses,
Imports,
Contains,
Implements,
Extends,
}
impl Relation {
pub fn as_str(self) -> &'static str {
match self {
Self::Calls => "calls",
Self::Uses => "uses",
Self::Imports => "imports",
Self::Contains => "contains",
Self::Implements => "implements",
Self::Extends => "extends",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
pub enum Evidence {
Structural,
Scope,
Import,
Scip,
Declared,
Dynamic,
}
impl Evidence {
pub fn as_str(self) -> &'static str {
match self {
Self::Structural => "structural",
Self::Scope => "scope",
Self::Import => "import",
Self::Scip => "scip",
Self::Declared => "declared",
Self::Dynamic => "dynamic",
}
}
pub fn confidence(self) -> Confidence {
match self {
Self::Structural | Self::Scip | Self::Declared => Confidence::Certain,
Self::Scope | Self::Import | Self::Dynamic => Confidence::Inferred,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
pub enum Confidence {
Certain,
Inferred,
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
pub struct Edge {
pub src: NodeId,
pub dst: NodeId,
pub relation: Relation,
pub evidence: Evidence,
pub confidence: Confidence,
pub site: Option<Span>,
}
impl Edge {
pub fn identity(&self) -> (&NodeId, &NodeId, Relation, Evidence, Confidence) {
(
&self.src,
&self.dst,
self.relation,
self.evidence,
self.confidence,
)
}
}