#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) enum NodeKind {
Crate,
Module,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) enum Visibility {
Public,
Crate,
Super,
Private,
Restricted { path: String },
}
impl Visibility {
pub(crate) fn as_str(&self) -> &str {
match self {
Visibility::Public => "public",
Visibility::Crate => "crate",
Visibility::Super => "super",
Visibility::Private => "private",
Visibility::Restricted { path } => path.as_str(),
}
}
}
pub(crate) type NodeId = String;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum EdgeKind {
Contains,
Uses,
Reexports,
Super,
}
#[derive(Debug, Clone)]
pub(crate) struct Node {
pub id: NodeId,
pub kind: NodeKind,
pub name: String,
pub path: String,
pub parent: Option<NodeId>,
pub external: Option<bool>,
pub version: Option<String>,
pub visibility: Option<Visibility>,
pub loc: Option<u32>,
pub line: Option<u32>,
pub item_count: Option<u32>,
pub crate_label: Option<String>,
}
#[derive(Debug, Clone)]
pub(crate) struct Edge {
pub from: NodeId,
pub to: NodeId,
pub kind: EdgeKind,
pub visibility: Option<Visibility>,
pub line: Option<u32>,
}
#[derive(Debug, Default)]
pub(crate) struct InternalGraph {
pub nodes: Vec<Node>,
pub edges: Vec<Edge>,
}
#[derive(Debug, Default)]
pub(crate) struct GraphBuilder {
graph: InternalGraph,
}
impl GraphBuilder {
pub(crate) fn new() -> Self {
Self::default()
}
pub(crate) fn add_node(&mut self, node: Node) {
self.graph.nodes.push(node);
}
pub(crate) fn add_edge(&mut self, edge: Edge) {
self.graph.edges.push(edge);
}
pub(crate) fn nodes_mut(&mut self) -> &mut Vec<Node> {
&mut self.graph.nodes
}
pub(crate) fn build(self) -> InternalGraph {
self.graph
}
}