(&self, source_id: usize, query: &str)
| 613 | } |
| 614 | |
| 615 | fn resolve_service(&self, source_id: usize, query: &str) -> Result<&ServiceInfo> { |
| 616 | let normalized = query.trim_start_matches('.').to_string(); |
| 617 | if let Some(&idx) = self.service_by_full_name.get(&normalized) { |
| 618 | let service = &self.services[idx]; |
| 619 | if service.source_id == source_id { |
| 620 | return Ok(service); |
| 621 | } |
| 622 | } |
| 623 | |
| 624 | let matches = self |
| 625 | .service_by_simple_name |
| 626 | .get(query) |
| 627 | .into_iter() |
| 628 | .flatten() |
| 629 | .filter_map(|idx| { |
| 630 | let service = &self.services[*idx]; |
| 631 | (service.source_id == source_id).then_some(service) |
| 632 | }) |
| 633 | .collect::<Vec<_>>(); |
| 634 | |
| 635 | match matches.as_slice() { |
| 636 | [service] => Ok(service), |
| 637 | [] => bail!("service {} not found in descriptor {}", query, source_id), |
| 638 | _ => bail!( |
| 639 | "service name {} is ambiguous, please use the fully qualified name", |
| 640 | query |
| 641 | ), |
| 642 | } |
| 643 | } |
| 644 | |
| 645 | fn message(&self, name: &str) -> Option<&MessageInfo> { |
| 646 | self.messages.get(name) |
no test coverage detected