1#![allow(dead_code)]
52
53use schemars::JsonSchema;
54use serde::{Deserialize, Serialize};
55
56#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
58pub struct SourceLocation {
59 pub file: String,
60 pub line: u32,
61 pub column: u32,
62 pub end_line: Option<u32>,
63 pub end_column: Option<u32>,
64}
65
66impl SourceLocation {
67 pub fn single_point(file: impl Into<String>, line: u32, column: u32) -> Self {
68 Self {
69 file: file.into(),
70 line,
71 column,
72 end_line: None,
73 end_column: None,
74 }
75 }
76}
77
78#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)]
80pub struct ItemDoc {
81 pub path: String,
82 pub kind: String,
83 pub rendered_markdown: String,
84 pub source_location: Option<SourceLocation>,
85 pub visibility: String,
86 pub attributes: Vec<String>,
87 pub signature: Option<String>,
88 pub examples: Vec<String>,
89 pub see_also: Vec<String>,
90}
91
92#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)]
94pub struct ImplItem {
95 pub name: String,
96 pub kind: String,
97 pub signature: Option<String>,
98 pub doc: Option<String>,
99 pub source_location: Option<SourceLocation>,
100}
101
102#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)]
104pub struct TraitImpl {
105 pub for_type: String,
106 pub trait_path: String,
107 pub generics: Vec<String>,
108 pub where_clause: Option<String>,
109 pub source_span: Option<SourceLocation>,
110 pub impl_id: String,
111 pub items: Vec<ImplItem>,
112 pub is_blanket: bool,
113 pub is_synthetic: bool,
114}
115
116#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)]
118pub struct TypeImpl {
119 pub trait_path: String,
120 pub generics: Vec<String>,
121 pub where_clause: Option<String>,
122 pub source_span: Option<SourceLocation>,
123 pub impl_id: String,
124 pub items: Vec<ImplItem>,
125 pub is_blanket: bool,
126 pub is_synthetic: bool,
127}
128
129#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)]
131pub struct SearchIndexItem {
132 pub name: String,
133 pub kind: String,
134 pub path: String,
135 pub description: String,
136 pub parent_index: Option<usize>,
137}
138
139#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)]
141pub struct SearchIndexData {
142 pub crate_name: String,
143 pub version: String,
144 pub items: Vec<SearchIndexItem>,
145 pub paths: Vec<String>,
146}
147
148#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)]
150pub struct SymbolSearchResult {
151 pub path: String,
152 pub kind: String,
153 pub score: f32,
154 pub doc_summary: Option<String>,
155 pub source_location: Option<SourceLocation>,
156 pub visibility: String,
157 pub signature: Option<String>,
158 pub module_path: String,
159}
160
161#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)]
163pub struct SemanticSearchResult {
164 pub language: String,
165 pub package: String,
166 pub module_path: String,
167 pub item_name: String,
168 pub qualified_path: String,
169 pub kind: String,
170 pub file: String,
171 pub line: u32,
172 pub score: f32,
173 pub doc_preview: Option<String>,
174 pub signature: Option<String>,
175 pub source_preview: Option<String>,
176}
177
178#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq)]
180pub struct SourceSnippet {
181 pub code: String,
182 pub file: String,
183 pub line_start: u32,
184 pub line_end: u32,
185 pub context_lines: u32,
186 pub highlighted_line: Option<u32>,
187 pub language: String,
188}
189
190#[non_exhaustive]
192#[derive(Debug, thiserror::Error)]
193pub enum SharedTypeError {
194 #[error("Conversion failure: {0}")]
195 Conversion(String),
196}
197
198pub type SharedResult<T> = Result<T, SharedTypeError>;
199
200pub trait TryIntoShared<T> {
205 fn try_into_shared(self) -> SharedResult<T>;
206}
207
208pub trait TryFromShared<T> {
211 fn try_from_shared(value: T) -> SharedResult<Self>
212 where
213 Self: Sized;
214}
215
216macro_rules! impl_identity_shared {
219 ($($ty:ty),* $(,)?) => {
220 $(
221 impl TryIntoShared<$ty> for $ty {
222 fn try_into_shared(self) -> SharedResult<$ty> { Ok(self) }
223 }
224 impl TryFromShared<$ty> for $ty {
225 fn try_from_shared(value: $ty) -> SharedResult<Self> { Ok(value) }
226 }
227 )*
228 };
229}
230impl_identity_shared!(
231 SourceLocation,
232 ItemDoc,
233 ImplItem,
234 TraitImpl,
235 TypeImpl,
236 SearchIndexItem,
237 SearchIndexData,
238 SymbolSearchResult,
239 SemanticSearchResult,
240 SourceSnippet
241);
242
243pub fn map_vec_try_into<S, T, I>(iter: I) -> SharedResult<Vec<T>>
245where
246 I: IntoIterator<Item = S>,
247 S: TryIntoShared<T>,
248{
249 iter.into_iter()
250 .map(|s| s.try_into_shared())
251 .collect::<SharedResult<Vec<T>>>()
252}
253
254pub fn backfill_doc_summary(target: &mut SymbolSearchResult, fallback: &SymbolSearchResult) {
257 if target.doc_summary.is_none() && fallback.doc_summary.is_some() {
258 target.doc_summary = fallback.doc_summary.clone();
259 }
260}