Skip to main content

docx_store/
models.rs

1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3
4/// Project metadata tracked by the ingestion pipeline.
5#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
6pub struct Project {
7    #[serde(default, skip_deserializing, skip_serializing_if = "Option::is_none")]
8    pub id: Option<String>,
9    pub project_id: String,
10    #[serde(skip_serializing_if = "Option::is_none")]
11    pub name: Option<String>,
12    #[serde(skip_serializing_if = "Option::is_none")]
13    pub language: Option<String>,
14    #[serde(skip_serializing_if = "Option::is_none")]
15    pub root_path: Option<String>,
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub description: Option<String>,
18    #[serde(default, skip_serializing_if = "Vec::is_empty")]
19    pub aliases: Vec<String>,
20    #[serde(skip_serializing_if = "Option::is_none")]
21    pub search_text: Option<String>,
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub extra: Option<Value>,
24}
25
26/// Metadata describing an ingestion run.
27#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
28pub struct Ingest {
29    #[serde(default, skip_serializing_if = "Option::is_none")]
30    pub id: Option<String>,
31    pub project_id: String,
32    #[serde(skip_serializing_if = "Option::is_none")]
33    pub git_commit: Option<String>,
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub git_branch: Option<String>,
36    #[serde(skip_serializing_if = "Option::is_none")]
37    pub git_tag: Option<String>,
38    #[serde(skip_serializing_if = "Option::is_none")]
39    pub project_version: Option<String>,
40    #[serde(skip_serializing_if = "Option::is_none")]
41    pub source_modified_at: Option<String>,
42    #[serde(skip_serializing_if = "Option::is_none")]
43    pub ingested_at: Option<String>,
44    #[serde(skip_serializing_if = "Option::is_none")]
45    pub extra: Option<Value>,
46}
47
48/// Metadata describing the source document for an ingest.
49#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
50pub struct DocSource {
51    #[serde(default, skip_serializing_if = "Option::is_none")]
52    pub id: Option<String>,
53    pub project_id: String,
54    #[serde(skip_serializing_if = "Option::is_none")]
55    pub ingest_id: Option<String>,
56    #[serde(skip_serializing_if = "Option::is_none")]
57    pub language: Option<String>,
58    #[serde(skip_serializing_if = "Option::is_none")]
59    pub source_kind: Option<String>,
60    #[serde(skip_serializing_if = "Option::is_none")]
61    pub path: Option<String>,
62    #[serde(skip_serializing_if = "Option::is_none")]
63    pub tool_version: Option<String>,
64    #[serde(skip_serializing_if = "Option::is_none")]
65    pub hash: Option<String>,
66    #[serde(skip_serializing_if = "Option::is_none")]
67    pub source_modified_at: Option<String>,
68    #[serde(skip_serializing_if = "Option::is_none")]
69    pub extra: Option<Value>,
70}
71
72/// Canonical symbol record produced during ingestion.
73#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
74pub struct Symbol {
75    #[serde(default, skip_deserializing, skip_serializing_if = "Option::is_none")]
76    pub id: Option<String>,
77    pub project_id: String,
78    #[serde(skip_serializing_if = "Option::is_none")]
79    pub language: Option<String>,
80    pub symbol_key: String,
81    #[serde(skip_serializing_if = "Option::is_none")]
82    pub kind: Option<String>,
83    #[serde(skip_serializing_if = "Option::is_none")]
84    pub name: Option<String>,
85    #[serde(skip_serializing_if = "Option::is_none")]
86    pub qualified_name: Option<String>,
87    #[serde(skip_serializing_if = "Option::is_none")]
88    pub display_name: Option<String>,
89    #[serde(skip_serializing_if = "Option::is_none")]
90    pub signature: Option<String>,
91    #[serde(skip_serializing_if = "Option::is_none")]
92    pub signature_hash: Option<String>,
93    #[serde(skip_serializing_if = "Option::is_none")]
94    pub visibility: Option<String>,
95    #[serde(skip_serializing_if = "Option::is_none")]
96    pub is_static: Option<bool>,
97    #[serde(skip_serializing_if = "Option::is_none")]
98    pub is_async: Option<bool>,
99    #[serde(skip_serializing_if = "Option::is_none")]
100    pub is_const: Option<bool>,
101    #[serde(skip_serializing_if = "Option::is_none")]
102    pub is_deprecated: Option<bool>,
103    #[serde(skip_serializing_if = "Option::is_none")]
104    pub since: Option<String>,
105    #[serde(skip_serializing_if = "Option::is_none")]
106    pub stability: Option<String>,
107    #[serde(skip_serializing_if = "Option::is_none")]
108    pub source_path: Option<String>,
109    #[serde(skip_serializing_if = "Option::is_none")]
110    pub line: Option<u32>,
111    #[serde(skip_serializing_if = "Option::is_none")]
112    pub col: Option<u32>,
113    #[serde(skip_serializing_if = "Option::is_none")]
114    pub return_type: Option<TypeRef>,
115    #[serde(default, skip_serializing_if = "Vec::is_empty")]
116    pub params: Vec<Param>,
117    #[serde(default, skip_serializing_if = "Vec::is_empty")]
118    pub type_params: Vec<TypeParam>,
119    #[serde(default, skip_serializing_if = "Vec::is_empty")]
120    pub attributes: Vec<AttributeRef>,
121    #[serde(default, skip_serializing_if = "Vec::is_empty")]
122    pub source_ids: Vec<SourceId>,
123    #[serde(skip_serializing_if = "Option::is_none")]
124    pub doc_summary: Option<String>,
125    #[serde(skip_serializing_if = "Option::is_none")]
126    pub extra: Option<Value>,
127}
128
129/// Type reference used in symbols and documentation.
130#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
131pub struct TypeRef {
132    #[serde(skip_serializing_if = "Option::is_none")]
133    pub display: Option<String>,
134    #[serde(skip_serializing_if = "Option::is_none")]
135    pub canonical: Option<String>,
136    #[serde(skip_serializing_if = "Option::is_none")]
137    pub language: Option<String>,
138    #[serde(skip_serializing_if = "Option::is_none")]
139    pub symbol_key: Option<String>,
140    #[serde(default, skip_serializing_if = "Vec::is_empty")]
141    pub generics: Vec<Self>,
142    #[serde(default, skip_serializing_if = "Vec::is_empty")]
143    pub modifiers: Vec<String>,
144}
145
146/// Function or method parameter metadata.
147#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
148pub struct Param {
149    pub name: String,
150    #[serde(skip_serializing_if = "Option::is_none")]
151    pub type_ref: Option<TypeRef>,
152    #[serde(skip_serializing_if = "Option::is_none")]
153    pub default_value: Option<String>,
154    #[serde(skip_serializing_if = "Option::is_none")]
155    pub is_optional: Option<bool>,
156}
157
158/// Generic type parameter metadata.
159#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
160pub struct TypeParam {
161    pub name: String,
162    #[serde(default, skip_serializing_if = "Vec::is_empty")]
163    pub constraints: Vec<String>,
164}
165
166/// Attribute metadata captured from source (when available).
167#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
168pub struct AttributeRef {
169    pub name: String,
170    #[serde(default, skip_serializing_if = "Vec::is_empty")]
171    pub args: Vec<String>,
172    #[serde(skip_serializing_if = "Option::is_none")]
173    pub target: Option<String>,
174}
175
176/// External identifier that maps a symbol back to source.
177#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
178pub struct SourceId {
179    pub kind: String,
180    pub value: String,
181}
182
183/// Documentation block associated with a symbol.
184#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
185pub struct DocBlock {
186    #[serde(default, skip_deserializing, skip_serializing_if = "Option::is_none")]
187    pub id: Option<String>,
188    pub project_id: String,
189    #[serde(skip_serializing_if = "Option::is_none")]
190    pub ingest_id: Option<String>,
191    #[serde(skip_serializing_if = "Option::is_none")]
192    pub symbol_key: Option<String>,
193    #[serde(skip_serializing_if = "Option::is_none")]
194    pub language: Option<String>,
195    #[serde(skip_serializing_if = "Option::is_none")]
196    pub source_kind: Option<String>,
197    #[serde(skip_serializing_if = "Option::is_none")]
198    pub doc_hash: Option<String>,
199    #[serde(skip_serializing_if = "Option::is_none")]
200    pub summary: Option<String>,
201    #[serde(skip_serializing_if = "Option::is_none")]
202    pub remarks: Option<String>,
203    #[serde(skip_serializing_if = "Option::is_none")]
204    pub returns: Option<String>,
205    #[serde(skip_serializing_if = "Option::is_none")]
206    pub value: Option<String>,
207    #[serde(default, skip_serializing_if = "Vec::is_empty")]
208    pub params: Vec<DocParam>,
209    #[serde(default, skip_serializing_if = "Vec::is_empty")]
210    pub type_params: Vec<DocTypeParam>,
211    #[serde(default, skip_serializing_if = "Vec::is_empty")]
212    pub exceptions: Vec<DocException>,
213    #[serde(default, skip_serializing_if = "Vec::is_empty")]
214    pub examples: Vec<DocExample>,
215    #[serde(default, skip_serializing_if = "Vec::is_empty")]
216    pub notes: Vec<String>,
217    #[serde(default, skip_serializing_if = "Vec::is_empty")]
218    pub warnings: Vec<String>,
219    #[serde(skip_serializing_if = "Option::is_none")]
220    pub safety: Option<String>,
221    #[serde(skip_serializing_if = "Option::is_none")]
222    pub panics: Option<String>,
223    #[serde(skip_serializing_if = "Option::is_none")]
224    pub errors: Option<String>,
225    #[serde(default, skip_serializing_if = "Vec::is_empty")]
226    pub see_also: Vec<SeeAlso>,
227    #[serde(skip_serializing_if = "Option::is_none")]
228    pub deprecated: Option<String>,
229    #[serde(skip_serializing_if = "Option::is_none")]
230    pub inherit_doc: Option<DocInherit>,
231    #[serde(default, skip_serializing_if = "Vec::is_empty")]
232    pub sections: Vec<DocSection>,
233    #[serde(skip_serializing_if = "Option::is_none")]
234    pub raw: Option<String>,
235    #[serde(skip_serializing_if = "Option::is_none")]
236    pub extra: Option<Value>,
237}
238
239/// Parameter documentation entry.
240#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
241pub struct DocParam {
242    pub name: String,
243    #[serde(skip_serializing_if = "Option::is_none")]
244    pub description: Option<String>,
245    #[serde(skip_serializing_if = "Option::is_none")]
246    pub type_ref: Option<TypeRef>,
247}
248
249/// Type parameter documentation entry.
250#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
251pub struct DocTypeParam {
252    pub name: String,
253    #[serde(skip_serializing_if = "Option::is_none")]
254    pub description: Option<String>,
255}
256
257/// Exception documentation entry.
258#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
259pub struct DocException {
260    #[serde(skip_serializing_if = "Option::is_none")]
261    pub type_ref: Option<TypeRef>,
262    #[serde(skip_serializing_if = "Option::is_none")]
263    pub description: Option<String>,
264}
265
266/// Example documentation entry.
267#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
268pub struct DocExample {
269    #[serde(skip_serializing_if = "Option::is_none")]
270    pub lang: Option<String>,
271    #[serde(skip_serializing_if = "Option::is_none")]
272    pub code: Option<String>,
273    #[serde(skip_serializing_if = "Option::is_none")]
274    pub caption: Option<String>,
275}
276
277/// Link or cross-reference documentation entry.
278#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
279pub struct SeeAlso {
280    #[serde(skip_serializing_if = "Option::is_none")]
281    pub label: Option<String>,
282    pub target: String,
283    #[serde(skip_serializing_if = "Option::is_none")]
284    pub target_kind: Option<String>,
285}
286
287/// Documentation inheritance metadata.
288#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
289pub struct DocInherit {
290    #[serde(skip_serializing_if = "Option::is_none")]
291    pub cref: Option<String>,
292    #[serde(skip_serializing_if = "Option::is_none")]
293    pub path: Option<String>,
294}
295
296/// Additional documentation section not mapped to a known field.
297#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
298pub struct DocSection {
299    pub title: String,
300    pub body: String,
301}
302
303/// Chunked documentation text for embedding or search.
304#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
305pub struct DocChunk {
306    #[serde(default, skip_deserializing, skip_serializing_if = "Option::is_none")]
307    pub id: Option<String>,
308    pub project_id: String,
309    #[serde(skip_serializing_if = "Option::is_none")]
310    pub ingest_id: Option<String>,
311    #[serde(skip_serializing_if = "Option::is_none")]
312    pub symbol_key: Option<String>,
313    #[serde(skip_serializing_if = "Option::is_none")]
314    pub doc_block_id: Option<String>,
315    pub chunk_index: u32,
316    pub text: String,
317    #[serde(skip_serializing_if = "Option::is_none")]
318    pub token_count: Option<u32>,
319    #[serde(skip_serializing_if = "Option::is_none")]
320    pub embedding: Option<Vec<f32>>,
321    #[serde(skip_serializing_if = "Option::is_none")]
322    pub extra: Option<Value>,
323}
324
325/// Generic relation record for edges between entities.
326#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
327pub struct RelationRecord {
328    #[serde(default, skip_deserializing, skip_serializing_if = "Option::is_none")]
329    pub id: Option<String>,
330    #[serde(rename = "in")]
331    pub in_id: String,
332    #[serde(rename = "out")]
333    pub out_id: String,
334    pub project_id: String,
335    #[serde(skip_serializing_if = "Option::is_none")]
336    pub ingest_id: Option<String>,
337    #[serde(skip_serializing_if = "Option::is_none")]
338    pub kind: Option<String>,
339    #[serde(skip_serializing_if = "Option::is_none")]
340    pub extra: Option<Value>,
341}
342
343pub type ContainsEdge = RelationRecord;
344pub type MemberOfEdge = RelationRecord;
345pub type DocumentsEdge = RelationRecord;
346pub type ReferencesEdge = RelationRecord;
347pub type SeeAlsoEdge = RelationRecord;
348pub type InheritsEdge = RelationRecord;
349pub type ImplementsEdge = RelationRecord;
350pub type OverloadOfEdge = RelationRecord;
351pub type TypeOfEdge = RelationRecord;
352pub type ReturnsEdge = RelationRecord;
353pub type ParamTypeEdge = RelationRecord;
354pub type ObservedInEdge = RelationRecord;