Skip to main content

buntrail_engine/remote/
search.rs

1use super::*;
2impl SearchService for RemoteServices {
3    fn search(
4        &self,
5        r: SearchRequest,
6    ) -> ServiceFuture<'_, Result<EventStream<SearchEvent>, CoreError>> {
7        Box::pin(async move {
8            self.check(&r.root.target)?;
9            Ok(Box::pin(Search {
10                source: self.stream(
11                    w::Call::Search {
12                        request: w::Search::from_core(&r)?,
13                    },
14                    None,
15                )?,
16                target: self.target.clone(),
17            }) as EventStream<SearchEvent>)
18        })
19    }
20}
21struct Search {
22    source: Replies,
23    target: TargetIdentity,
24}
25impl Stream for Search {
26    type Item = Result<SearchEvent, CoreError>;
27    fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
28        let result = Pin::new(&mut self.source).poll_next(cx);
29        result.map(|v| {
30            v.map(|r| {
31                let r = match r {
32                    Ok(r) => r,
33                    Err(e) => return Ok(SearchEvent::Failed(e)),
34                };
35                Ok(match r {
36                    w::Reply::SearchMatch {
37                        file,
38                        line,
39                        column_utf8,
40                        preview,
41                        version,
42                        digest,
43                    } => SearchEvent::Match(Box::new(SearchMatch {
44                        file: file.core(&self.target)?,
45                        line,
46                        preview_column_utf8: column_utf8,
47                        preview,
48                        searched_version: version.core(&self.target)?,
49                        searched_digest: w::digest(&digest)?,
50                    })),
51                    w::Reply::SearchProgress { files, matches } => {
52                        SearchEvent::Progress { files, matches }
53                    }
54                    w::Reply::SearchComplete => SearchEvent::Complete,
55                    w::Reply::SearchCancelled => SearchEvent::Cancelled,
56                    w::Reply::SearchLimited { maximum } => SearchEvent::Limited { maximum },
57                    _ => return Err(w::invalid()),
58                })
59            })
60        })
61    }
62}