use std::sync::Arc;
use pedant_types::{Language, SourceSpan};
use serde::Serialize;
use crate::id::GraphNodeId;
#[derive(Serialize, Clone, Debug, PartialEq, Eq)]
#[serde(tag = "category", rename_all = "snake_case")]
pub enum GraphNodeKind {
File,
Container {
level: Arc<str>,
},
Function {
declaration: Arc<str>,
},
Type {
declaration: Arc<str>,
},
Value {
declaration: Arc<str>,
},
}
#[derive(Serialize, Clone, Debug, PartialEq, Eq)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum GraphNodeLocation {
File {
path: Arc<str>,
},
Span {
file: GraphNodeId,
span: SourceSpan,
},
}
#[derive(Serialize, Clone, Debug, PartialEq, Eq)]
pub struct GraphNode {
id: GraphNodeId,
language: Language,
name: Arc<str>,
kind: GraphNodeKind,
location: Option<GraphNodeLocation>,
}
pub(crate) struct NodeDraft {
pub(crate) language: Language,
pub(crate) name: Arc<str>,
pub(crate) kind: GraphNodeKind,
pub(crate) location: Option<GraphNodeLocation>,
}
impl GraphNode {
pub(crate) fn new(id: GraphNodeId, draft: NodeDraft) -> Self {
Self {
id,
language: draft.language,
name: draft.name,
kind: draft.kind,
location: draft.location,
}
}
pub fn id(&self) -> GraphNodeId {
self.id
}
pub fn language(&self) -> Language {
self.language
}
pub fn name(&self) -> &str {
&self.name
}
pub fn kind(&self) -> &GraphNodeKind {
&self.kind
}
pub fn location(&self) -> Option<&GraphNodeLocation> {
self.location.as_ref()
}
}