Skip to main content

ucp_codegraph/programmatic/
types.rs

1use serde::{Deserialize, Serialize};
2use ucm_core::BlockId;
3
4use crate::{
5    CodeGraphCoderef, CodeGraphContextUpdate, CodeGraphDetailLevel, CodeGraphSelectionOrigin,
6};
7
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
9#[serde(rename_all = "snake_case")]
10pub enum CodeGraphExpandMode {
11    File,
12    Dependencies,
13    Dependents,
14}
15
16#[derive(Debug, Clone, Default, Serialize, Deserialize)]
17pub struct CodeGraphFindQuery {
18    #[serde(default, skip_serializing_if = "Option::is_none")]
19    pub node_class: Option<String>,
20    #[serde(default, skip_serializing_if = "Option::is_none")]
21    pub name_regex: Option<String>,
22    #[serde(default, skip_serializing_if = "Option::is_none")]
23    pub path_regex: Option<String>,
24    #[serde(default, skip_serializing_if = "Option::is_none")]
25    pub logical_key_regex: Option<String>,
26    #[serde(default)]
27    pub case_sensitive: bool,
28    #[serde(default, skip_serializing_if = "Option::is_none")]
29    pub exported: Option<bool>,
30    #[serde(default, skip_serializing_if = "Option::is_none")]
31    pub limit: Option<usize>,
32}
33
34#[derive(Debug, Clone, Serialize, Deserialize)]
35pub struct CodeGraphNodeSummary {
36    pub block_id: BlockId,
37    pub node_class: String,
38    pub label: String,
39    #[serde(default, skip_serializing_if = "Option::is_none")]
40    pub logical_key: Option<String>,
41    #[serde(default, skip_serializing_if = "Option::is_none")]
42    pub symbol_name: Option<String>,
43    #[serde(default, skip_serializing_if = "Option::is_none")]
44    pub path: Option<String>,
45    pub exported: bool,
46    #[serde(default, skip_serializing_if = "Option::is_none")]
47    pub coderef: Option<CodeGraphCoderef>,
48}
49
50#[derive(Debug, Clone, Serialize, Deserialize)]
51pub struct CodeGraphPathHop {
52    pub from: BlockId,
53    pub to: BlockId,
54    pub relation: String,
55    pub direction: String,
56}
57
58#[derive(Debug, Clone, Serialize, Deserialize)]
59pub struct CodeGraphPathResult {
60    pub start: CodeGraphNodeSummary,
61    pub end: CodeGraphNodeSummary,
62    #[serde(default)]
63    pub hops: Vec<CodeGraphPathHop>,
64}
65
66#[derive(Debug, Clone, Serialize, Deserialize)]
67pub struct CodeGraphSelectionExplanation {
68    pub block_id: BlockId,
69    pub selected: bool,
70    pub focus: bool,
71    pub pinned: bool,
72    #[serde(default, skip_serializing_if = "Option::is_none")]
73    pub detail_level: Option<CodeGraphDetailLevel>,
74    #[serde(default, skip_serializing_if = "Option::is_none")]
75    pub origin: Option<CodeGraphSelectionOrigin>,
76    pub explanation: String,
77    #[serde(default, skip_serializing_if = "Option::is_none")]
78    pub node: Option<CodeGraphNodeSummary>,
79    #[serde(default, skip_serializing_if = "Option::is_none")]
80    pub anchor: Option<CodeGraphNodeSummary>,
81}
82
83#[derive(Debug, Clone, Serialize, Deserialize)]
84pub struct CodeGraphSessionDiff {
85    #[serde(default)]
86    pub added: Vec<CodeGraphNodeSummary>,
87    #[serde(default)]
88    pub removed: Vec<CodeGraphNodeSummary>,
89    #[serde(default, skip_serializing_if = "Option::is_none")]
90    pub focus_before: Option<BlockId>,
91    #[serde(default, skip_serializing_if = "Option::is_none")]
92    pub focus_after: Option<BlockId>,
93    pub changed_focus: bool,
94}
95
96#[derive(Debug, Clone, Serialize, Deserialize)]
97pub struct CodeGraphRecommendedActionsResult {
98    #[serde(default)]
99    pub applied_actions: Vec<String>,
100    pub update: CodeGraphContextUpdate,
101}