MCPcopy Create free account
hub / github.com/hashintel/hash / resolve_impl

Method resolve_impl

libs/@local/hashql/core/src/module/resolver.rs:190–255  ·  view source on GitHub ↗
(
        &self,
        query: impl IntoIterator<Item = Symbol<'heap>>,
        mut module: Module<'heap>,
    )

Source from the content-addressed store, hash-verified

188
189 #[define_opaque(ModuleItemIterator)]
190 fn resolve_impl(
191 &self,
192 query: impl IntoIterator<Item = Symbol<'heap>>,
193 mut module: Module<'heap>,
194 ) -> Result<ResolveIter<'heap>, ResolutionError<'heap>> {
195 let mut query = query.into_iter().enumerate().peekable();
196
197 // In case that we're in glob mode and the query is empty (which is only valid in glob
198 // mode), return all items
199 if query.peek().is_none() && self.options.mode == ResolverMode::Glob {
200 if module.items.is_empty() {
201 return Err(ResolutionError::ModuleEmpty { depth: 0 });
202 }
203
204 return Ok(ResolveIter::Glob(
205 module.items.into_iter().copied().map(Reference::Item),
206 ));
207 }
208
209 // Traverse the entry until we're at the last item
210 let (depth, name) = loop {
211 let Some((mut depth, name)) = query.next() else {
212 return Err(ResolutionError::InvalidQueryLength { expected: 2 });
213 };
214
215 // We start at 1, because the entry (the one we're starting at) is selected by the user
216 depth += 1;
217
218 if query.peek().is_none() {
219 // The last item is the entry we're trying to resolve to
220 break (depth, name);
221 }
222
223 let Some(&item) = module.items.iter().find(|item| item.name == name) else {
224 return Err(ResolutionError::ModuleNotFound {
225 depth,
226 name,
227 suggestions: self.suggest(|| {
228 module.suggestions(|item| matches!(item.kind, ItemKind::Module(_)))
229 }),
230 });
231 };
232
233 // Because we're not at the last item, the item needs to be a module
234 let ItemKind::Module(next) = item.kind else {
235 return Err(ResolutionError::ModuleRequired {
236 depth,
237 found: item.kind.universe(),
238 });
239 };
240
241 module = self.registry.modules.index(next);
242 };
243
244 match self.options.mode {
245 ResolverMode::Single(universe) => self
246 .resolve_single(module, universe, name, depth)
247 .map(ResolveIter::Single),

Callers 2

resolve_absoluteMethod · 0.80
resolve_relativeMethod · 0.80

Calls 15

ErrInterface · 0.85
OkInterface · 0.85
GlobClass · 0.85
suggestMethod · 0.80
suggestionsMethod · 0.80
resolve_singleMethod · 0.80
resolve_multiMethod · 0.80
resolve_globMethod · 0.80
into_iterMethod · 0.45
peekMethod · 0.45
is_emptyMethod · 0.45
mapMethod · 0.45

Tested by

no test coverage detected