use serde::{Deserialize, Serialize};
use super::{ByteSpan, OccurrenceRole, SemanticEdgeKind, SymbolAnchor};
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum SemanticGraphQueryKind {
RefsOf,
CallersOf,
ImportersOf,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SemanticGraphRef {
pub source_path: String,
pub source_occurrence: u32,
pub name: String,
pub role: Option<OccurrenceRole>,
pub kind: SemanticEdgeKind,
pub span: Option<ByteSpan>,
pub target: SymbolAnchor,
pub target_definition: u32,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SemanticGraphQueryRequest {
pub state_id: String,
pub kind: SemanticGraphQueryKind,
pub anchor: Option<SymbolAnchor>,
pub path: Option<String>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SemanticGraphQueryResponse {
pub state_id: String,
pub kind: SemanticGraphQueryKind,
pub anchor: Option<SymbolAnchor>,
pub path: Option<String>,
pub index_present: bool,
pub refs: Vec<SemanticGraphRef>,
pub importers: Vec<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn query_envelope_roundtrips_named_json() {
let request = SemanticGraphQueryRequest {
state_id: "hs-1".to_string(),
kind: SemanticGraphQueryKind::RefsOf,
anchor: Some(SymbolAnchor::new("src/api.rs", "greet")),
path: None,
};
let json = serde_json::to_string(&request).unwrap();
assert!(json.contains("\"refs_of\""));
assert_eq!(
serde_json::from_str::<SemanticGraphQueryRequest>(&json).unwrap(),
request
);
}
}