(&mut self, m_spec: &str, name: &str)
| 93 | |
| 94 | #[allow(clippy::type_complexity)] |
| 95 | fn lookup_in_manifest(&mut self, m_spec: &str, name: &str) -> Result<Option<(Option<String>, Option<String>)>, String> { |
| 96 | if let Some(hit) = with_runtime(|rt| { |
| 97 | rt.manifests.iter() |
| 98 | .find(|(s, _)| s == m_spec) |
| 99 | .map(|(_, m)| (m.imports.iter().find(|(k, _)| k == name).map(|(_, v)| v.clone()), m.extends.clone())) |
| 100 | }) { |
| 101 | return Ok(Some(hit)); |
| 102 | } |
| 103 | // Walk-up fetch, manifests aren't pinned by URL fragment, so no hash. |
| 104 | let bytes = match self.fetch_bytes(m_spec, None) { |
| 105 | Ok(b) => b, |
| 106 | Err(_) => return Ok(None), |
| 107 | }; |
| 108 | let parsed = parse_manifest(&bytes).map_err(|e| s!("packages.json at '", str m_spec, "': ", str &e))?; |
| 109 | let target = parsed.imports.iter().find(|(k, _)| k == name).map(|(_, v)| v.clone()); |
| 110 | let ext = parsed.extends.clone(); |
| 111 | with_runtime(|rt| rt.manifests.push((m_spec.to_string(), parsed))); |
| 112 | Ok(Some((target, ext))) |
| 113 | } |
| 114 | |
| 115 | fn resolve_canonical(&self, spec: &str) -> Result<Resolved, String> { |
| 116 | let entry = with_runtime(|rt| { |
no test coverage detected