use std::sync::Arc;
use pedant_types::{Language, ResolutionGap, SourceSpan};
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 GraphReferenceKind {
Call,
Import,
Implementation,
Reference,
}
#[derive(Serialize, Clone, Debug, PartialEq, Eq)]
pub struct GraphReference {
id: GraphReferenceId,
source: GraphNodeId,
language: Language,
kind: GraphReferenceKind,
text: Arc<str>,
span: SourceSpan,
gaps: Box<[ResolutionGap]>,
edges: Box<[GraphEdgeId]>,
}
pub(crate) struct ReferenceDraft {
pub(crate) source: GraphNodeId,
pub(crate) language: Language,
pub(crate) kind: GraphReferenceKind,
pub(crate) text: Arc<str>,
pub(crate) span: SourceSpan,
pub(crate) gaps: Box<[ResolutionGap]>,
}
impl GraphReference {
pub(crate) fn new(
id: GraphReferenceId,
draft: ReferenceDraft,
edges: Box<[GraphEdgeId]>,
) -> Self {
Self {
id,
source: draft.source,
language: draft.language,
kind: draft.kind,
text: draft.text,
span: draft.span,
gaps: draft.gaps,
edges,
}
}
pub fn id(&self) -> GraphReferenceId {
self.id
}
pub fn source(&self) -> GraphNodeId {
self.source
}
pub fn language(&self) -> Language {
self.language
}
pub fn kind(&self) -> GraphReferenceKind {
self.kind
}
pub fn text(&self) -> &str {
&self.text
}
pub fn span(&self) -> &SourceSpan {
&self.span
}
pub fn gaps(&self) -> &[ResolutionGap] {
&self.gaps
}
pub fn edges(&self) -> &[GraphEdgeId] {
&self.edges
}
}