use std::sync::Arc;
use serde::Serialize;
use crate::id::{GraphEdgeId, GraphNodeId, GraphReferenceId};
#[derive(Serialize, Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[serde(rename_all = "snake_case")]
pub enum GraphEdgeKind {
Call,
Import,
Implementation,
Reference,
DependsOn,
}
#[derive(Serialize, Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[serde(rename_all = "snake_case")]
pub enum GraphCertainty {
Resolved,
Possible,
}
#[derive(Serialize, Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[serde(rename_all = "snake_case")]
pub enum GraphDependencyKind {
Normal,
Development,
Build,
}
#[derive(Serialize, Clone, Debug, PartialEq, Eq)]
pub struct DependencyEvidence {
alias: Arc<str>,
kind: GraphDependencyKind,
predicate: Option<Arc<str>>,
}
impl DependencyEvidence {
pub(crate) fn new(
alias: Arc<str>,
kind: GraphDependencyKind,
predicate: Option<Arc<str>>,
) -> Self {
Self {
alias,
kind,
predicate,
}
}
pub fn alias(&self) -> &str {
&self.alias
}
pub fn kind(&self) -> GraphDependencyKind {
self.kind
}
pub fn predicate(&self) -> Option<&str> {
self.predicate.as_deref()
}
}
#[derive(Serialize, Clone, Debug, PartialEq, Eq)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum GraphEdgeOrigin {
Reference {
reference: GraphReferenceId,
},
Dependency {
evidence: DependencyEvidence,
},
}
#[derive(Serialize, Clone, Debug, PartialEq, Eq)]
pub struct GraphEdge {
id: GraphEdgeId,
source: GraphNodeId,
target: GraphNodeId,
kind: GraphEdgeKind,
certainty: GraphCertainty,
origin: GraphEdgeOrigin,
}
pub(crate) struct EdgeDraft {
pub(crate) source: GraphNodeId,
pub(crate) target: GraphNodeId,
pub(crate) kind: GraphEdgeKind,
pub(crate) certainty: GraphCertainty,
pub(crate) origin: GraphEdgeOrigin,
}
impl GraphEdge {
pub(crate) fn new(id: GraphEdgeId, draft: EdgeDraft) -> Self {
Self {
id,
source: draft.source,
target: draft.target,
kind: draft.kind,
certainty: draft.certainty,
origin: draft.origin,
}
}
pub fn id(&self) -> GraphEdgeId {
self.id
}
pub fn source(&self) -> GraphNodeId {
self.source
}
pub fn target(&self) -> GraphNodeId {
self.target
}
pub fn kind(&self) -> GraphEdgeKind {
self.kind
}
pub fn certainty(&self) -> GraphCertainty {
self.certainty
}
pub fn origin(&self) -> &GraphEdgeOrigin {
&self.origin
}
}